1、石家庄职业技术学院目录摘要2一 游戏设计说明31.1 游戏的设计及实现31.2 游戏流程图设计4二 详细设计42.1参数及界面42.2初始化构造方法52.3 初始化地图62.4生成新方块的方法62.5 旋转方法62.6 判断是否合法方法72.7 消行方法72.8 判断挂方法8三 测试分析8四 设计体会8五 游戏代码10参考文献:18摘要俄罗斯方块游戏运用java实现具有一定功能的游戏软件,主要功能如下:1. 控制对象左右下运动;2. 控制对象旋转;3. 判断对象是否越界;4. 判断对象底下是否到底下或固定对象;5. 判断某一行是否全有对象,然后消一行,加分;6. 判断游戏进行是否挂了,然后自动
2、重新开始,分数清零。关键词:java、俄罗斯方块游戏、对象一 游戏设计说明1.1 游戏的设计及实现本游戏主要有以下5个主要方法:1.MyPanel() 初始化构造方法;2.newmap() 初始化地图;3.newboxs() 生成新方块方法;4.blow() 是否合法方法;5.gobox() 消行方法;1.2 游戏流程图设计开始初始化构造方法初始化地图生成新方块画围墙旋转方法左移方法右移方法下落方法是否合法方法把当前添加map画方块方法消行方法判断挂方法二 详细设计2.1参数及界面 int boxs 方块类型int scoer 分数int boxscore 方块状态int map = new
3、int1323 定义已经放下的方块x=0-11,y=0-212.1游戏界面2.2初始化构造方法开始,初始化方块、分数、地图等。public MyPanel() newboxs();newmap(); Timer timer = new Timer(1000, new TimerListener();timer.start();drawbox();2.3 初始化地图开始游戏时,初始化参数。public void newmap() for (i = 0; i 12; i+) for (j = 0; j 22; j+) mapij = 0; 2.4生成新方块的方法public void newbox
4、s() boxs = (int) (Math.random() * 1000) % 7;boxscode = (int) (Math.random() * 1000) % 4;x = 4;y = 0;if (gameover(x, y) = 1) newmap(); drawbox(); score = 0; JOptionPane.showMessageDialog(null, GAME OVER);2.5 旋转方法通过按来控制对象旋转,如果对象没有越界或附近没有固定对象可以旋转,否侧失效。public void turn() int tempturnState = boxscode;box
5、scode = (boxscode + 1) % 4;if (blow(x, y, boxs, boxscode) = 1)if (blow(x, y, boxs, boxscode) = 0) boxscode = tempturnState;repaint();2.6 判断是否合法方法用来判断对象是否越界、是否继续下去等。public int blow(int x, int y, int boxs, int boxscode) for (int a = 0; a 4; a+) for (int b = 0; b 4; b+) if (shapesboxsboxscodea * 4 + b
6、= 1) & (mapx+ b + 1y + a = 1)| (shapesboxsboxscodea * 4 + b = 1) & (mapx+ b + 1y + a = 2) return 0; return 1;2.7 消行方法如果某一行全有固定对象,则消失某一行;否则不消失。public void gobox() 法 int c = 0;for (int b = 0; b 22; b+) for (int a = 0; a 0; d-) for (int e = 0; e 11; e+) maped = maped - 1; c = 0;2.8 判断挂方法如果堆积满了则挂,并重新开始。
7、public int gameover(int x, int y) if (blow(x, y, boxs, boxscode) = 0) return 1;return 0;三 测试分析运行俄罗斯方块游戏,操作左右下运动、旋转运动没有卡现象,运行正常。分数增加、消行正常。发现游戏一打开就自动开始了,没有考虑这点,使玩家成被动了。四 设计体会本次课程设计主要是运用本学期所学到的Java基础知识来设计一个符合要求的俄罗斯方块游戏,这期间我遇到了很多的困难,发现了很多的问题,正是在解决问题的期间我才慢慢地熟悉了Java的基础知识,才慢慢学会了如何去按照给定的要求设计出合适的java系统。通过本次课
8、程设计,我明白了一个道理:无论做什么事情,都必需养成严谨,认真,善思的工作作风遇到问题最好的办法就是请教别人,因为每个人掌握的情况都不一样,一个人不可能做到处处都懂,必须发挥群众的力量,复杂的事情才能够简单化。这一点我深有体会,在很多时候我遇到的困难或许别人之前就遇到过,向他们请教远比自己在那边摸索来得简单来得快。五 游戏代码MyJFrame.javapackage Russia;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.
9、*;SuppressWarnings( serial, unused )public class MyJFrame extends JFrame implements ActionListener public static boolean start=false; public MyJFrame() Image icon = getToolkit().getImage(F:javaworkspaceRussia 1.1icon.png);setIconImage(icon);setTitle(俄罗斯方块小游戏);setLocation(470,130);setDefaultCloseOper
10、ation(MyJFrame.EXIT_ON_CLOSE);setSize(247,520);setVisible(true);setResizable(false); MyPanel a = new MyPanel(); addKeyListener(a); add(a); JMenuBar menu = new JMenuBar();setJMenuBar(menu);JMenu game = new JMenu(游戏);JMenuItem exit = game.add(退出);menu.add(game); exit.addActionListener(this); public st
11、atic void main(String args) MyJFrame frame = new MyJFrame(); Override public void actionPerformed(ActionEvent e) / TODO Auto-generated method stubString s=e.getActionCommand();if(s=退出) System.exit(0); MyPanel.javapackage Russia;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.even
12、t.ActionListener;import java.awt.event.KeyEvent;import java.awt.event.KeyListener;import javax.swing.*;SuppressWarnings(serial)class MyPanel extends JPanel implements KeyListener private int boxs;/代表方块类型 private int score = 0; private int boxscode;/ 代表方块状态 private int x; private int y; private int i
13、 = 0; int j = 0; int flag = 0; int map = new int1323;/ 定义已经放下的方块x=0-11,y=0-21; public MyPanel() / 初始化构造方法 newboxs();newmap(); Timer timer = new Timer(1000, new TimerListener();timer.start();drawbox(); public void newmap() / 初始化地图 for (i = 0; i 12; i+) for (j = 0; j 22; j+) mapij = 0; / 方块的形状 第一组代表方块
14、类型有S、Z、L、J、I、O、T 7种 第二组 代表旋转几次 第三组为 方块矩阵 private final int shapes = new int 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 ,/ i 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 , 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 , 0, 1, 1, 0, 1, 1, 0, 0, 0
15、, 0, 0, 0, 0, 0, 0, 0 ,/ s 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 , 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/ z 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 1, 1, 0, 0
16、, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 ,/ j 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 1, 1, 0, 0, 0, 0
17、, 0, 0, 0, 0, 0, 0 ,/ o 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0 ,/ l 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 1, 1, 0, 0, 0, 1, 0, 0, 0, 1
18、, 0, 0, 0, 0, 0, 0 , 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 ,/ t 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 , 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 ; public void drawbox() /画围墙 for
19、(i = 0; i 12; i+) mapi21 = 2;for (j = 0; j 22; j+) map11j = 2; map0j = 2; public void newboxs() / 生成新方块的方法 boxs = (int) (Math.random() * 1000) % 7;boxscode = (int) (Math.random() * 1000) % 4;x = 4;y = 0;if (gameover(x, y) = 1) newmap(); drawbox(); score = 0; JOptionPane.showMessageDialog(null, GAME
20、OVER); public void turn() / 旋转的方法 int tempturnState = boxscode;boxscode = (boxscode + 1) % 4;if (blow(x, y, boxs, boxscode) = 1)if (blow(x, y, boxs, boxscode) = 0) boxscode = tempturnState;repaint(); public void left()/ 左移的方法 if (blow(x - 1, y, boxs, boxscode) = 1) x = x - 1;repaint(); public void r
21、ight()/ 右移的方法 if (blow(x + 1, y, boxs, boxscode) = 1) x = x + 1;repaint(); public void down() / 下落的方法 if (blow(x, y + 1, boxs, boxscode) = 1) y = y + 1; gobox();if (blow(x, y + 1, boxs, boxscode) = 0) add(x, y, boxs, boxscode); newboxs(); gobox();repaint(); public int blow(int x, int y, int boxs, in
22、t boxscode) / 是否合法的方法 for (int a = 0; a 4; a+) for (int b = 0; b 4; b+) if (shapesboxsboxscodea * 4 + b = 1) & (mapx+ b + 1y + a = 1)| (shapesboxsboxscodea * 4 + b = 1) & (mapx+ b + 1y + a = 2) return 0; return 1; public void gobox() / 消行的方法 int c = 0;for (int b = 0; b 22; b+) for (int a = 0; a 0; d
23、-) for (int e = 0; e 11; e+) maped = maped - 1; c = 0; public int gameover(int x, int y) /判断挂方法 if (blow(x, y, boxs, boxscode) = 0) return 1;return 0; public void add(int x, int y, int blockType, int turnState)/ 把当前添加map int j = 0;for (int a = 0; a 4; a+) for (int b = 0; b 4; b+) if (mapx + b + 1y +
24、 a = 0) mapx + b + 1y + a = shapesblockTypeturnStatej;j+; public void paintComponent(Graphics g)/ 画方块的的方法 super.paintComponent(g);for (j = 0; j 16; j+)/ 画当前方块 if (shapesboxsboxscodej = 1) g.fillRect(j % 4 + x + 1) * 20, (j / 4 + y) * 20, 19, 19); for (j = 0; j 22; j+)/ 画已经固定的方块 for (i = 0; i 12; i+)
25、 if (mapij = 1) g.fillRect(i * 20, j * 20, 19, 19);if (mapij = 2) g.drawRect(i * 20, j * 20, 19, 19); g.setColor(Color.red);g.drawString(score= + score, 100, 460); public void keyPressed(KeyEvent e) switch (e.getKeyCode() case KeyEvent.VK_DOWN: down(); break;case KeyEvent.VK_UP: turn(); break;case K
26、eyEvent.VK_RIGHT: right(); break;case KeyEvent.VK_LEFT: left(); break; public void keyReleased(KeyEvent e) public void keyTyped(KeyEvent e) class TimerListener implements ActionListener public void actionPerformed(ActionEvent e) repaint(); if (blow(x, y + 1, boxs, boxscode) = 1) y = y + 1;gobox(); if (blow(x, y + 1, boxs, boxscode) = 0) if (flag = 1) add(x, y, boxs, boxscode); gobox(); newboxs(); flag = 0;flag = 1; 参考文献:Java程序设计教程 主编:迟丽华清华大学出版社Java程序设计案列汇编 主编:焦玲等中国铁道出版社Java课程设计 主编: 耿祥义清华大学出版社Java经典编程300例 主编:明日科技清华大学出版社 16