




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由sun microsystems公司于1995年5月推出的java程序设计语言和java平台(即javase, javaee, javame)的总称。java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人pc、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,java更具备了显著优势和广阔前景。目录 引言11研究方法11.1俄罗斯方块游戏的基本要求11.1.1游戏基本功能:移动、加速、变形、消除、游戏结束等。11.1.2显示下一个方块。11.1.3游戏难度岁分数递增。11.1.4玩家自己设置游戏难度、开始、暂停等。11.1.5分数的统计等。12、研究过程12.1、模块设计12.1.1、控制面板类12.1.2、块类22.1.3、游戏主类22.1.4、方格类22.1.5、画布类22.2、详细设计22.2.1、游戏控制22.2.2、方块设计32.2.3、画布设计43、运行结果63.1、初始画面:63.2、游戏设置界面:73.3、游戏进行中的界面:83.4、游戏结束界面:94、心得体会95、参考文献:96、附录:游戏主类代码9 引言开发一个单机游戏系统,能够实现俄罗斯方块程序。通过键盘按键可以调整方块的旋转方向。最终达到能够通过本次课程设计,进一步巩固所学java知识,学会将理论用于实践,掌握所学知识的实验意义。操作系统:windows xp,开发工具:myeclipse 开发语言:java1研究方法1.1俄罗斯方块游戏的基本要求1.1.1游戏基本功能:移动、加速、变形、消除、游戏结束等。1.1.2显示下一个方块。1.1.3游戏难度岁分数递增。1.1.4玩家自己设置游戏难度、开始、暂停等。1.1.5分数的统计等。2、研究过程2.1、模块设计2.1.1、控制面板类继承自jpanel.上边安放预显窗口、等级、得分、控制按钮。主要用来控制游戏进程。2.1.2、块类继承自线程类(thread)由 4 * 4 个方格(ersbox)构成一个块,控制块的移动、下落、变形等。2.1.3、游戏主类继承自jframe类,负责游戏的全局控制。内含: 一个gamecanvas画布类的实例引用;一个保存当前活动块(ersblock)实例的引用; 一个保存当前控制面板(controlpanel)实例的引用。2.1.4、方格类是组成块的基本元素,用自己的颜色来表示块的外观。2.1.5、画布类内有 *个方格类实例。继承自jpanel类。 ersblock线程类动态改变画布类的方格颜色,画布类通过 检查方格颜色来体现ersblock块的移动情况。2.2、详细设计2.2.1、游戏控制一轮游戏过程,实现了runnable接口。一轮游戏是一个大循环,在这个循环中,每隔100毫秒,检查游戏中的当前块是否已经到底了,如果没有,就继续等待。如果到底了,就看有没有全填满的行,如果有就删除它,并为游戏者加分,同时随机产生一个,新的当前块,让它自动下落。当新产生一个块时,先检查画布最顶上的一行是否已经被占了,如果是,可以判断game over了。 代码示例:private class game implements runnable public void run() int col = (int) (math.random() * (canvas.getcols() - 3), style = ersblock.styles(int) (math.random() * 7)(int) (math.random() * 4);while (playing) if (block != null) /第一次循环时,block为空if (block.isalive() try thread.currentthread().sleep(100); catch (interruptedexception ie) ie.printstacktrace();continue;checkfullline(); /检查是否有全填满的行if (isgameover() /检查游戏是否应该结束了miplay.setenabled(true);mipause.setenabled(true);miresume.setenabled(false);ctrlpanel.setplaybuttonenable(true);ctrlpanel.setpausebuttonlabel(true);reportgameover();return;block = new ersblock(style, -1, col, getlevel(), canvas);block.start();col = (int) (math.random() * (canvas.getcols() - 3);style = ersblock.styles(int) (math.random() * 7)(int) (math.random() * 4);ctrlpanel.settipstyle(style);2.2.2、方块设计构造函数,产生一个特定的块style 块的样式,对应styles的28个值中的一个y 起始位置,左上角在canvas中的坐标行x 起始位置,左上角在canvas中的坐标列level 游戏等级,控制块的下落速度。canvas 画板代码:public ersblock(int style, int y, int x, int level, gamecanvas canvas) this.style = style;this.y = y;this.x = x;this.level = level;this.canvas = canvas;int key = 0x8000;for (int i = 0; i boxes.length; i+) for (int j = 0; j = 1;display(); 2.2.3、画布设计包括显示方块、积分;取得游戏成绩、控制积分的叠加、清零;游戏升级积分的变化等。 代码:/* * 取得自上一次升级后的积分 * return int, 上一次升级后的积分 */public int getscoreforlevelupdate() return scoreforlevelupdate;/* * 升级后,将上一次升级以来的积分清0 */public void resetscoreforlevelupdate() scoreforlevelupdate -= ersblocksgame.per_level_score;/* * 得到某一行某一列的方格引用。 * param row int, 要引用的方格所在的行 * param col int, 要引用的方格所在的列 * return ersbox, 在row行col列的方格的引用 */public ersbox getbox(int row, int col) if (row boxes.length - 1 | col boxes0.length - 1)return null;return (boxesrowcol);/* * 覆盖jcomponent类的函数,画组件。 * param g 图形设备环境 */public void paintcomponent(graphics g) super.paintcomponent(g);g.setcolor(frontcolor);for (int i = 0; i boxes.length; i+) for (int j = 0; j 0; i-) for (int j = 0; j cols; j+)boxesij = (ersbox) boxesi - 1j.clone();score += ersblocksgame.per_line_score;scoreforlevelupdate += ersblocksgame.per_line_score;repaint();/* * 重置画布,置积分为0 */public void reset() score = 0;scoreforlevelupdate = 0;for (int i = 0; i boxes.length; i+) for (int j = 0; j boxesi.length; j+)boxesij.setcolor(false);repaint();3、运行结果3.1、初始3.2、游戏设置界面:3.3、游戏进行中的界面:3.4、游戏结束界面:4、心得体会 通过对俄罗斯方块游戏的编写,加深了对java多线程的理解。体验到了将理论应用到实践中的快乐。在编程过程中遇到了许多困难,通过老师、同学的帮助已经书籍的查阅和上网查资料,基本上都得到了解决。通过这次的课程设计,使我们对java面向对象的编程有了深一步的了解。同时也发现了自己的许多不足之处,从此以后要更加认真的学习各种知识,不断完善、提高自己的水平,才能得到真正的提高。5、参考文献:java语言程序设计-徐保民 陈旭东 李春艳java大学实用教程-耿祥义 张跃平java程序设计实用教程-钱慎一6、附录:游戏主类代码package block;import javax.swing.*;import java.awt.*;import java.awt.event.*;/* * 游戏主类,继承自jframe类,负责游戏的全局控制。 * 内含 * 1, 一个gamecanvas画布类的实例引用, * 2, 一个保存当前活动块(ersblock)实例的引用, * 3, 一个保存当前控制面板(controlpanel)实例的引用; */public class ersblocksgame extends jframe private static final long serialversionuid = 1l; /* * 每填满一行计多少分 */public final static int per_line_score = 100;/* * 积多少分以后能升级 */public final static int per_level_score = per_line_score * 20;/* * 最大级数是10级 */public final static int max_level = 10;/* * 默认级数是5 */public final static int default_level = 5;private gamecanvas canvas;private ersblock block;private boolean playing = false;private controlpanel ctrlpanel;private jmenubar bar = new jmenubar();private jmenu mgame = new jmenu(游戏),mcontrol = new jmenu(控制),mwindowstyle = new jmenu(界面风格),minfo = new jmenu(关于);private jmenuitem minewgame = new jmenuitem(新游戏),misetblockcolor = new jmenuitem(设置方块颜色),misetbackcolor = new jmenuitem(设置背景颜色),miturnharder = new jmenuitem(增加难度级别),miturneasier = new jmenuitem(减小难度级别),miexit = new jmenuitem(退出),miplay = new jmenuitem(开始),mipause = new jmenuitem(暂停),miresume = new jmenuitem(恢复),mistop = new jmenuitem(停止),miauthor = new jmenuitem(作者: 2009081314 quyan ),misourceinfo = new jmenuitem(2012 课程设计。);private jcheckboxmenuitem miaswindows = new jcheckboxmenuitem(windows),miasmotif = new jcheckboxmenuitem(motif),miasmetal = new jcheckboxmenuitem(metal, true);/* * 主游戏类的构造函数 * param title string,窗口标题 */public ersblocksgame(string title) super(title);setsize(315, 392);dimension scrsize = toolkit.getdefaulttoolkit().getscreensize();setlocation(scrsize.width - getsize().width) / 2, (scrsize.height - getsize().height) / 2);createmenu();container container = getcontentpane();container.setlayout(new borderlayout(6, 0);canvas = new gamecanvas(20, 12);ctrlpanel = new controlpanel(this);container.add(canvas, borderlayout.center);container.add(ctrlpanel, borderlayout.east);addwindowlistener(new windowadapter() public void windowclosing(windowevent we) stopgame();system.exit(0););addcomponentlistener(new componentadapter() public void componentresized(componentevent ce) canvas.fanning(););show(); canvas.fanning();/* * 让游戏“复位” */public void reset() ctrlpanel.reset();canvas.reset();/* * 判断游戏是否还在进行 * return boolean, true-还在运行,false-已经停止 */public boolean isplaying() return playing;/* * 得到当前活动的块 * return ersblock, 当前活动块的引用 */public ersblock getcurblock() return block;/* * 得到当前画布 * return gamecanvas, 当前画布的引用 */public gamecanvas getcanvas() return canvas;/* * 开始游戏 */public void playgame() play();ctrlpanel.setplaybuttonenable(false);miplay.setenabled(false);ctrlpanel.requestfocus();/* * 游戏暂停 */public void pausegame() if (block != null) block.pausemove();ctrlpanel.setpausebuttonlabel(false);mipause.setenabled(false);miresume.setenabled(true);/* * 让暂停中的游戏继续 */public void resumegame() if (block != null) block.resumemove();ctrlpanel.setpausebuttonlabel(true);mipause.setenabled(true);miresume.setenabled(false);ctrlpanel.requestfocus();/* * 用户停止游戏 */public void stopgame() playing = false;if (block != null) block.stopmove();miplay.setenabled(true);mipause.setenabled(true);miresume.setenabled(false);ctrlpanel.setplaybuttonenable(true);ctrlpanel.setpausebuttonlabel(true);/* * 得到当前游戏者设置的游戏难度 * return int, 游戏难度1max_level */public int getlevel() return ctrlpanel.getlevel();/* * 让用户设置游戏难度 * param level int, 游戏难度1max_level */public void setlevel(int level) if (level 0) ctrlpanel.setlevel(level);/* * 得到游戏积分 * return int, 积分。 */public int getscore() if (canvas != null) return canvas.getscore();return 0;/* * 得到自上次升级以来的游戏积分,升级以后,此积分清零 * return int, 积分。 */public int getscoreforlevelupdate() if (canvas != null) return canvas.getscoreforlevelupdate();return 0;/* * 当分数累计到一定的数量时,升一次级 * return boolean, ture-update successufl, false-update fail */public boolean levelupdate() int curlevel = getlevel();if (curlevel max_level) setlevel(curlevel + 1);canvas.resetscoreforlevelupdate();return true;return false;/* * 游戏开始 */private void play() reset();playing = true;thread thread = new thread(new game();thread.start();/* * 报告游戏结束了 */private void reportgameover() joptionpane.showmessagedialog(this, game over!);/* * 建立并设置窗口菜单 */private void createmenu() bar.add(mgame);bar.add(mcontrol);bar.add(mwindowstyle);bar.add(minfo);mgame.add(minewgame);mgame.addseparator();mgame.add(misetblockcolor);mgame.add(misetbackcolor);mgame.addseparator();mgame.add(miturnharder);mgame.add(miturneasier);mgame.addseparator();mgame.add(miexit);mcontrol.add(miplay);mcontrol.add(mipause);mcontrol.add(miresume);mcontrol.add(mistop);mwindowstyle.add(miaswindows);mwindowstyle.add(miasmotif);mwindowstyle.add(miasmetal);minfo.add(miauthor);minfo.add(misourceinfo);setjmenubar(bar);mipause.setaccelerator( keystroke.getkeystroke(keyevent.vk_p, keyevent.ctrl_mask);miresume.setaccelerator(keystroke.getkeystroke(keyevent.vk_enter, 0);minewgame.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) stopgame();reset();setlevel(default_level););misetblockcolor.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) color newfrontcolor = jcolorchooser.showdialog(ersblocksgame.this, set color for block, canvas.getblockcolor();if (newfrontcolor != null)canvas.setblockcolor(newfrontcolor););misetbackcolor.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) color newbackcolor = jcolorchooser.showdialog(ersblocksgame.this, set color for block, canvas.getbackgroundcolor();if (newbackcolor != null)canvas.setbackgroundcolor(newbackcolor););miturnharder.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) int curlevel = getlevel();if (curlevel 1) setlevel(curlevel - 1););miexit.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) system.exit(0););miplay.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) playgame(););mipause.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) pausegame(););miresume.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) resumegame(););mistop.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) stopgame(););miaswindows.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) string plaf = com.sun.java.swing.plaf.windows.windowslookandfeel;setwindowstyle(plaf);canvas.fanning();ctrlpanel.fanning();miaswindows.setstate(true);miasmetal.setstate(false);miasmotif.setstate(false););miasmotif.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) string plaf = com.sun.java.swing.plaf.motif.motiflookandfeel;setwindowstyle(plaf);canvas.fanning();ctrlpanel.fanning();miaswindows.setstate(false);miasmetal.setstate(false);miasmotif.setstate(true););miasmetal.addactionlistener(new actionlistener() public void actionperformed(actionevent ae) string plaf = javax.swing.plaf.metal.metallookandfeel;setwindowstyle(plaf);canvas.fanning();ctrlpanel.fanning();miaswindows.setstate(false);miasmetal.setstate(true);miasmotif.setstate(false););/* * 根据字串设置窗口外观 * param plaf string, 窗口外观的描述 */private void setwindowstyle(string plaf) try uimanager.setlookandfeel(plaf);swingutilities.updatecomponenttreeui(this); catch (exception e) private class game implements runnable public void run() int col = (int) (math.random() * (canvas.getcols() - 3), style = ersblock.styles(int) (math.random() * 7)(int) (math.random() * 4);while (playing) if (bl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论