课程设计说明书

来源:互联网 发布:k歌软件评分标准 编辑:程序博客网 时间:2024/04/24 06:17

课程设计说明书                 NO.1

Java俄罗斯方块游戏的设计

一. 课程设计的目的  

Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。

为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,锻炼学生熟练的应用面向对象的思想和设计方法解决实际问题的能力,开设了Java程序设计课程设计。

通过此次课程设计,巩固所学Java语言基本知识,增进Java语言编辑基本功,掌握JDKEditplusEclipseJCreator等开发工具的运用,拓宽常用类库的应用。使学生通过该教学环节与手段,把所学课程及相关知识加以融会贯通,全面掌握Java语言的编程思想及面向对象程序设计的方法,为今后从事实际工作打下坚实的基础。

设计方案论证     

2.1 设计思路

一个网络俄罗斯方块的游戏,玩家可以在网络的任何地方互相对战。运行这个应用程序,需要安装JRE(Java Runtime environment,java运行 环境),资源文件包括: play.bat,可以直接运行这个批处理文件来运行“网络俄罗斯方块”(请注意在同一目录下是否存在matrix.jar文件) matrix.jar 打包的“网络俄罗斯方块”游戏,它把所有网络俄罗斯方块游戏的类和资源都集中到了一起,运行时只要存在它就可以了。。我们可以在控制台下通过命令行“java -jar matrix.jar”来运行,也可以直接运行play.bat 文件进入游戏。 \matrix JBuilder的project文件 所有网络俄罗斯方块游戏的源码和资源都在这个目录下面。读者可以用JBuilder来打开matrix.jpx文件。

JavaDoc示例 一个关于javadoc命令使用的例子。 a.java 示例代码 \doc是由示例程序生成的文档-java programming game series three guiding use a network of 57 games, Players can network anywhere mutual war. Note : to run this application, need to install the

  

                                                            

课程设计说明书                 NO.2

JRE (Java Runtime environment, java runtime environment) of this chapter as a resource document include : play.bat readers can directly run this batch file to run "Network Russian box"(please note the the same directory existence matrix.jar) matrix.jar packed "Network Russia Slovakia box "game, it all network game of the Russian box category and resources are concentrated together. running as long as it can. We can console command "java-jar matrix.jar" Run, have direct access to documents play.bat running game. \ Matrix JBuilder project documents the Russian box all network games and FOSS resources.

2.2程序结构、思想和相关技术

这个程序共包含了5个.JAVA源文件,有30个类文件,分别来控制游戏的主界面,控制面板,俄罗斯方块的随机产生,对俄罗斯方块的保存,还能选择他的前景色,背景色。

ErsBlock类的实现:这个类继承线程类,由 4 * 4 个方格(ErsBox)构成一个块, 控制块的移动、下落、变形等,这是实现下路的方块分别对应对7种模型的28种状态 // 共28种状态

       {0x0f00, 0x4444, 0x0f00, 0x4444}, // 长条型的四种状态
       {0x04e0, 0x0464, 0x00e4, 0x04c4}, // 'T'型的四种状态
       {0x6220, 0x1700, 0x2230, 0x0740}, // '7'型的四种状态
       {0x6440, 0x0e20, 0x44c0, 0x8e00}, // 反'7'型的四种状态
       {0x0660, 0x0660, 0x0660, 0x0660}, // 方块的四种状态
    在这个类中用构造方法来实现某个具体的方块,方法中的参数有style,对应那28中状态中的一个,x,y控制起始位置level是游戏的等级也就是方块下落的速度,canvas就是方快出现的画板。

2.3俄罗斯方块类的构造方法

public static void main(String[] argus)

ERS_Block ers = new ERS_Block("俄罗斯方块游戏 V1.0 Author:Vincent");

                                             

课程设计说明书                 NO.3

WindowListener win_listener = new WinListener(); 

ers.addWindowListener(win_listener); 

//俄罗斯方块类的构造方法

2.3 类、包及其描述

