Java俄罗斯方块课程设计.docx_第1页
Java俄罗斯方块课程设计.docx_第2页
Java俄罗斯方块课程设计.docx_第3页
Java俄罗斯方块课程设计.docx_第4页
Java俄罗斯方块课程设计.docx_第5页
已阅读5页,还剩14页未读 继续免费阅读

VIP免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计Java 课 程 设 计题目:俄罗斯方块目录一 需求分析.2 1.1开发背景. 21.2设计目的. 2 1.3功能需求. 21.4开发环境. . 2二软件概要设计. 3 2.1 设计思想. 3 2.2 系统架构.32.3 模块划分.3三详细设计.43.1 事件处理.43.2 界面设计. .43.3 系统流程. .43.4 游戏画布类.53.5 方块类.93.6 方块的消除.8四软件运行测试.10五课程设计总结及心得体会. 12六参考文献. .12附录:重要代码. .13一需求分析1.1开发背景Java是现在全球最时髦的开发工具之一,它拥有一套庞大且完善的类库,内置了其他语言需要靠库甚至是操作系统才能支持的功能。Java的产生与流行是InterNet发展的客观要求。如今越来越多的应用程序是于Java开发的,用Java开发的应用程序可在任何计算平台上安全地运行。Java作为一个分布式的,面向对象的程序设计方法,可以让位于任何地方的任何计算机使用网络上的的应用程序。可以说Java是一个万能的开发平台,用Java编程已经成为一种趋势。1.2设计目的通过本次课程设计了解和掌握JDK开发环境以及Eclipse等集成开发环境,巩固所学的Java知识及其编程机制。了解JAVA程序开发流程,学会构思比较复杂的课题的设计思想;,能合理的利用本学期所掌握的多线程、类、GUI等知识编写一个较为复杂的Java应用软件。掌握面向对象程序设计的有关概念和开发方法,锻炼大家团队合作开发精神。1.3功能需求本课程设计的目标是设计一个名为俄罗斯方块的游戏软件,实现其界面初始化,程序运行,退出,和相应数据处理。能实现游戏的基本功能,类似下落、转向、平移、得分累加和计数等,并在规定的时间内达到课题所需要实现的功能及要求。1.4开发环境操作系统:Microsoft Windows XP程序语言:Java 开 发 包:Java(TM) 2 Standard Edition (5.0) Sun Micro. J2ME Wireless Tool Kit 2.2IDE: Eclipse 3.41二 .软件概要设计21设计思想1)使用Jpanel框架,并添加按钮、文本框等对象,用布局管理器定义各个对象的分布。 2)设计一个二维数组来表示方块,默认为不显示,游戏过程中通过SetVisible来显示方块。3)设计一个设计定时线程来控制方块下落速度。4)设计七种形状的防快,每种形状定义四种形态来实现方块变换。5)每个方块落到底后判断能否消层和游戏是否结束。2.2系统架构主要包含方块类,游戏画布类,处理控制类,定时线程,模块构造,页面布局2.3 模块化分根据需求分析要实现的系统功能,可以得出系统的模块图:三详细设计31事件处理在frame框架中设置各种对象,使用addActionListener添加监听。例如:gameScr.addKeyListener(gameScr);然后使用public void actionPerformed(ActionEvent e)和public void mouseClicked(MouseEvent e)实现按钮和鼠标点击事件。3.2界面设计游戏基本界面图3.3系统流程游戏画面流程图游戏算法流程图3.4 游戏画布类游戏画布类,继承自Canvas类,游戏的主要代码,用于实现方块在画布上显示class GameCanvas extends Canvas implements KeyListener final int unitSize = 25; / 小方块边长 int rowNum; / 正方格的行数 int columnNum; / 正方格的列数 int maxAllowRowNum; / 允许有多少行未消 int blockInitRow; / 新出现块的起始行坐标 int blockInitCol; / 新出现块的起始列坐标 int scrArr; / 屏幕数组 Block b; / 对方快的引用 GameCanvas() rowNum = 18; columnNum = 12; maxAllowRowNum = rowNum - 2; b = new Block(this); blockInitRow = rowNum - 1; blockInitCol = columnNum / 2 - 2; scrArr = new int3232; / 初始化屏幕,并将屏幕数组清零的方法 void initScr() for (int i = 0; i rowNum; i+) for (int j = 0; j columnNum; j+) scrArrij = 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, scrArrij); / 画方块的方法 public void drawUnit(int row, int col, int type) scrArrrowcol = type; Graphics g = getGraphics(); switch (type) / 表示画方快的方法 case 0: g.setColor(Color.black); break; / 以背景为颜色画 case 1: g.setColor(Color.green); break; / 画正在下落的方块 case 2: g.setColor(Color.gray); break; / 画已经落下的方法 g.fill3DRect(col * unitSize, getSize().height - (row + 1) * unitSize, unitSize, unitSize, true); g.dispose(); 3.5方块类方块类,定义了七种形状的方块,每种形状有四种状态,实现用键盘控制方块的下落,移动,转换形状等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; int turnState; 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) (patternts & k) != 0) int temp = scr.getScrArrXY(row - i, col + j); if (temp 1; return true; 3.6方块的消除实现方块满行是删除该行,并改变分数输出窗口的值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 (scrArrij = 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 (scrArrij = 0) drawUnit(k - 1, j, 0); else drawUnit(k - 1, j, 2); scrArrk - 1j = scrArrij; for (int i = k - 1; i rowNum; i+) for (int j = 0; j columnNum; j+) drawUnit(i, j, 0); scrArrij = 0; ELS.score += full_line_num; ELS.scoreField.setText( + ELS.score); 四软件测试运行1.游戏开始运行2增加难度并填满一行后,消去该行,分数增加3列被填满,弹出游戏结束窗口五课程设计总结及体会本次课程设计花费了小组成员一周的时间来完成。从设计开始选择课题到最终完成课程设计,小组成员分工明确,相互合作,按时完成了相关任务。通过这次的实验,我们学习到了很多Java编程的知识,同时对这学期的课本所学知识有了进一步巩固.特别是多线程,AWT组件和事件等能更熟练的运用.这次实验过后,我们发现,动手比看书更能获取实际有用的知识.很多知识,在书本上看似很有道理,可是这些知识在与实际情况结合起来往往就会出现书本上没见过的情况,或者说之前的理解与实际的使用是截然不同的.所以,真理是从实践中得知的,而且也只有实践才能检验真理.而这次试验也加强了我们这些方面的理解能力,对书面上的东西实际操作在具体项目上有了一个更加清晰的认识。我们还意识到一个大的程序,在写代码前,一定要有良好的需求分析和结构设计,应该占整个程序设计的大部分时间,一个好的程序,分析设计应该要非常充分,这样才不至于代码写了一半才发现很多错误。在具体代码操作之前的设计规划与构建才是一个优秀的程序设计的灵魂。设计过程中,我们另一个大的一个体会就是合作的好处,通过互相帮助,大大的提高了工作的效率。同时我们也发现了自己的不足之处。对于很多自己以为很熟悉的东西,在细节上的把握有许多不足;有些想当然,认为它应该是这样,而忽略的事实。这也让我们明白,做事细心是必须的,所谓细节决定成败!程序还有很多不足,在今后的日子里,我们会虚心向老师同学请教,尽自己最大的努力做到最好。六.参考文献1.Java程序设计之网络编程,李芝兴,杨瑞龙著,清华大学出版社2.Java语言与面向对象程序设计,印旻编著,清华大学出版社 3.Java程序设计实用教程,朱站立、沈伟编著,电子工业出版社附录:重要代码class GameCanvas extends Canvas implements KeyListener final int unitSize = 25; / 小方块边长 int rowNum; / 正方格的行数 int columnNum; / 正方格的列数 int maxAllowRowNum; / 允许有多少行未消 int blockInitRow; / 新出现块的起始行坐标 int blockInitCol; / 新出现块的起始列坐标 int scrArr; / 屏幕数组 Block b; / 对方快的引用 GameCanvas() rowNum = 18; columnNum = 12; maxAllowRowNum = rowNum - 2; b = new Block(this); blockInitRow = rowNum - 1; blockInitCol = columnNum / 2 - 2; scrArr = new int3232; / 初始化屏幕,并将屏幕数组清零的方法 void initScr() for (int i = 0; i rowNum; i+) for (int j = 0; j columnNum; j+) scrArrij = 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, scrArrij); / 画方块的方法 public void drawUnit(int row, int col, int type) scrArrrowcol = type; Graphics g = getGraphics(); switch (type) / 表示画方快的方法 case 0: g.setColor(Color.black); break; / 以背景为颜色画 case 1: g.setColor(Color.green); break; / 画正在下落的方块 case 2: g.setColor(Color.gray); 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 = rowNum | col = columnNum) return (-1); else return (scrArrrowcol); / 返回新块的初始行坐标方法 public int getInitRow() return (blockInitRow); / 返回新块的初始行坐标 / 返回新块的初始列坐标方法 public int getInitCol() return (blockInitCol); / 返回新块的初始列坐标 public void reportGameOver() JOptionPane.showMessageDialog(this, Game Over!请继续努力);/ 满行删除方法 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 (scrArrij = 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 (scrArrij = 0) drawUnit(k - 1, j, 0); else drawUnit(k - 1, j, 2); scrArrk - 1j = scrArrij; for (int i = k - 1; i rowNum; i+) for (int j = 0; j columnNum; j+) drawUnit(i, j, 0); scrArrij = 0; ELS.score += full_line_num; ELS.scoreField.setText( + ELS.score); boolean isGameEnd() for (int col = 0; col columnNum; col+) if (scrArrmaxAllowRowNumcol != 0)reportGameOver();return true; return false; public void keyTyped(KeyEvent e) public void keyReleased(KeyEvent e) public void keyPressed(KeyEvent e) if (!ELS.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: ELS.isPlay = true; ELS.score = 0; ELS.scoreField.setText(0); ELS.timer.resume(); scr.initScr(); scr.requestFocus(); break; case button_levelup: if (ELS.level 1) ELS.level-; ELS.levelField.setText( + ELS.level); ELS.score = 0; ELS.scoreField.setText( + ELS.score); scr.requestFocus(); break; case button_pause: if (pause_resume) ELS.timer.suspend(); pause_resume = false; return; else ELS.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; int turnState; 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 leftMo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论