当前位置:文档之家› C语言编写俄罗斯方块论文

C语言编写俄罗斯方块论文

俄罗斯方块学号:班级:姓名:指导教师:完成日期:2012年5月目录1.引言 (1)1.1开发工具 (1)1.1.1 C是中级预言 (1)1.1.2 C是结构化语言 (1)1.1.3 C语言功能齐全 (1)1.1.4 C语言可移植性好 (1)2 游戏设计 (2)2.1游戏设计要求 (2)2.1.1. 设计题目:俄罗斯方块游戏 (2)2.1.2. 设计内容: (2)2.1.3. 功能模块划分: (2)2.2 游戏设计思想 (2)2.2.1游戏界面: (2)2.2.2 设计思路 (2)2.3:游戏功能 (3)2.3.1:开始部分 (3)2.3.2.运行部分 (3)3.实验总结: (4)3.1 开发背景与需求分析 (4)3.2 系统功能介绍 (4)4. 核心代码: (8)总结 (21)参考文献: (22)基于C语言的俄罗斯方块游戏[摘要]:俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏。

俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。

由于上手简单、老少皆宜,从而家喻户晓,风靡世界。

[关键词]:C语言;心得体会;影响1.引言随着社会的发展,人们生活的步调日益加快,越来越多的人加入了全球化的世界.人们不在拘泥于一小块天地.加班,出差成了现代人不可避免的公务.而此时一款可以随时随地娱乐的游戏成了必需品.在手机和电脑成为人们日用品的社会,一款能在其上能便捷运行的游戏成为买家的参考点.现在我们所要设计的这一款基于C语言的游戏——贪吃蛇,就是满足以上要求而设计出来的,希望能给玩家带来娱乐.贪吃蛇这一游戏简单易行,操作方便,娱乐性较强,吸引了不少人.这一款游戏紧紧地抓住了人们的心理,虽然简单,却起乐无穷,在人们不断追求更多的欲望下,该游戏给人们带来了追逐的快感,以及成功后的满足感,对于一直处于高压下的现代人是很好的放松工具.1.1开发工具《C/C++程序设计学习与试验系统》该系统继承了Turbo C2.0/C++3.0、GCC、Visua C++6.0这四种常见的编译器,可以很好满足目前主流的C语言教材的实验需求。

C语言具有下列特点:1.1.1 C是中级预言它把高级语言的基本结构和语句与低级语言的实用性结合起来,C语言可以像汇编语言一样对位、字节和地址进行操作,通常还是称C为高级语言。

1.1.2 C是结构化语言结构化语言的特点是程序的各个部分除了必要地数据交流外彼此独立。

这种结构化方式可使程序层次清晰,便于使用,维护及调试。

1.1.3 C语言功能齐全C语言具有多种数据类型,并引入了指针概念,可使程序效率更高;C语言也具有强大的图形功能;具有较强的计算功能、逻辑判断功能。

1.1.4 C语言可移植性好与汇编语言相比,C语言程序适用范围大,可用于各种操作系统和各种型号的计算机。

2 游戏设计2.1游戏设计要求2.1.1. 设计题目:俄罗斯方块游戏2.1.2. 设计内容:一组由4个小型正方形组成的规则图形,中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。

通过设计者预先设置的随机发生器不断地输出单个方块到场地顶部,以一定的规则进行移动、旋转、下落和摆放,锁定并填充到场地中。

每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并且以此来换取一定的积分或者其他形式的奖励。

而未被消除的方块会一直累积,并对后来的方块摆放造成各种影响。

如果未被消除的方块堆放的高度超过场地所规定的最大高度则游戏结束。

2.1.3. 功能模块划分:系统功能模块2.2 游戏设计思想2.2.1游戏界面:方块堆积。

遇整则消。

2.2.2 设计思路1、一个用于摆放小型正方形的平面虚拟场地,其标准大小:行宽为10,列高为20,以每个小正方形为单位。

2.、一组由4个小型正方形组成的规则图形,英文称为Tetromino,中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。