java类的动态装载是java语言能力动态性的根源;研究理解它是每一个java设计和代码人员不能忽视的特点,因为很多底层和问题和不理解的技术都来源于它;可以这么说它是热插拨(plug and pay)的根本,是IOC(Sping/PicoContant)的技术最有力的支持,能善用它为设计和实现一个很好的框架必不可少的技术。对于其他技术(C/C++)没有动态特性的语言来说,要运用底层的OS系统所提供的机制,设计人员必須多費一些功夫来编写额外的程序代码(例如Windows 平台上需要使用LoadLibrary()與GetProcAddress()兩個Win32 API 来完成动态的需求),這些额外编写的程序代码也会因为平台的不同而不同,毕竟這些额外的程序代码本身的运作逻辑很少关联,所以维护起来虽不算复杂,但仍有其难度。

主要类RuntimeCode描述如主下,

P050705052 
Class ERS_Block

java.lang.Object

                java.awt.Component

                 java.awt.Container

                  java.awt.Window

                   java.awt.Frame

                  P050705052.ERS_Block

All Implemented Interfaces: 

javax.accessibility.Accessible, 

java.awt.image.ImageObserver,

                                                                沈  阳  大  学

课程设计说明书                 NO.4

ava.awt.MenuContainer,

   java.io.Serializable 

public class ERS_Block 

extends java.awt.Frame

See Also: 

Serialized Form

               图1  fieslds  summary

              图2  Fields inherited from class java.awt.Frame

                                                                沈  阳  大  学

课程设计说明书                 NO.5

                    图3  Fields inherited from class java.awt.Component

                 图4  Fields inherited from imter face java.image.ImageObserver

                   图5  Methods inherited from class java.awt.Window

                    图6  Method Summary

                                                                沈  阳  大  学

课程设计说明书                 NO.6

                      图7  Methods inherited from class java.awt.Frame

                   图8 Methods inherited from class java.awt.Component

                                                                沈  阳  大  学

课程设计说明书                 NO.7

9  Methods inherited from class java.awt.Comtainer

                  图10  Methods inherited from class java.lang.Object

                  图11 Methods inherited from interface java.awt.MenuContainer

                图12  Methods inherited from class java.lang.Object

                                                                沈  阳  大  学

课程设计说明书                 NO.8

13  基本参数截图

注释:以上的图1-13 为在设计过程中,基本设置的几个参数变量,在设计的过程中对重要参数的截图。

三.设计结果与分析

      本游戏的操作流程非常简单,用户启动游戏后,即进入游戏主画面,屏幕开始显示为欢迎画面。用户按下[开始游戏]按钮后,就可以开始玩游戏了,当用户想暂停时,再次按一下[暂停游戏]按钮,游戏就暂停了,在暂停的情况下再按[开始游戏]按钮,游戏继续运行。任何时候按[退出游戏]按钮,游戏都会终止。如果用户想要提高游戏的难度就可以按下[提高级数]按钮。

                                                                沈  阳  大  学

课程设计说明书                 NO.9

     本游戏包含几种形状的方块。分别为长方型、T型、7型、反7型、方型、上型。每种形状又有四种变换方式。如图14

          

                         图14 设计的方快形状

         在附录中的代码运行后,后出现运行的效果图,具体效果如图15所显示。

                  图15 开始界面

右边信息窗体的布局分别包括开始游戏、提高级数、降低级数、游戏暂停、退出游戏5个按钮,使用者可以根据自己的需求选择不同的按钮。

 

                                                                沈  阳  大  学

课程设计说明书                 NO.10

        游戏画布类 :小方块边长 :final int 0unitSize = 30

正方格的行数: int rowNum

方格的列数 :int columnNum

允许有多少行未削 :int maxAllowRowNum

新出现块的起始行坐标 :int blockInitRow

出现块的起始列坐标: int blockInitCol

屏幕数组: int [][] scrArr

对方快的引用:Block b

以下几个图分别为在运行后的结果截图。图16为在开始后落下方块的截图;图17为得分后的截图;图18为提高级数后的截图;图19为游戏方块落满后的截图。

16 开始后落下方块

                                                                沈  阳  大  学

课程设计说明书                 NO.11

16注释:

返回新块的初始行坐标方法: public int getInitRow()

