java课程设计---俄罗斯方块游戏
石家庄职业技术学院
Java课程设计报告
俄罗斯方块游戏
学生姓名:
学 号:
系 别:信息工程系 专 业:软件技术
班 级:
指导教师:
论文提交时间:2013年x月x日
石家庄职业技术学院
目录
摘要 ...................................................................................................................................... 2 一 游戏设计说明 ................................................................................................................. 3 1.1 游戏的设计及实现 .................................................................................................... 3 1.2 游戏流程图设计 ........................................................................................................ 3 二 详细设计 ........................................................................................................................ 4 2.1参数及界面................................................................................................................. 4 2.2初始化构造方法 ......................................................................................................... 5 2.3 初始化地图 ................................................................................................................ 5 2.4生成新方块的方法 ..................................................................................................... 5 2.5 旋转方法 ................................................................................................................... 6 2.6 判断是否合法方法 .................................................................................................... 6 2.7 消行方法 ................................................................................................................... 6 2.8 判断挂方法 ................................................................................................................ 7 三 测试
分析
定性数据统计分析pdf销售业绩分析模板建筑结构震害分析销售进度分析表京东商城竞争战略分析
........................................................................................................................ 8 四 设计体会 ........................................................................................................................ 8 五 游戏代码 ........................................................................................................................ 9 参考文献: ........................................................................................................................ 17
~ 1 ~
石家庄职业技术学院
摘要
俄罗斯方块游戏运用java实现具有一定功能的游戏软件,主要功能如下:
1. 控制对象左右下运动,
2. 控制对象旋转,
3. 判断对象是否越界,
4. 判断对象底下是否到底下或固定对象,
5. 判断某一行是否全有对象,然后消一行,加分, 6. 判断游戏进行是否挂了,然后自动重新开始,分数清零。
关键词:java、俄罗斯方块游戏、对象
~ 2 ~
石家庄职业技术学院
一 游戏设计说明
1.1 游戏的设计及实现
本游戏主要有以下5个主要方法:
1.MyPanel() 初始化构造方法;
2.newmap() 初始化地图;
3.newboxs() 生成新方块方法;
4.blow() 是否合法方法;
5.gobox() 消行方法;
1.2 游戏流程图设计
开始
初始化构造方法
旋转方法
左移方法 初画生
始围成
化墙 新
地方右移方法 图 块
下落方法
是把画消判
否当方行断
合前块方挂
法添方法 方
方加法 法
ma法
p
~ 3 ~
石家庄职业技术学院
二 详细设计 2.1参数及界面
int boxs 方块类型
int scoer 分数
int boxscore 方块状态
int[][] map = new int[13][23] 定义已经放下的方块x=0-11,y=0-21
2.1游戏界面
~ 4 ~
石家庄职业技术学院 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++)
{
map[i][j] = 0;
}
}
}
2.4生成新方块的方法
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 OVER");
}
}
~ 5 ~
石家庄职业技术学院 2.5 旋转方法
通过按?来控制对象旋转,如果对象没有越界或附近没有固定对象可以旋
转,否侧失效。
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();
}
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 (((shapes[boxs][boxscode][a * 4 + b] == 1) && (map[x+ b + 1][y
+ a] == 1))
|| ((shapes[boxs][boxscode][a * 4 + b] == 1) && (map[x+ b +
1][y + a] == 2)))
{
return 0;
}
}
}
return 1;
}
2.7 消行方法
如果某一行全有固定对象,则消失某一行;否则不消失。
~ 6 ~
石家庄职业技术学院
public void gobox() 法
{
int c = 0;
for (int b = 0; b < 22; b++)
{
for (int a = 0; a < 12; a++)
{
if (map[a][b] == 1)
{
c = c + 1;
if (c == 10) {
score += 10;
for (int d = b; d > 0; d--)
{
for (int e = 0; e < 11; e++)
{
map[e][d] = map[e][d - 1];
}
}
}
}
}
c = 0;
}
}
2.8 判断挂方法
如果堆积满了则挂,并重新开始。 public int gameover(int x, int y) {
if (blow(x, y, boxs, boxscode) == 0)
{
return 1;
}
return 0;
}
~ 7 ~
石家庄职业技术学院
三 测试分析
运行俄罗斯方块游戏,操作左右下运动、旋转运动没有卡现象,运行正常。分数增加、消行正常。
发现游戏一打开就自动开始了,没有考虑这点,使玩家成被动了。
四 设计体会
本次课程设计主要是运用本学期所学到的Java基础知识来设计一个符合要求的俄罗斯方块游戏,这期间我遇到了很多的困难,发现了很多的问题,正是在解决问题的期间我才慢慢地熟悉了Java的基础知识,才慢慢学会了如何去按照给定的要求设计出合适的java系统。通过本次课程设计,我明白了一个道理:无论做什么事情,都必需养成严谨,认真,善思的工作作风遇到问题最好的办法就是请教别人,因为每个人掌握的情况都不一样,一个人不可能做到处处都懂,必须发挥群众的力量,复杂的事情才能够简单化。这一点我深有体会,在很多时候我遇到的困难或许别人之前就遇到过,向他们请教远比自己在那边摸索来得简单来得快。
~ 8 ~
石家庄职业技术学院
五 游戏代码
MyJFrame.java
package Russia;
import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionListener;
import javax.swing.*;
@SuppressWarnings({ "serial", "unused" }) public class MyJFrame extends JFrame implements ActionListener
{
public static boolean start=false;
public MyJFrame()
{
Image icon = getToolkit().getImage(
"F:\\java\\workspace\\Russia 1.1\\icon.png");
setIconImage(icon);
setTitle("俄罗斯方块小游戏");
setLocation(470,130);
setDefaultCloseOperation(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 static void main(String[] args)
{
MyJFrame frame = new MyJFrame();
}
@Override
~ 9 ~
石家庄职业技术学院
public void actionPerformed(ActionEvent e)
{
// TODO Auto-generated method stub
String s=e.getActionCommand();
if(s=="退出")
System.exit(0);
}
}
MyPanel.java
package Russia;
import java.awt.*;
import java.awt.event.ActionEvent; import java.awt.event.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 = 0;
int j = 0;
int flag = 0;
int[][] map = new int[13][23]; // 定义已经放下的方块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++)
~ 10 ~
石家庄职业技术学院
{
for (j = 0; j < 22; j++)
{
map[i][j] = 0;
}
}
}
// 方块的形状 第一组代表方块类型有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, 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, 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, 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, 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 },
~ 11 ~
石家庄职业技术学院
{ 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0 } } };
public void drawbox() //画围墙
{
for (i = 0; i < 12; i++)
{
map[i][21] = 2;
}
for (j = 0; j < 22; j++)
{
map[11][j] = 2;
map[0][j] = 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 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();
}
~ 12 ~
石家庄职业技术学院
public void left() // 左移的方法
{
if (blow(x - 1, y, boxs, boxscode) == 1)
{
x = x - 1;
}
repaint();
}
public void right() // 右移的方法
{
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, int boxscode) // 是否合法
的方法
{
for (int a = 0; a < 4; a++)
{
for (int b = 0; b < 4; b++)
{
if (((shapes[boxs][boxscode][a * 4 + b] == 1) && (map[x+ b + 1][y
+ a] == 1))
|| ((shapes[boxs][boxscode][a * 4 + b] == 1) && (map[x+ b +
~ 13 ~
石家庄职业技术学院 1][y + a] == 2)))
{
return 0;
}
}
}
return 1;
}
public void gobox() // 消行的方法
{
int c = 0;
for (int b = 0; b < 22; b++)
{
for (int a = 0; a < 12; a++)
{
if (map[a][b] == 1)
{
c = c + 1;
if (c == 10) {
score += 10;
for (int d = b; d > 0; d--)
{
for (int e = 0; e < 11; e++)
{
map[e][d] = map[e][d - 1];
}
}
}
}
}
c = 0;
}
}
public int gameover(int x, int y) //判断挂方法
{
if (blow(x, y, boxs, boxscode) == 0)
{
return 1;
}
return 0;
}
~ 14 ~
石家庄职业技术学院
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 (map[x + b + 1][y + a] == 0)
{
map[x + b + 1][y + a] = shapes[blockType][turnState][j];
}
j++;
}
}
}
public void paintComponent(Graphics g) // 画方块的的方法
{
super.paintComponent(g);
for (j = 0; j < 16; j++) // 画当前方块
{
if (shapes[boxs][boxscode][j] == 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++)
{
if (map[i][j] == 1)
{
g.fillRect(i * 20, j * 20, 19, 19);
}
if (map[i][j] == 2)
{
g.drawRect(i * 20, j * 20, 19, 19);
}
}
}
g.setColor(Color.red);
~ 15 ~
石家庄职业技术学院
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 KeyEvent.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)
{
~ 16 ~
石家庄职业技术学院
if (flag == 1)
{
add(x, y, boxs, boxscode);
gobox();
newboxs();
flag = 0;
}
flag = 1;
}
}
}
}
参考文献:
《Java程序设计教程》 主编:迟丽华 清华大学出版社
《Java程序设计案列汇编》 主编:焦玲等 中国铁道出版社
《Java课程设计》 主编: 耿祥义 清华大学出版社
《Java经典编程300例》 主编:明日科技 清华大学出版社
~ 17 ~