I:一次最多消除四层J (左右):最多消除三层,或消除二层L:最多消除三层,或消除二层O:消除一至二层S (左右):最多二层,容易造成孔洞Z (左右):最多二层,容易造成孔洞T:最多二层(1)部分游戏有单格方块,可以穿透固定的方块到达最下层空位。

其他的改版中出现更多特别的造型。

方块会从区域上方开始缓慢继续落下。

(2)玩家可以做的操作有:以90度为单位旋转方块,以格子为单位左右移动方块,让方块加速落下。

(3)方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。

(4)当区域中某一列横向格子全部由方块填满,则该列会消失并成为玩家的得分。

同时删除的列数越多,得分指数上升。

(5)当固定的方块堆到区域最上方而无法消除层数时,则游戏结束。

(6)一般来说,游戏还会提示下一个要落下的方块,熟练的玩家会计算到下一个方块,评估现在要如何进行。

由于游戏能不断进行下去对商业用游戏不太理想,所以一般还会随着游戏的进行而加速提高难度。

3、通过设计者预先设置的随机发生器不断地输出单个方块到场地顶部,以一定的规则进行移动、旋转、下落和摆放,锁定并填充到场地中。

每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并且以此来换取一定的积分或者其他形式的奖励。

而未被消除的方块会一直累积,并对后来的方块摆放造成各种影响。

4、如果未被消除的方块堆放的高度超过场地所规定的最大高度(并不一定是20或者玩家所能见到的高度),则游戏结束。

具体到每一款不同的游戏,其中的细节规则都可能有千差万别,但是以上的基本规则是相同的。

2.3:游戏功能2.3.1:开始部分游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像书有封面一样,我设置了一个游戏的标题画面,除了游戏标题画面我还设置了一个欢迎画面。

标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些重要变量的初始化。

2.3.2.运行部分俄罗斯方块的要求为:不同形状组合的方块从界面上方落下。

通过键盘上的四个光标控制方块下落时的形状转换和下落方向。

方块堆积在一起,将区域占满时则会消除以增加游戏分数。

整个游戏过程分为三个步骤:1、按游戏界面的"开始"按钮或者F2键来开始游戏,自己使用右边的窗口,对手使用左边的窗口2、键盘操作:系统缺省设置使用右边的窗口,用光标操作,"←"左移一格;"→"右移一格;"↑"旋转方块;↓ 方块丢下(方块下落到底),"End"健可以一格格的下落,用户还可以自定义习惯的按键来操作游戏。

3、计分牌显示的内容:“分数”为双方本局的分数,计分标准为下落一个块10分,一次消一行100分、2行200分、3行400分、4行800分。

等级”为双方的游戏设置等级,当分数达到一定的值,等级就会提升、速度加快。

“行数”第一行为双方消的行数,第二行是送给对方的行数。

“比分”为双方赢的局数。

2.3.3:结束部分:游戏结束时,显示“GAME OVER”3.实验总结:3.1 开发背景与需求分析随着网络技术的发展,人们的生活越来越离不开网络,网络给人们带来了各种各样的信息和更多更新的娱乐。

据统计。

每天上网的人群中75%的人用来丰富自己的生活。

其中游戏最为常见和普遍。

所以,这次课程设计我想实现一个小游戏:俄罗斯方块。

需求分析1)游戏面板(画布)GameCanvas类,完成游戏显示;2)方块绘画drawUnit类,方块下落过程中的各种形态;3)主界面实现游戏的开始,退出,暂停,提高级数,降低级数功能及图像界面排版;4)通过键盘按键实现游戏,并且可以调节游戏速度。

3.2 系统功能介绍俄罗斯方块是一个非常复杂但比较有趣并且耐玩的游戏,相信很多人对俄罗斯方块并不陌生,如下图所示,游戏中共有七种方块,每种方块都有四个方格组成。

这七种方块可以旋转90度、180度、270度,因此每种方块有四种状态,七种方块总有28种状态,这28种状态的方块随机产生,自由下落,落下时可由玩家通过键盘上的上、下、左、右控制键来控制方块的反转、移动和加速下落。