返回新块的初始行坐标 :return(blockInitRow)

           返回新块的初始列坐标方法 :public int getInitCol()

返回新块的初始列坐标 :return(blockInitCol)

17 得分后

  图17注释:

满行删除方法 :void deleteFullLine()

                                                                沈  阳  大  学

课程设计说明书                 NO.12

18 提高级数后

18的注释:

块的模式号(0-6):int blockType

块的翻转状态(0-3):int turnState

            块的下落状态 :int blockState

块在画布上的坐标:int row,col

                                                                沈  阳  大  学

课程设计说明书                 NO.13

19游戏方块落满

设计心得体会

      通过这次课程设计,使我进一步巩固和加深学生所学的专业理论知识,培养学生设计、计算、绘图、计算机应用、文献查阅、报告撰写等基本技能;培养学生独立分析和解决实际问题的能力;培养学生的团队协作精神、创新意识、严肃认真的治学态度和严谨求实的工作作风看

通过该课程设计,全面系统的理解了编译原理程序构造的一般原理和基本实现方法。把死板的课本知识变得生动有趣,激发了学习的积极性。把学过的计算机编译原理 

                                                                沈  阳  大  学

课程设计说明书                 NO.14

的知识强化,能够把课堂上学的知识通过自己设计的程序表示出来,加深了对理论知识的理解。以前对与计算机操

作系统的认识是模糊的,概念上的,现在通过自己动手做实验,从实践上认识了Java是如何编写命令的,如何协调计算机内部各个部件运行,对计算机编译原理的认识更加深刻。课程设计中程序比较复杂,在调试时应该仔细,在程序调试时,注意构造,将不必要的命令去除。

深入的了解了JAVA语言的严谨性,了解了JAVA语言中AWT的使用,为以后学习打下良好的基础。JAVA是一种面向对象的程序语言。熟悉数据库的基本知识及一种以上数据库系统开发软件。

五.参考文献

[1] 谢宋和甘  勇单片机模糊控制系统设计与应用实例[M]. 北京电子工业出版社, 1999.520-25

[2] 范立南谢子殿单片机原理及应用教程[M]. 北京北京大学出版社, 2006.1123-130

[3] 范立南, 韩晓微, 王忠石等. 基于多结构元的噪声污染灰度图像边缘检测研究[4]. 武汉大学学报(工学版), 2003,49(3):45-49

                                                                沈  阳  大  学

课程设计说明书                 NO.15

附录:源代码

package P050705052;

import java.awt.*; 

import java.awt.event.*; 

//俄罗斯方块类 

