1、 目录一引言31.1运行环境3二需求分析42.1开发背景42.2设计目的42.3功能需求4三概要设计43.1设计思想43.2系统架构5四详细设计54.1事件处理54.2界面设计64.3游戏画布类64.4方块类84.5消行并统计分数13五.使用说明145.1游戏开始运行145.2填满一行即消行得分155.3列被填满,则游戏自动结束16六课程设计总结与体会16七参考文献1716一引言 1.1运行环境 操作系统:Microsoft Windows XP 程序语言:Java 开发工具:JCreator LE 4.50二需求分析 2.1开发背景 Java是现在全球最时髦的开发工具之一,它拥有一套庞大且完
2、善的类库,内置了其他语言需要靠库甚至是操作系统才能支持的功能。Java的产生与流行是Internet发展的客观要求。如今越来越多的应用程序是Java开发的,用Java开发的应用程序可在任何计算平台安全运行。Java作为一个分布式的,面向对象的程序设计方法,可以让位于任何地方的任何计算机使用网络上的应用程序。可以说Java是一个万能的开发平台,用Java编程成为一种趋势。2.2设计目的通过本次课程设计了解和掌握JDK开发环境以及JCreator等集成开发环境,巩固所学的Java知识及编程机制。了解Java程序开发流程,学会构思比较复杂的课程设计思想;能合理的利用本学期所掌握的多线程、类、GUI等
3、知识编写一个较为复杂的Java应用软件。掌握面向对象成学设计的有关概念和开发方法,锻炼团队合作开发精神。2.3功能需求本课程设计的目标是设计一个名为俄罗斯方块的游戏软件,实现其界面的初始化,程序运行,退出,和相应数据处理。能实现游戏的基本功能,类似下移、左移、右移、翻转、得分累加等,并在规定时间内达到课题所需要实现的功能及要求。三概要设计 3.1设计思想1)使用JPanel框架,并添加按钮、文本框等对象,用布局管理器定义各个对象的分布。2)设计一个二维数组来表示方块,默认为不显示。3)设计一个设计定时线程来控制方块的下落速度。4)设计七种形状的方块,每种形状定义四种形态来实现方块变换5)每个方
4、块落到底后判断是否消沉。 3.2系统架构俄罗斯方块游戏游戏操作处理画布游戏界面按钮事件键盘事件方块类画布类面板类 四详细设计4.1事件处理用actionPerformed()方法实现选择不同类型方块以及控制方块变化功能的实现,用keyPressed()方法实现用键盘控制方块变化功能的实现,在FinalElsBlock.java类中实现事件的监听。4.2界面设计 游戏基本界面图4.3游戏画布类LeftShowCanvas类继承Canvas类,实现方块在画布上的显示,主要代码如下: package game3;import java.awt.*; import java.awt.event.*;
5、import javax.swing.*; import javax.swing.event.*;class LeftShowCanvas extends Canvaint maxrows, maxcols; / 画布最大行数,列数int unitSize; / 单元格的大小,小正方格int unitState; / 每个小方格的状态 0、1、2表示RightPanel rp;int score;public LeftShowCanvas(RightPanel rp) this.rp = rp; score = Integer.valueOf(rp.jtf.getText(); maxrows
6、 = 20; maxcols = 10; unitSize = 20; unitState = new intmaxrowsmaxcols; initCanvas(); public void initCanvas() / 初始化,画布方格 for (int i = 0; i maxrows; i+) for (int j = 0; j maxcols; j+) unitStateij = 0;public void paint(Graphics g) for (int i = 0; i maxrows; i+) for (int j = 0; j maxcols; j+) drawUnit(
7、i, j, unitStateij); / 画方格 if (i = 3) g.setColor(Color.RED); g.drawLine(0, (i + 1) * (unitSize + 1) - 1, maxcols * (unitSize + 1) - 1, (i + 1) * (unitSize + 1) - 1); public void drawUnit(int row, int col, int tag) / 画方格 unitStaterowcol = tag; / 记录状态 Graphics g = getGraphics(); switch (tag) case 0: /
8、初始黑色 g.setColor(Color.BLACK); break; case 1: / 方格黑色 g.setColor(Color.RED); break; case 2: g.setColor(Color.BLUE); break; g.fillRect(col * (unitSize + 1), row * (unitSize + 1), unitSize, unitSize); 4.4方块类方块类,定义了七种形状的方块,每种形状有四种状态,实现用键盘控制方块的的左移,右移,下移以及翻转。具体代码如下: package game3;import java.awt.*; import
9、java.awt.event.*; import javax.swing.*; import javax.swing.event.*;class Block implements Runnable/ 方块类 static final int type = 7, state = 4;static final int patten = / 16进制代表每种方块 0x0f00, 0x4444, 0x0f00, 0x4444 ,/ 长条 0x6600, 0x6600, 0x6600, 0x6600 ,/ 正方块 0x04e0, 0x0464, 0x00e4, 0x04c4 ,/ 三角 0x08e0,
10、0x0644, 0x00e2, 0x044c ,/ 弯折一下,1、3,1左 0x02e0, 0x0446, 0x00e8, 0x0c44 ,/ 弯折一下,1、3,1右 0x0462, 0x006c, 0x0462, 0x006c ,/ 弯折两下,1、2、1,1左上;1右下 0x0264, 0x00c6, 0x0264, 0x00c6 / 弯折两下,1、2、1,1右上;1左下 ; private int blockType = -1; / 方块类型,7种,大小范围0-6 private int blockState;/ 方块状态,4种,大小范围0-3 private int row, col;
11、/ 方块所在的行数,列数 private int oldRow, oldCol; / 记录方块变化前所在的行数,列数 private int oldType = -1, oldState; / 记录方块变化前的类型和状态 private int isfall = 1; / 标记若画,画成什么颜色的, / 1表示可以下落,画为红色;0表示不可下落,画为蓝色 private boolean end = false;/ 结束标记,为true时表示结束 LeftShowCanvas lsc; public Block(LeftShowCanvas lsc) this.lsc = lsc; row =
12、0; col = 3; oldRow = row; oldCol = col; public void reInit() / 一个方块无法下落后,重新初始化 blockType = -1; isfall = 1; public void reInitRowCol() / 初始化方块起始点 row = 0; col = 3; public void run() / 下落线程 lsc.requestFocusInWindow(); / 获得焦点 while (!end) int blocktype = (int) (Math.random() * 100) % 7; drawBlock(block
13、type); do try Thread.sleep(500); / 控制下落速度 catch (InterruptedException e) while (fallMove(); / 下落 for (int j = 0; j lsc.maxcols; j+) / 判断是否结束 if (lsc.unitState3j = 2) end = true; public synchronized void drawBlock(int blockType) / 画方块 if (this.blockType != blockType) blockState = (int) (Math.random()
14、 * 100) % 4; / 状态 this.blockType = blockType; / 样式 if (!isMove(3) / 判断是否能画 this.blockType = oldType; this.blockState = oldState; return; int comIndex = 0x8000; if (this.oldType != -1) for (int i = oldRow; i oldRow + 4; i+) for (int j = oldCol; j 1; comIndex = 0x8000; for (int i = row; i row + 4; i+)
15、 for (int j = col; j 1; if (isfall = 0) / 无法下落,先判断是否能消行,再重新初始化 / lsc.deleteFullLine(row,col); reInit(); reInitRowCol(); oldRow = row; oldCol = col; oldType = blockType; oldState = blockState; public void leftTurn() / 旋转,左转 if (this.blockType != -1) blockState = (blockState + 1) % 4; if (isMove(3) dr
16、awBlock(blockType); else blockState = (blockState + 3) % 4; public void leftMove() / 左移 if (this.blockType != -1 & isMove(0) col -= 1; drawBlock(blockType); public void rightMove() / 右移 if (this.blockType != -1 & isMove(1) col += 1; drawBlock(blockType); public boolean fallMove() / 下移 if (this.block
17、Type != -1) if (isMove(2) row += 1; drawBlock(blockType); return true; else isfall = 0; drawBlock(blockType); return false; return false; public synchronized boolean isMove(int tag) / 左 0 ,右 1 ,下 2 ,旋转 3 int comIndex = 0x8000; for (int i = row; i row + 4; i+) for (int j = col; j lsc.maxrows - 1 | j
18、lsc.maxcols - 1 | lsc.unitStateij = 2) return false; comIndex = comIndex 1; return true; 4.5消行并统计分数 public void deleteFullLine(int row) / 判断此行是否可以消,同时可消就消行 for (int j = 0; j 3; i-) / 到此即为可消,将上面的移下消此行 for (int j = 0; j maxcols; j+) drawUnit(i, j, unitStatei - 1j); score+; rp.jtf.setText(String.valueO
19、f(score);五.使用说明5.1游戏开始运行5.2填满一行即消行得分 5.3列被填满,则游戏自动结束 六课程设计总结与体会本次课程设计花费我们小组一个月的时间来完成,从设计开始选择课题到最终完成课程设计,小组成员分工明确,相互合作,按时完成相关任务。通过这次实验,我们学习到了很多Java编码成知识,同时对这个学期的课本所学的知识有了进一步巩固,特别是多线程,Swing组件和事件等能更熟练的运用。这次实验过后,我们发现,动手比看书更能获取实际有用的知识。真理是从实践中得知的,而且也只有实践才能检验真理。而这次实验也加强了我们这些方面的理解能力,对书面上的东西实际操作在具体项目上有了一个更清晰
20、的认识。我们还意识到一个大的程序,在写代码之前,一定要有良好的需求分析和结构设计,应该占整个程序设计的大部分时间,一个好的程序,分析设计应该要非常充分,这样才不至于代码写了一半才发现很多错误。很多具体代码操作之前的设计规划和构建才是优秀程序设计的灵魂。设计过程中,我们另一个大的体会就是合作的好处,通过相互帮助,大大的提高了工作效率。同时我们也发现自己的不足之处。而且让我感受比较深的是,做事细心很重要,所谓细节决定成败。程序还有很多不足,在今后的日子里,我们会虚心向老师同学请教,尽自己最大的努力做到最好。七参考文献1. 李芝兴,杨瑞龙.Java程序设计之网络编程.M.北京:清华大学出版社 2. 印旻编.Java语言与面向对象程序设计.M.北京:清华大学出版社 3. 朱站立,沈伟.Java程序设计实用教程.M.北京:电子工业出版社指导教师评语: 指导教师签名: 年 月 日成 绩 教研室审核意见:教研室主任签字: 年 月 日(此为最后一页)