如果下落时,方块填满某一行则这一行消失,同时给玩家加分,若由存在空格的方块填满整个窗口,则游戏结束。

图1-1 初始状态图1-2 开始游戏图1-3 消除一行图1-4 消除两行图1-5 消除四行图1-6 游戏结束4. 核心代码:import java.awt.*;import java.awt.event.*;//俄罗斯方块类public class computer extends Frame {public static boolean isPlay = false;public static int level = 1, score = 0;public static TextField scoreField, levelField;public static MyTimer timer;GameCanvas gameScr;//声明一个属于画布类得变量public static void main(String[] argus) {computer ers = new computer("俄罗斯方块游戏 V1.0 Author:Vincent");//运用构造方法为框架名WindowListener win_listener = new WinListener();//定义一个窗口监听事件对象ers.addWindowListener(win_listener);//为框架添加该监听器}computer(String title)// 俄罗斯方块类的构造方法{super(title);//调用父类得构造方法setSize(600, 480);//设置框架的尺寸setLayout(new GridLayout(1, 2));//设置框架的布局流gameScr = new GameCanvas();gameScr.addKeyListener(gameScr);//为该对象注册键盘点击监听器timer = new MyTimer(gameScr);timer.setDaemon(true);timer.start();timer.suspend();add(gameScr);Panel rightScr = new Panel();rightScr.setLayout(new GridLayout(2, 1, 0, 30));rightScr.setSize(120, 500);add(rightScr);// 右边信息窗体的布局MyPanel infoScr = new MyPanel();infoScr.setLayout(new GridLayout(4, 1, 0, 5));infoScr.setSize(120, 300);rightScr.add(infoScr);// 定义标签和初始值Label scorep = new Label("分数:", Label.LEFT);Label levelp = new Label("级数:", Label.LEFT);scoreField = new TextField(8);levelField = new TextField(8);scoreField.setEditable(false);levelField.setEditable(false);infoScr.add(scorep);infoScr.add(scoreField);infoScr.add(levelp);infoScr.add(levelField);scorep.setSize(new Dimension(20, 60));scoreField.setSize(new Dimension(20, 60));levelp.setSize(new Dimension(20, 60));levelField.setSize(new Dimension(20, 60));scoreField.setText("0");levelField.setText("1");// 右边控制按钮窗体的布局MyPanel controlScr = new MyPanel();controlScr.setLayout(new GridLayout(5, 1, 0, 5));rightScr.add(controlScr);// 定义按钮playButton play_b = new Button("开始游戏");play_b.setSize(new Dimension(50, 200));play_b.addActionListener(new Command(Command.button_play, gameScr));// 定义按钮Level UPButton level_up_b = new Button("提高级数");level_up_b.setSize(new Dimension(50, 200));level_up_b.addActionListener(new Command(Command.button_levelup,gameScr));// 定义按钮Level DownButton level_down_b = new Button("降低级数");level_down_b.setSize(new Dimension(50, 200));level_down_b.addActionListener(new Command(Command.button_leveldown, gameScr));// 定义按钮Level PauseButton pause_b = new Button("游戏暂停");pause_b.setSize(new Dimension(50, 200));pause_b.addActionListener(new Command(Command.button_pause,gameScr));// 定义按钮QuitButton quit_b = new Button("退出游戏");quit_b.setSize(new Dimension(50, 200));quit_b.addActionListener(new Command(Command.button_quit, gameScr));controlScr.add(play_b);controlScr.add(level_up_b);controlScr.add(level_down_b);controlScr.add(pause_b);controlScr.add(quit_b);setVisible(true);gameScr.requestFocus();}}// 重写MyPanel类,使Panel的四周留空间class MyPanel extends Panel {public Insets getInsets() {return new Insets(30, 50, 30, 50);}}// 游戏画布类class GameCanvas extends Canvas implements KeyListener {final int unitSize = 30; // 小方块边长int rowNum; // 正方格的行数int columnNum; // 正方格的列数int maxAllowRowNum; // 允许有多少行未削int blockInitRow; // 新出现块的起始行坐标int blockInitCol; // 新出现块的起始列坐标int[][] scrArr; // 屏幕数组Block b; // 对方快的引用// 画布类的构造方法GameCanvas() {rowNum = 15;columnNum = 10;maxAllowRowNum = rowNum - 2;b = new Block(this);blockInitRow = rowNum - 1;blockInitCol = columnNum / 2 - 2;scrArr = new int[32][32];}// 初始化屏幕,并将屏幕数组清零的方法void initScr() {for (int i = 0; i < rowNum; i++)for (int j = 0; j < columnNum; j++)scrArr[i][j] = 0;b.reset();repaint();}// 重新刷新画布方法public void paint(Graphics g) {for (int i = 0; i < rowNum; i++)for (int j = 0; j < columnNum; j++)drawUnit(i, j, scrArr[i][j]);}// 画方块的方法public void drawUnit(int row, int col, int type) { scrArr[row][col] = type;Graphics g = getGraphics();switch (type) { // 表示画方快的方法case 0:g.setColor(Color.black);break; // 以背景为颜色画case 1:g.setColor(Color.blue);break; // 画正在下落的方块case 2:g.setColor(Color.magenta);break; // 画已经落下的方法}g.fill3DRect(col * unitSize, getSize().height - (row + 1) * unitSize, unitSize, unitSize, true);g.dispose();}public Block getBlock() {return b; // 返回block实例的引用}// 返回屏幕数组中(row,col)位置的属性值public int getScrArrXY(int row, int col) {if (row < 0 || row >= rowNum || col < 0 || col >= columnNum)return (-1);elsereturn (scrArr[row][col]);}// 返回新块的初始行坐标方法public int getInitRow() {return (blockInitRow); // 返回新块的初始行坐标}// 返回新块的初始列坐标方法public int getInitCol() {return (blockInitCol); // 返回新块的初始列坐标}// 满行删除方法void deleteFullLine() {int full_line_num = 0;int k = 0;for (int i = 0; i < rowNum; i++) {boolean isfull = true;L1: for (int j = 0; j < columnNum; j++)if (scrArr[i][j] == 0) {k++;isfull = false;break L1;}if (isfull)full_line_num++;if (k != 0 && k - 1 != i && !isfull)for (int j = 0; j < columnNum; j++) {if (scrArr[i][j] == 0)drawUnit(k - 1, j, 0);elsedrawUnit(k - 1, j, 2);scrArr[k - 1][j] = scrArr[i][j];}}for (int i = k - 1; i < rowNum; i++) {for (int j = 0; j < columnNum; j++) {drawUnit(i, j, 0);scrArr[i][j] = 0;}}computer.score += full_line_num;computer.scoreField.setText("" + computer.score); }// 判断游戏是否结束方法boolean isGameEnd() {for (int col = 0; col < columnNum; col++) {if (scrArr[maxAllowRowNum][col] != 0)return true;}return false;}public void keyTyped(KeyEvent e) {}public void keyReleased(KeyEvent e) {}// 处理键盘输入的方法public void keyPressed(KeyEvent e) {if (!computer.isPlay)return;switch (e.getKeyCode()) {case KeyEvent.VK_DOWN:b.fallDown();break;case KeyEvent.VK_LEFT:b.leftMove();break;case KeyEvent.VK_RIGHT:b.rightMove();break;case KeyEvent.VK_UP:b.leftTurn();break;}}}// 处理控制类class Command implements ActionListener {static final int button_play = 1; // 给按钮分配编号 static final int button_levelup = 2;static final int button_leveldown = 3;static final int button_quit = 4;static final int button_pause = 5;static boolean pause_resume = true;int curButton; // 当前按钮GameCanvas scr;// 控制按钮类的构造方法Command(int button, GameCanvas scr) {curButton = button;this.scr = scr;}// 按钮执行方法public void actionPerformed(ActionEvent e) {switch (curButton) {case button_play:if (!computer.isPlay) {scr.initScr();computer.isPlay = true;computer.score = 0;computer.scoreField.setText("0");computer.timer.resume();}scr.requestFocus();break;case button_levelup:if (computer.level < 10) {computer.level++;computer.levelField.setText("" + computer.level); computer.score = 0;computer.scoreField.setText("" + computer.score); }scr.requestFocus();break;case button_leveldown:if (computer.level > 1) {computer.level--;computer.levelField.setText("" + computer.level);computer.score = 0;computer.scoreField.setText("" + computer.score);}scr.requestFocus();break;case button_pause:if (pause_resume) {computer.timer.suspend();pause_resume = false;} else {computer.timer.resume();pause_resume = true;}scr.requestFocus();break;case button_quit:System.exit(0);}}}// 方块类class Block {static int[][] pattern = {{ 0x0f00, 0x4444, 0x0f00, 0x4444 },// 用十六进至表示,本行表示长条四种状态{ 0x04e0, 0x0464, 0x00e4, 0x04c4 },{ 0x4620, 0x6c00, 0x4620, 0x6c00 },{ 0x2640, 0xc600, 0x2640, 0xc600 },{ 0x6220, 0x1700, 0x2230, 0x0740 },{ 0x6440, 0x0e20, 0x44c0, 0x8e00 },{ 0x0660, 0x0660, 0x0660, 0x0660 } };int blockType; // 块的模式号(0-6)int turnState; // 块的翻转状态(0-3)int blockState; // 快的下落状态int row, col; // 块在画布上的坐标GameCanvas scr;// 块类的构造方法Block(GameCanvas scr) {this.scr = scr;blockType = (int) (Math.random() * 1000) % 7;turnState = (int) (Math.random() * 1000) % 4;blockState = 1;row = scr.getInitRow();col = scr.getInitCol();}// 重新初始化块,并显示新块public void reset() {blockType = (int) (Math.random() * 1000) % 7;turnState = (int) (Math.random() * 1000) % 4;blockState = 1;row = scr.getInitRow();col = scr.getInitCol();dispBlock(1);}// 实现“块”翻转的方法public void leftTurn() {if (assertValid(blockType, (turnState + 1) % 4, row, col)) { dispBlock(0);turnState = (turnState + 1) % 4;dispBlock(1);}}// 实现“块”的左移的方法public void leftMove() {if (assertValid(blockType, turnState, row, col - 1)) {dispBlock(0);col--;dispBlock(1);}}// 实现块的右移public void rightMove() {if (assertValid(blockType, turnState, row, col + 1)) { dispBlock(0);col++;dispBlock(1);}}// 实现块落下的操作的方法public boolean fallDown() {if (blockState == 2)return (false);if (assertValid(blockType, turnState, row - 1, col)) { dispBlock(0);row--;dispBlock(1);return (true);} else {blockState = 2;dispBlock(2);return (false);}}// 判断是否正确的方法boolean assertValid(int t, int s, int row, int col) { int k = 0x8000;for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if ((int) (pattern[t][s] & k) != 0) {int temp = scr.getScrArrXY(row - i, col + j);if (temp < 0 || temp == 2)return false;}k = k >> 1;}}return true;}// 同步显示的方法public synchronized void dispBlock(int s) {int k = 0x8000;for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if (((int) pattern[blockType][turnState] & k) != 0) { scr.drawUnit(row - i, col + j, s);}k = k >> 1;}}}}// 定时线程class MyTimer extends Thread {GameCanvas scr;public MyTimer(GameCanvas scr) {this.scr = scr;}public void run() {while (true) {try {sleep((10 - computer.level + 1) * 100);} catch (InterruptedException e) {}if (!scr.getBlock().fallDown()) {scr.deleteFullLine();if (scr.isGameEnd()) {computer.isPlay = false;suspend();} elsescr.getBlock().reset();}}}}class WinListener extends WindowAdapter {public void windowClosing(WindowEvent l) {System.exit(0);}}总结1感悟:当今计算机应用在生活中可以说得是无处不在。

相关主题