public class ERS_Block extends Frame{ 

public static boolean isPlay=false; 

public static int level=1,score=0; 

public static TextField scoreField,levelField; 

public static MyTimer timer; 

GameCanvas gameScr; 

public static void main(String[] argus)

ERS_Block ers = new ERS_Block("俄罗斯方块游戏 V1.0 Author:Vincent"); 

WindowListener win_listener = new WinListener(); 

ers.addWindowListener(win_listener); 

//俄罗斯方块类的构造方法 

ERS_Block(String title){ 

super(title);

setSize(600,480); 

setLayout(new GridLayout(1,2)); 

gameScr = new GameCanvas(); 

gameScr.addKeyListener(gameScr); 

timer = new MyTimer(gameScr); 

timer.setDaemon(true); 

timer.start(); 

timer.suspend(); 

add(gameScr);

Panel rightScr = new Panel(); 

rightScr.setLayout(new GridLayout(2,1,0,30)); 

rightScr.setSize(120,500); 

add(rightScr); 

                                                                沈  阳  大  学

课程设计说明书                 NO.16

// 

MyPanel infoScr = new MyPanel(); 

infoScr.setLayout(new GridLayout(4,1,0,5)); 

infoScr.setSize(120,300); 

rightScr.add(infoScr); 

//定义标签和初始值 

Label scorep = new Label("分数:",Label.LEFT); 

Label levelp = new Label("级数:",Label.LEFT); 

scoreField = new TextField(8); 

levelField = new TextField(8); 

scoreField.setEditable(false); 

levelField.setEditable(false); 

infoScr.add(scorep); 

infoScr.add(scoreField); 

infoScr.add(levelp); 

infoScr.add(levelField); 

scorep.setSize(new Dimension(20,60)); 

scoreField.setSize(new Dimension(20,60)); 

levelp.setSize(new Dimension(20,60)); 

levelField.setSize(new Dimension(20,60)); 

scoreField.setText("0"); 

levelField.setText("1"); 

//右边控制按钮窗体的布局 

MyPanel controlScr = new MyPanel(); 

controlScr.setLayout(new GridLayout(5,1,0,5)); 

rightScr.add(controlScr); 

//定义按钮play 

Button play_b = new Button("开始游戏"); 

play_b.setSize(new Dimension(50,200)); 

play_b.addActionListener(new Command(Command.button_play,gameScr));

//定义按钮Level UP 

Button level_up_b = new Button("提高级数"); 

level_up_b.setSize(new Dimension(50,200)); 

level_up_b.addActionListener(new Command(Command.button_levelup,gameScr)); 

                                                                沈  阳  大  学

课程设计说明书                 NO.17

//定义按钮Level Down 

Button level_down_b =new Button("降低级数"); 

level_down_b.setSize(new Dimension(50,200)); 

level_down_b.addActionListener(new Command(Command.button_leveldown,gameScr)); 

//定义按钮Level Pause 

Button pause_b =new Button("游戏暂停"); 

pause_b.setSize(new Dimension(50,200)); 

pause_b.addActionListener(new Command(Command.button_pause,gameScr)); 

//定义按钮Quit 

Button quit_b = new Button("退出游戏"); 

quit_b.setSize(new Dimension(50,200)); 

quit_b.addActionListener(new Command(Command.button_quit,gameScr)); 

controlScr.add(play_b); 

controlScr.add(level_up_b); 

controlScr.add(level_down_b); 

controlScr.add(pause_b); 

controlScr.add(quit_b); 

setVisible(true); 

gameScr.requestFocus(); 

//重写MyPanel类,使Panel的四周留空间 

class MyPanel extends Panel{ 

public Insets getInsets(){ 

return new Insets(30,50,30,50); 

//游戏画布类 

class GameCanvas extends Canvas implements KeyListener{ 

final int unitSize = 30; //小方块边长 

int rowNum; //正方格的行数 

int columnNum; //正方格的列数 

int maxAllowRowNum; //允许有多少行未削

                                                                沈  阳  大  学

课程设计说明书                 NO.18

int blockInitRow; //新出现块的起始行坐标 

int blockInitCol; //新出现块的起始列坐标 

int [][] scrArr; //屏幕数组 

Block b; //对方快的引用 

//画布类的构造方法 

GameCanvas(){ 

rowNum = 15; 

columnNum = 10; 

maxAllowRowNum = rowNum - 2; 

b = new Block(this); 

blockInitRow = rowNum - 1; 

blockInitCol = columnNum/2 - 2; 

scrArr = new int [32][32]; 

//初始化屏幕,并将屏幕数组清零的方法 

void initScr(){ 

for(int i=0;i<rowNum;i++) 

for (int j=0; j<columnNum;j++) 

{ scrArr[i][j]=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,scrArr[i][j]); 

//画方块的方法 

public void drawUnit(int row,int col,int type){ 

scrArr[row][col] = type; 

Graphics g = getGraphics(); 

switch(type){ //表示画方快的方法 

                                                                沈  阳  大  学

课程设计说明书                 NO.19

case 0: g.setColor(Color.black);break; //以背景为颜色画 

case 1: g.setColor(Color.blue);break; //画正在下落的方块 

case 2: g.setColor(Color.magenta);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 < 0 || row >= rowNum || col < 0 || col >= columnNum) 

return(-1); 

else 

return(scrArr[row][col]); 

//返回新块的初始行坐标方法 

public int getInitRow(){ 

return(blockInitRow); //返回新块的初始行坐标 

//返回新块的初始列坐标方法 

public int getInitCol(){ 

return(blockInitCol); //返回新块的初始列坐标 

//满行删除方法 

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++) 

                                                                沈  阳  大  学

课程设计说明书                 NO.20

if(scrArr[i][j] == 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 (scrArr[i][j] == 0) 

drawUnit(k-1,j,0); 

else 

drawUnit(k-1,j,2); 

scrArr[k-1][j] = scrArr[i][j]; 

for(int i = k-1 ;i < rowNum; i++){ 

for(int j = 0; j < columnNum; j++){ 

drawUnit(i,j,0); 

scrArr[i][j]=0; 

ERS_Block.score += full_line_num; 

ERS_Block.scoreField.setText(""+ERS_Block.score); 

//判断游戏是否结束方法 

boolean isGameEnd(){ 

for (int col = 0 ; col <columnNum; col ++){ 

if(scrArr[maxAllowRowNum][col] !=0) 

return true; 

return false; 

public void keyTyped(KeyEvent e){ 

public void keyReleased(KeyEvent e){

                                                                沈  阳  大  学

课程设计说明书                 NO.21

//处理键盘输入的方法 

public void keyPressed(KeyEvent e){ 

if(!ERS_Block.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_SPACE: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:if(!ERS_Block.isPlay){ 

scr.initScr(); 

                                                                沈  阳  大  学

课程设计说明书                 NO.22

ERS_Block.isPlay = true; 

ERS_Block.score = 0; 

ERS_Block.scoreField.setText("0"); 

ERS_Block.timer.resume(); 

scr.requestFocus(); 

break; 

case button_levelup:if(ERS_Block.level < 10){ 

ERS_Block.level++; 

ERS_Block.levelField.setText(""+ERS_Block.level); 

ERS_Block.score = 0; 

ERS_Block.scoreField.setText(""+ERS_Block.score); 

scr.requestFocus(); 

break; 

case button_leveldown:if(ERS_Block.level > 1){ 

ERS_Block.level--; 

ERS_Block.levelField.setText(""+ERS_Block.level); 

ERS_Block.score = 0; 

ERS_Block.scoreField.setText(""+ERS_Block.score); 

scr.requestFocus(); 

break; 

case button_pause:if(pause_resume){ 

ERS_Block.timer.suspend(); 

pause_resume = false; 

}else{ 

ERS_Block.timer.resume(); 

pause_resume = true; 

scr.requestFocus(); 

break; 

case button_quit:System.exit(0); 

//方块类 

class Block { 

static int[][] pattern = { 

                                                                沈  阳  大  学

课程设计说明书                 NO.23

{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; //块的模式号(0-6) 

int turnState; //块的翻转状态(0-3) 

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); 

                                                                沈  阳  大  学

课程设计说明书                 NO.24

//实现“块”的左移的方法 

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++){

                                                                沈  阳  大  学

课程设计说明书                 NO.25

if((int)(pattern[t][s]&k) != 0){ 

int temp = scr.getScrArrXY(row-i,col+j); 

if (temp<0||temp==2) 

return false; 

k = k >> 1; 

return true; 

//同步显示的方法 

public synchronized void dispBlock(int s){ 

int k = 0x8000; 

for (int i = 0; i < 4; i++){ 

for(int j = 0; j < 4; j++){ 

if(((int)pattern[blockType][turnState]&k) != 0){ 

scr.drawUnit(row-i,col+j,s); 

k=k>>1; 

//定时线程 

class MyTimer extends Thread{ 

GameCanvas scr; 

public MyTimer(GameCanvas scr){ 

this.scr = scr; 

public void run(){ 

while(true){ 

try{ 

sleep((10-ERS_Block.level + 1)*100); 

catch(InterruptedException e){} 

if(!scr.getBlock().fallDown()){ 

scr.deleteFullLine(); 

                                                                沈  阳  大  学

课程设计说明书                 NO.26

if(scr.isGameEnd()){ 

ERS_Block.isPlay = false;

suspend(); 

}else 

scr.getBlock().reset(); 

class WinListener extends WindowAdapter{ 

public void windowClosing (WindowEvent l){ 

System.exit(0); 

}

                                                                沈  阳  大  学

课程设计说明书                 NO.

                                                                沈  阳  大  学

课程设计说明书                 NO.

                                                                沈  阳  大  学

课程设计说明书                 NO.

                                                                沈  阳  大  学