1、 摘要Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。目录 引言11研究方法11.1俄罗斯方块游戏的基本要求11.1.1游戏基本功能:移动、加速、变形、消除、游戏结束等。11.1.2显示下
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 引言开发一个单机游戏系统,能够实现俄罗斯方块程序。通过键盘按键可以调整方块的旋转方向。最终达到能
3、够通过本次课程设计,进一步巩固所学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 个方格(E
4、rsBox)构成一个块,控制块的移动、下落、变形等。2.1.3、游戏主类继承自JFrame类,负责游戏的全局控制。内含: 一个GameCanvas画布类的实例引用;一个保存当前活动块(ErsBlock)实例的引用; 一个保存当前控制面板(ControlPanel)实例的引用。2.1.4、方格类是组成块的基本元素,用自己的颜色来表示块的外观。2.1.5、画布类内有 *个方格类实例。继承自JPanel类。 ErsBlock线程类动态改变画布类的方格颜色,画布类通过 检查方格颜色来体现ErsBlock块的移动情况。2.2、详细设计2.2.1、游戏控制一轮游戏过程,实现了Runnable接口。一轮游戏
5、是一个大循环,在这个循环中,每隔100毫秒,检查游戏中的当前块是否已经到底了,如果没有,就继续等待。如果到底了,就看有没有全填满的行,如果有就删除它,并为游戏者加分,同时随机产生一个,新的当前块,让它自动下落。当新产生一个块时,先检查画布最顶上的一行是否已经被占了,如果是,可以判断Game Over了。 代码示例:private class Game implements Runnable public void run() int col = (int) (Math.random() * (canvas.getCols() - 3), style = ErsBlock.STYLES(int)
6、 (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);mi
7、Pause.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) (M
8、ath.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;
9、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;/*
10、* 升级后,将上一次升级以来的积分清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 boxes
11、0.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.clo
12、ne();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、游
13、戏设置界面:3.3、游戏进行中的界面:3.4、游戏结束界面:4、心得体会 通过对俄罗斯方块游戏的编写,加深了对java多线程的理解。体验到了将理论应用到实践中的快乐。在编程过程中遇到了许多困难,通过老师、同学的帮助已经书籍的查阅和上网查资料,基本上都得到了解决。通过这次的课程设计,使我们对JAVA面向对象的编程有了深一步的了解。同时也发现了自己的许多不足之处,从此以后要更加认真的学习各种知识,不断完善、提高自己的水平,才能得到真正的提高。5、参考文献:Java语言程序设计-徐保民 陈旭东 李春艳Java大学实用教程-耿祥义 张跃平Java程序设计实用教程-钱慎一6、附录:游戏主类代码packa
14、ge 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; /* *
15、 每填满一行计多少分 */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;pri
16、vate 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(设置方块颜色)
17、,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 ),
18、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(3
19、15, 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
20、 = 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(Compon
21、entEvent 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() re
22、turn 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();
23、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();/* * 用户停止游戏 */publ
24、ic 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 c
25、trlPanel.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, 积分。 *
26、/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.r
27、esetScoreForLevelUpdate();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.a
28、dd(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.ad
29、d(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.setAcce
30、lerator(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 newF
31、rontColor = 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.sh
32、owDialog(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
33、 - 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(ActionE
34、vent 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 acti
35、onPerformed(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 actionP
36、erformed(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 actionPerforme
37、d(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 (play