基于JAVA技术的俄罗斯方块游戏的设计与实现

基于JAVA技术的俄罗斯方块游戏的设计与实现
基于JAVA技术的俄罗斯方块游戏的设计与实现

目录

摘要 (1)

关键词 (1)

1 前言 (1)

2 需求分析 (2)

2.1 系统开发环境 (2)

2.2 系统玩法及规则 (3)

2.3 系统设计分析 (4)

2.4 注意事项 (5)

3 概要设计 (5)

3.1 系统介绍 (5)

3.2 系统简单设计 (6)

3.3 系统功能设计 (6)

3.4 系统流程 (8)

4 系统详细设计 (9)

4.1 设计游戏框架 (9)

4.2 设计游戏界面 (12)

4.3 游戏内容设计 (13)

4.3.1 方块描述 (13)

4.3.2 地图描述 (15)

4.3.3 地图方块阻碍描述 (16)

4.3.4 满行判断及删除 (16)

4.3.5 线程控制的实现 (16)

4.3.6 控制游戏开始 (17)

4.3.7 控制游戏暂停 (17)

4.3.8 控制游戏结束 (17)

4.3.9 控制方块自动下降 (18)

4.3.10 预备方块区的上移效果 (19)

4.3.11 键盘事件处理 (19)

4.4 游戏其它功能的实现 (19)

4.4.1 添加状态栏 (19)

4.4.2 添加关于对话框 (20)

4.4.3 添加音响效果 (22)

4.4.4 得分情况封装 (23)

4.4.5 成绩的录入 (25)

5 系统实现 (27)

5.1 登入界面 (27)

5.2 游戏主界面 (28)

5.3 游戏结束显示框 (29)

5.4 成绩排行榜 (30)

6 系统测试 (30)

6.1 测试举例 (30)

6.2 测试项目 (31)

6.3 测试方法 (32)

7 设计小结 (33)

7.1 出现的问题及解决方法 (33)

7.2 游戏存在的不足 (35)

7.3 结论 (35)

参考文献 (36)

致谢............................................... 错误!未定义书签。附录 (38)

基于JAVA技术的俄罗斯方块游戏的设计与实现

摘要:俄罗斯方块是一款非常经典的游戏,曾经风靡全球,经久不衰,相信不少人都玩过,同时也是我们学习面向对象编程思想的理想实例。现在面向对象的编程语言很多,都可以通过编程来实现。本设计介绍的是用Java语言设计一个俄罗斯方块游戏的全过程,整个游戏系统是一个应用程序,不再是嵌入到网页里的那种小应用程序,并使用了Swing组件,使得界面更具有专业效果。游戏设计过程中涉及到游戏框架、游戏界面的编写、菜单处理、变量的定义、算法设计以及预览功能的实现。同时,还为游戏添加了其他功能,如设计About对话框,实现游戏分数的存档,为游戏添加状态栏等。通过本次毕业设计可以学到如何定义类和类成员及其方法;并如何使用JBuilder 来创建工程;如何创建一个对话框,并将对话框和主应用程序联系起来共同使用。

关键词:俄罗斯方块;Java;应用程序;Swing组件

The Design And Implementation Of A Tetris Game Based On Java

Technology

Abstract:Tetris is a classic and durable game, and it has been popular all over the world. Believeing it has been played many of people. and meanwhile it’s an ideal sample for leaning object-oriented programming. It can be implemented by different object-oriented programming languages that exists nowadays. This thesis describes the implementing process of this game in java language, which is implemented in application form instead of applet that embedded in the web pages. The use of swing component makes the interface look more professional.The process of game programming involves the design of game frame and game interface, menu design, the definition of variable, arithmatic design and the implementation of preview function. Meanwhile, others are also added, such as the About dialog, status bar, and the function of game scores saving. A lot can be learned in the process of programming, such as how to define the classes and its members and functions, how to build a project in JBuilder, and how to implement a dialog box, and how to connect dialog box to the main frame of using together.

Key words:Tetris; Java; application; swing component

1 前言

计算机游戏如同戏剧、电影一样,是一种新型的综合性艺术产品,计算机游戏软

件的开发和一般的软件产品的开发有着明显的不同,计算机游戏程序设计人员不仅需要掌握程序设计的技巧和软件工程方法,还需要有坚实的专业领域知识,才能有效地生成和实现游戏的画面内容、音效处理等。

近来,Java游戏在提供个人娱乐方面变得越来越流行,这种流行给游戏出版商带来丰厚的利润。JAVA游戏在给游戏开发者和相关人员带来无数商机的同时,也处于极为重要的枢纽位置。据估计,到2009年,全世界的Java游戏玩家有望达到两亿两千万之多, Java游戏开发将被规划并扩展到一个更高的层次。同时,俄罗斯方块可以说是一款非常流行且历久弥新的老游戏,风靡全球,经久不衰。究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解而喜欢上它的。它之所以如此耐玩,主要在于它拥有简单的控制(只需上下左右方向键)、简单的游戏规则(有空就移,有满行就删除)及刺激的游玩过程(方块下降的速度因等级而变化)等。

俄罗斯方块这款游戏最初是由苏联的游戏制作人Alex Pajitnov制作的,它看似简单但却变化无穷。相信大多数玩家都还记得为它痴迷得茶饭不思的那个俄罗斯方块时代。这款游戏除了好玩之外,在程序设计上也有多处值得学习的地方,如方块的旋转处理、绘图的应用及双重显示缓冲区的使用等。整个游戏在设计上偏重逻辑的运算,其次为绘图及使用者接口的控制,在游戏设计过程中可以了解到对象的设定、绘图的技巧等。俄罗斯方块无论从操作过程或程序设计来看,都是一款既好玩又可以在设计过程中享受成就的好游戏。

一个完整的俄罗斯方块游戏,要求带有多关卡设置、计分统计、伴有音响效果和背景音乐,可以控制游戏的开始、暂停和重玩,并具有一定的自动演示功能。同时,还要为游戏添加其他功能,如设计About对话框,实现游戏分数的存档,为游戏添加状态栏等,并要求使用图形用户界面,界面色彩、布局要求美观,操作流畅。主要涉及到图形用户界面的图形绘制,整个程序采用Swing图形界面,要求熟练掌握Java2图形用户界面的事件处理及部分Swing组件的使用。在代码的编写上要考虑代码重用的思想,要深入理解抽象类和接口的作用等。

2 需求分析

2.1 系统开发环境

当今,运用Java语言来开发一些小游戏已经非常普遍,而一些中型游戏有时也可在网络上见到。Java程序本身无论是在绘图、网络、多媒体等方面都提供有相当多的API链接库,甚至包括了3D领域,所以使用Java程序来设计程序可以获得相当多的资源。而Java程序可以使用Applet来实现的属性,更使得它拥有更大的发挥空间;另

一方面,目前有许多桌面游戏,也逐渐用Java来进行开发,这也是我选择Java开发的原因。

Borland JBuilder是一种处于市场领先地位的跨平台开发环境,支持最新的Java标准,并且缩短了开发周期。新增的功能有从输入的EJB代码中生成EJB块,并且增强了EJB2.0设计器。JBuilder一直以其友好的集成开发环境在业界受到广泛的赞誉,这也是JBuilder一直是广大程序员最喜爱的Java开发工具的原因之一。

JBuilder的可视化集成开发环境包括文本编辑器、工程创建工具、对象浏览器和调试器等。用户可以在集成开发环境中创建工程和打开工程,建立、打开和编辑文件,并可以编译、运行和调试应用程序。可以说在JBuilder中开发Java程序,快速而且高效。

2.2 系统玩法及规则

游戏的玩法及规则,关系着游戏本身的刺激性及耐玩度,本游戏除了基本的控制方式及规则外,还适度地增加了一些控制及规则,以便能更好地操作游戏和增强它的耐玩度。本游戏在控制上主要采用键盘输入的方式,相关控制键如下表1所示。

表1 玩游戏时使用键盘的相关控制键

Table 1 Using related control key of the keyboard to control game

at the play game

按键说明

↑方块方向变化

↓方块下降

←方块左移

→方块右移

Space 方块直接降落到底部

续表1

按键说明

Pause 游戏暂停

Esc 游戏结束

如表1所列,除了一般的控制外,还新增了space(方块直接降落)等按键,这些按键都是有效加快游戏进行的控制键,其它的助记符和快捷键不再介绍。

游戏的规则如下表2所示。

表2 游戏的规则

Table 2 The rules of the game

规则说明

方块移动方块会持续向下移动直到无法降落为止,使用者可按相应方向键控

—制方块向左、向右、向下移动,当按向上方向键方块会作90度的旋

—转。移动时,预备移往的区域必须符合现在方块的方向及所占区域。

计分每次删除行数的立方乘以25再乘速度等级所得积的总和

速度等级越高速度越快

预备方块一次提示三个

如表2所示,计分方面采用线性增加的方式,这样使得游戏设计简便,再搭配3个预备方块提示,玩家更会考虑再排列方块。

2.3 系统设计分析

Java为纯面向对象(Object-Oriented,OO)的程序语言,它的诸多优点在此就不作论述了。从面向对象的观念出发,本程序可分为以下几个对象:

·方块类型数据

·程序运算逻辑

·绘图

·显示平台

分析对象的技巧在于它的重复利用及维护效率。试想,若要把设计出来的程序在不同的显示平台(浏览器或手机)上执行,就要作大幅度的更动甚至重写,这样就失去了面向对象属性,所以本程序分析时将不变与易变的因素分别做成对象,如方块类型数据及程序运算逻辑就是不变的项目,而绘图及显示平台会因为环境而有所不同属于易变的项目。

①方块类型数据

方块类型虽然形状不同,但状态与行为都是相同的,如下表3所示。利用对象的继承属性与不同形状的特点,定义一个基础方块类(SuperBrick),其他的方块类继承此类并产生派生类,然后再重新定义表示方块形状的变量数据,就可产生新的方块样式。如果要再新增不同的方块样式,只要再派生出不同的方块类即可。

表3 方块的状态和行为

Table 3 The state and behavior of box

对象要素说明

状态记录方块形态的变量

行为方块作90度旋转的方法

②程序运算逻辑

程序中逻辑运算通常只作数值的运算及分析,如方块移动时阻碍判断、方块满行判断、删除判断、方块移动或事件响应、成绩的排序等。

③绘图

绘图会因为显示平台的不同而有所不同,例如在单机与手机上的显示环境不相同,或显示效果会有所不同,例如游戏的样式作修正时,即可产生出不同的显示效果。

④显示平台

“可移植性高”是Java的属性之一,Java的应用涉及许多领域,如手机、PDA、单机程序及浏览器等,不同的平台对于它的设定不尽相同,若将显示平台独立为一个类,将有助于主程序的完整性及移植程序的快速性。

2.4 注意事项

游戏在设计时除了将程序切割成多个对象外,在游戏的逻辑运算上应尽可能做到弹性化。所谓弹性就是方块地图的长与宽都应该可以用参数来改变,下面就是参数定义部分代码。

public final static int BRICK_COLS = 16; //方块的列数

public final static int BRICK_ROWS = 20; //方块的行数

3 概要设计

3.1 系统介绍

俄罗斯方块是一个传统的游戏,这个游戏是考验玩家的反应灵敏度和几何图形的一种直觉,想必大家一定都玩过。下面简单介绍我们要编写的这个游戏的功能。

游戏的主要功能如下:

·当游戏程序打开时,有一个登入页面,用来反应游戏的加载情况。

·游戏当然可以让玩家操纵方块来玩,这里设计用方向键和空格键来控制方块,向上键为90度旋转方块,空格键为直落方块,每种类型的方块都有各自不同的图片。

·游戏能够在玩的过程中,给出玩家的等级、分数和消除的行数。

·游戏有暂停、开始和结束等控制。

·可以让玩家来调整游戏的速度级别和障碍级别。

·可以让玩家调整游戏的声音,其包括背景音乐和音效。

·在游戏结束时,如果玩家的分数进入了前10名,则提示玩家输入名字,并将玩

家的名字存入档案之中。

游戏的功能结构如下页图1所示。

3.2 系统简单设计

由于我们要将这个游戏写成一个应用程序(Application),所以首先要设计一下游戏的主框架和菜单。

游戏的主框架采用标准的Windows框架,在上面有标题栏、菜单栏、工具栏,以方便玩家控制游戏。我们应该先做好这一部分。菜单栏和工具栏分别放菜单和工具条,这里应包括游戏的开始、暂停、重新开始、结束等控制菜单和工具。在框架的底部还应该放进去一个状态栏,用来显示游戏的当前状态。

我们需要对菜单和工具栏的操作进行响应,并相应地来控制游戏。这时我们需要添加对菜单和工具栏的事件响应方法。然后,应该在一个面板上构建游戏的界面,将这个面板嵌入到游戏的大框架里。游戏的界面包含以下三部分:一是游戏活动区;二是游戏预备方块显示区;三是成绩显示框。这样整个游戏的主界面就出来了。在游戏面板构建好之后,我们应该让游戏能够玩起来,这一部分主要是编写一些算法,用来控制游戏。这里我们还应该增加对键盘事件的响应,让玩家能够控制游戏。最后,我们再来改进这个游戏,使得在游戏结束时能够判断玩家的分数在存档内是不是前10名,如果是,则将玩家的分数存档。

3.3 系统功能设计

⑴登入页面

由一张图片和一个进度条组成。

“图片”:用来显示游戏的一些信息。

“进度条”:用来显示游戏进入主程序的时间。

图1 游戏功能结构图

Fig l The functional structure chart of the game

由菜单条、游戏面板和状态栏组成,分别说明如下:

① 菜单条:1、“游戏”菜单,包含2个菜单项和1个子菜单组成。

“开始游戏”:用来选择游戏版本和运行游戏。

“放弃游戏”:用来退出当前游戏,返回主页面。

“退出游戏”:用来退出程序。

2、“设置”菜单,它包含6个菜单项。

“暂停游戏”:用来暂停游戏,再次点击时可以取消暂停。

“重新开始”:用来重玩游戏。

“速度等级”:用来选择游戏的难易级别。

“障碍等级”:用来选择游戏的障碍级别。

“播放背景音乐”:用来播放场景音乐,版本不同,音乐不同。

“播放音效”:用来播放一些触发音乐,它随着版本不同而异。

3、“成绩”菜单,它只包含1个菜单项。

“排行榜”:用来查看分数为前10名的玩家信息。

4、“帮助”菜单,它包含2个菜单项。

“游戏文字说明”:以文字的形式,说明游戏的功能和玩法。

“关于”:用来显示游戏的一些版本信息。

② 游戏面板:1、“方块活动区”,方块程序在里面进行。

2、“预备方块显示区”,用来显示预备的三个方块组。

3、“成绩状态显示区”,用来显示游戏级别、分数和消除的行数。

③ 状态栏:用来显示游戏的状态,它包含有三个状态:游戏装载完毕、游戏运行中及暂停游戏。

⑶游戏结束页面

由游戏结束显示框和输入个人信息显示框组成。

①游戏结束显示框:用来显示游戏已经结束,并让玩家选择是保存信息,还是退出游戏。

②输入个人信息显示框:用来输入玩家的一些个人信息,保存在成绩表中,并退出程序。

3.4 系统流程

游戏流程如下页图2所示。

图2 游戏流程图

Fig 2 Flowchart of game

4 系统详细设计

4.1 设计游戏框架

AWT最初的设计目标是让程序员构建一个通用的图形用户接口(GUI),但是,这个目标并没有达到。在Java 1.0抽象窗口工具包产生的是在各个系统看来都欠佳的图形用户接口。除此之外,它还限制只能使用4种字体,限制我们不能够访问操作系统中现有的高级GUI元素。在Java1.1里,对抽象窗口工具包进行了很好的改进,更加清晰、面向对象的编程使得我们使用起来更加方便。在Java1.2里,又增添了Java的基础类(JFC),这是一个被称为Swing的GUI的一部分。Swing的使用方法很简单,类似AWT包里类的使用方法。

⑴编写游戏框架

先使用JBuilder新建一个项目,这次我们将使用最简单的方法建立应用程序框架。先建立一个工程,将工程的名字命名为winimagetetirs。

在JBuilder的主菜单中,选择File主菜单→New子菜单项→General选项卡→Application选项,点击OK按钮,进入应用程序向导对话框。在对话框中规定应用程序主类的名称为:AppMain,如下图3所示。

图3 创建Application的向导界面1

Fig 3 The first wizard interface of building application

接下来我们要命名程序界面框架的名称。在当前的对话框中点击Next按钮,进入应用程序向导第二步,在这里命名Frame类的名称和标题分别为FrameMain和winimagetetirs,如下图4所示。接着点击Finish按钮,JBuilder就为我们建立好了一个应用程序框架。这个应用程序框架中有一个主类AppMain和一个界面框架类FrameMain。

我们还要写一个方法,用来初始化窗口的大小和位置,代码如下:

窗口位置代码:frame.setLocation((screenSize.width-frameSize.width) /2,

(screenSize.height - frameSize.height) / 2-12);

窗口大小代码:this.setBounds(0, 0, game_area_width + info_area_width + 12,

game_area_height + 59+28);

我们应该在构造方法里调用这个方法。关掉系统可以调用System.exit()方法,关掉整个窗口可以使用Frame.dispose()方法。

图4 创建Application的向导界面2

Fig 4 The second wizard interface of building application

⑵为游戏编写菜单项

游戏的菜单包含“游戏”、“设置”、“成绩”、“关于”4个主菜单。

我们使用UI设计器中的菜单设计器来进行菜单项的编辑。我们应该对界面类FrameMain进行编辑,因为这个类用于界面的显示,所有的组件都要添加在这个类中。

下面打开FrameMain类,然后进入UI编辑器。组件是添加在组件容器里的,菜单项组件的容器就是菜单条(MenuBar)。在工具条中单击Swing Containers标签。在其中选择组件javax.swing.JMenuBar,添加到界面上。然后在屏幕左下角的概要浏览器中打开Menu目录,就会看到添加好的菜单条对象jMenuBar1。双击对象jMenuBar1,进入菜单编辑界面。

菜单项的编辑十分简单,点击空白的菜单项,然后直接键入菜单项的名称即可。如果想要插入分隔符,可以使用上方菜单中的“插入分隔符”选项。每一个子菜单项我们都确定了对应的名字,如下表4所示。

表4 菜单项的设置

Table 4 The setuping of menu items

在添加完菜单项的代码后,然后把菜单项加入到界面中:

this.setJMenuBar(jMenuBar1);

⑶为菜单添加事件响应

上面己经做好了菜单,下面要为每个菜单都添加事件响应。

我们用ActionListener接口来做菜单的事件响应。ActionListener是用来接受一个动作事件的。用来处理这些动作事件的类要实现这个接口里的方法,这个类要被发生动作的事件类用addActionListener()方法来注册。当动作事件发生后,用来处理这些动作

主菜单名称子菜单名称子菜单名称

游戏MenuGame 开始游戏MenuGameBegin蓝色天空MenuGamemode2

巴乔传奇MenuGamemode1

放弃游戏MenuGameQuit

退出游戏MenuGameExit

设置MenuSetup暂停游戏MenuPause

重新开始MenuRestart

速度等级MenuLevel 一级MenuLevel1

二级MenuLevel2

三级MenuLevel3

四级MenuLevel4

五级MenuLevel5

障碍等级MenuLeve2初级MenuLeve21

中级MenuLeve22

高级MenuLeve23

播放背景音乐MenuBkMusic

播放音效MenuCkMusic

成绩MenuGrade 排行榜MenuGradeList

帮助MenuHelp游戏文字说明MenuHelpAbout1

关于MenuHelpAbout

事件的actionPerformed()方法将被调用。

4.2 设计游戏界面

上一节我们己经将游戏的框架编写好了,下面我们将开始写游戏面板的界面。我们设计将游戏写在三个Panel上面。

我们再新建三个类,让它们从javax.swing.jpanel里继承,将它命名为GamePanel、StatusPanel和InfoPanel,游戏的主要功能都要在这些类里实现。下面以GamePanel面板为例。

⑴在Panel中加入必要的常量和变量

我们应该定义三个变量,用来反映游戏的等级、分数和消除的行数。它们定义的都是静态常量。

static long GAME_LEVEL; //纪录游戏等级

static long GAME_SCORE; //纪录游戏分数

static long GAME_LINE; //纪录游戏消除行数

我们应该定义左边用来显示的游戏区的区域的宽度。见下面这行代码:

int GRIDX; //x轴格数

int GRIDY; //y轴格数

下面这行代码定义了每个小方块的宽和边:

int BRICK_WIDTH; //单一砖块_宽

int BRICK_SIDE; //单一砖块_边

⑵在Panel上画出游戏界面

下面我们使用Panel的paintComponent() 方法,画出一个游戏的简单界面。

我们应该在Panel的构造方法里将Panel的背景图片初始化,将地图数组归零;并且为必要的变量赋上一个初始值等等。然后我们就应该在paintComponent()方法里写一些功能代码,让整个Panel能够画出一个初始的界面来。

⑶将Panel加到框架里去

我们应该将Panel加到框架里,将Panel加到框架中的方法为add(Component c)。关键代码如下:

gamePanel = new GamePanel(this,0, 0,BRICK_COLS, BRICK_ROWS,

BRICK_WIDTH,BRICK_SIDE,

BRICK_NEXT_NUM,true);

PanelGame.add(gamePanel, BorderLayout.CENTER);

4.3 游戏内容设计

4.3.1 方块描述

传统的方块类型大致上可分为7种,如下图5所示。

图5 方块类型

Fig 5 The box types

不管何种类型的方块,都可以用一个5×5的二维数组来记录方块状态,如下图6所示为实际图形与数组的对照。

图6 实际图形与数组的对照

Fig 6 The compare of the actual graphics and array

每个方块都会有4种不同角度的形状,若以倒T型为例,方块会有4种变化,如下图7所示。

图7 T型方块的4种变化

Fig 7 The four changes of T-block

如上所示,为了记录每种方块类型4种不同角度的变化,记录方块形状的数组必须改为三维,增加的一维主要用来记录不同角度,依此规则可以定义出一个描述方块的基础类:

public class SuperBrick { }

并定义一个纪录方块组数据数组:

public int BRICK_ARRAY[ ][ ][ ];

三维数组产生后必须利用3层的嵌套循环将数组值设定为0,然后再依方块形状分别定义数组值,如倒T型则必须将以下4个数据值设为1。

BRICK_ARRAY[0][2][1] = 1; //倒T型

BRICK_ARRAY[0][1][2] = 1;

BRICK_ARRAY[0][2][2] = 1;

BRICK_ARRAY[0][3][2] = 1;

因为定义方块的4个数据值会因为方块类型的不同而有所变化,所以定义数组值的叙述应该以方法(method)的形式。当定义新方块类型时,只要继承基础类再覆盖(override)此方法重新定义数值即可。

完成单一方块的一种角度定义之后,还必须定义其他3个角度的数组值,各位也许可以逐一定义。不过算一算一种方块就必须定义16个数组值,若是7种方块则总共需要定义112个,这样不仅没效率,而且还可能出错。这时候就会发现为何当初会以5×5的数组来记录方块,因为惟有奇数长度的矩形数组才有中心点,依此中心点再利用二层嵌套循环,即可使数组作90°的旋转,数组旋转可分为顺时针及逆时针两种:逆时针:BRICK_ARRAY[i][x][y] = BRICK_ARRAY[i - 1][4 - y][x];

顺时针:BRICK_ARRAY[i][x][y] = BRICK_ARRAY[i - 1][y][4 - x];

方块旋转时必须注意,“一字型”及“Z字型”方块不适合以顺时针的方式完成4个角度的旋转,若以顺时针旋转“Z字型”方块,则会产生如下图8所示的图形。

图8 以顺时针旋转Z字型方块产生的图形

Fig 8 The graphics from Z-block in the clockwise rotating

从图8中可看出,A和C看起来相同,但是方块却在不同的Y轴坐标上,B和D 则在不同的X轴坐标上,这是由于数组是以坐标(2,2)为中心进行旋转的,像这样在游戏进行时,会产生视觉上的不协调。为了避免这种情形,可以在方块数组数据旋转时,采用一顺一逆的旋转方式,这样所产生的数组数据就只会有两种类型。

本程序的每一个方块组都是由几个小方块组成,而每个方块都是由一张随机产生的图片组成,这样使得游戏更加生动。

4.3.2 地图描述

地图是指方块所能移动的区域。地图是以二维数组的方式设计而成的,当方块无法下降时,方块数组数据以相对应的方式填入到地图数组中。地图除了要一个二维数组来记录数据外,还需要一个记录方块图片的二维数据数组,数据类型为Image对象,在显示地图方块时只要地图数组值为1,再取得同样数组值的图片数组值,即可通过绘

图方法显示出正确的小方块图示。

4.3.3 地图方块阻碍描述

当方块在地图区移动时,若预备移往的区域无法置放方块,称为方块阻碍。方块阻碍判断的方式很简单,只要通过一个二层的嵌套循环即可完成检查,如下图9所示为一个方块在地图上移动。

图9 方块移动的坐标变化

Fig9 The coordinate changes of moving block

如上图9所示,若此时方块欲向右移动一格,可以检查地图数组中坐标为(4,3)到(8,7)所构成的矩形区域。当方块数组中值为1,地图数组上相对位置为0时,则不会造成方块阻碍。检查方块阻碍的方法为isPut()。在检查方块阻碍时必须注意,方块数组相对于地图数组坐标时,有可能会超出地图数组,所以在上式中加入了防止超出数组长度的机制。

4.3.4 满行判断及删除

当小方块填满Y轴中任何一行时即造成“满行”情形。当方块无法降落时,必须检查是否有满行,若有则必须删除该行方块,满行的检查可以通过二层的嵌套循环。确定该行发生“满行”情形时,必须将该行数据移除,移除的动作在游戏画面上像是方块往下降,但在实际的数据演算中,只是将数组中该行以上的数组数据向下移动一行,等全部数组移动完毕后再一次重新显示地图上方块的分布情形。

数据移动时必须以被取代数组值等于取代数组值的方式,因为每次只取代一行,当取代完毕时,Y轴为0的行数必须再将数组值设为0,才算完成整个地图数组移动。4.3.5 线程控制的实现

在这个游戏里,方块组可以自己不停地往下走,碰到下面的方块后就会在顶部产生一个新的方块组,它继续往下走,一直到整个方块组刚一产生就没有路可走的时候,

游戏就结束了。鉴于游戏的这个特点,我们打算用线程来控制这个游戏。

首先声明要实现Runnable接口。

public class GamePanel extends JPanel implements Runnable{}

然后增加一个线程的成员。

Thread DownThread; //线程

我们应该定义一个run()方法,在run()方法中,加入要让游戏做的事情。我们主要是打开线程和控制方块下降的速度。

4.3.6 控制游戏开始

我们定义了一个游戏开始的方法,在一个方法内调用了restartGame()方法,restartGame()方法用来重新初始化游戏及打开线程。接着在开始的方法中编写了产生下一砖块组数据、显示提示方块组及新增一个提示方块。

4.3.7 控制游戏暂停

这个功能可以通过一个boolean参数来确定游戏是暂停,还是继续游戏。首先我们定义一个boolean参数,如果它的值为false,则创建线程及打开线程;如果它的值为true,则暂停游戏。其代码如下:

//暂停或继续游戏

public void pauseGame(boolean paused){

gamePaused = paused;

if(paused == false){

DownThread = new Thread(this);

DownThread.start();}

}

4.3.8 控制游戏结束

让游戏结束的办法也很简单,我们设定参数gameOver为true,用gameOver旗标来判断游戏是否更新游戏数据、重新刷新地图及重新绘制背景;设定参数gameStarted 为false,用gameStarted旗标来判断游戏是否显示提示方块组、更新游戏数据、重新刷新地图、显示下一个砖块组及重新绘制背景;定义线程为空;再调用Score类,用来判断得分是否进入前10名,如果进入则显示InsertPanel对话框,否则显示MessageBox 对话框。其代码如下:

public void GameOver(){

gameOver = true;

gameStarted = false;

DownThread = null;

Score score = new Score();

if (score.isScoreTop(GAME_SCORE))

{ FrameMain.insertScoreReport(GAME_SCORE);}

else{ showOverMessage();}

}

4.3.9 控制方块自动下降

俄罗斯方块游戏的刺激性来自于方块的降落,方块降落时间控制适当,将使得游戏增色不少。也许各位曾经使用过Visual Basic(以下简称VB)作为程序开发环境,VB提供了控制时间的Timer组件,只要设定Timer触发时所应做的工作,程序就会依触发时间执行。在Java环境中没有类似VB的Timer组件,不过可以使用Thread对象来仿真固定时间触发模式,程序片段如下:

public void run() {

if(gamePaused==false){

try {Thread.sleep(10);

delay = delay + 1;

if (delay >= (GAME_SPEED / GameLevelRatio)) {

delay = 0;

keyPress(KeyEvent.VK_DOWN);

DownThread = null;}

DownThread = new Thread(this);

DownThread.start();

repaint();}

catch (Exception e) {e.printStackTrace();}

}

}

如上所示,无论使用继承Thread对象或是Runnable接口的方式,都必须先覆盖run()方法,run()方法执行时先让thread进入休眠状态,休眠时间即是方块降落的间隔时间,休眠结束后执行方块下移的动作,并产生及执行本身的线程,如此周而复始即可达到定时触发方块下移的效果。

俄罗斯方块游戏的开发需求分析

俄罗斯方块游戏的开发 组长:XXX 组员:XXX XXX XXX XXX 05软件工程一班 一、课程设计的目的和意义 俄罗斯方块游戏是一个经典的小游戏,由于它简单有趣,因而得到了广泛的流行,男女老幼都适合。而俄罗斯方块游戏的设计工作复杂且富有挑战性,它包含的内容多,涉及的知识广泛,与图形界面联系较大,包括界面的显示与更新、数据收集等,在设计的过程中,必将运用到各方面的知识,这对于visualbasi语言设 计者而言,是个很好的锻炼机会。 二、系统功能设计 本系统主要设计以下几种功能 1、游戏难度选择功能 游戏难度选择界面设置在程序运行开始时,一共有九种难度供玩家选择,每选一级难度,都会相应地显示出代表该难度的图片。开始时不设置任何默认的难度,如果玩家不选难度直接按“Enter”进入,将会弹出提示框,提示其先选难度再 进入。 2、方块下落、变形功能 在整个俄罗斯方块游戏中,方块的设计是核心。这里设计了一个方块类:Square(),用来生成方块以及实现块的左移、右移、向下、变形、重画、同步显 示、初始化新块等。 3、自动升级功能 当分数累积到一定大小时,系统将自动为玩家提高难度。这里设置了每消除10行方块,就增加一级难度。当难度增加的时候,方块会相应地改变颜色,以作为 对玩家的提示。 4、游戏音乐功能 游戏开始音乐就自动播放,游戏暂停与结束时音乐相应消除。 5、获取帮助功能 这里设置了一个类,用来显示帮助,按F1键就能弹出窗口,显示游戏规则。

三、系统功能设计分析 俄罗斯方块游戏根据功能的不同,设置了如下12个类:Square,Command, GameArea,GameSetting,GameOver,Help,ImagePanel,JieMian,MyPanel, MyTimer,PlayMidi,WinListener,每个类的描述如下: 1、Square,方块类。这个类中定义了生成方块的方法,用二维数组int[][]pattern,存放7种方块的四种状态。在构造方法中以随机的形式生成方块,同时提供了以下几种方法:reset(),leftTurn(),leftMove(),rightMove(),fallDown(),assertValid(int t,int s,int row,int col),dispBlock(int s)。分别实现方块的重画、翻转、 左移、右移、下落、同步显示等功能。 2、Command,处理控制类。这是一个实现ActionListener接口的类,主要处理点击按钮事件。类中定义了三个int型变量:button_play,button_quit,button_pause,和一个boolean型的变量:pause_resume,并赋值。在GameArea类中通过事件响应,在按钮执行方法中调用其值,使用switch语句,根据不同按钮不同的值, 来响应不同的事件。 3、GameArea,游戏界面类。GameArea继承了JFrame,是俄罗斯方块的主要游 戏界面。这个类定义了GameSetting类的gameScr对象和ImagePanel类的imagepanel对象作为游戏区域面板和控制区域面板。在游戏区域,主要是根据相应格子的设置标志来显示相应的图形图片,这样就实现了俄罗斯方块的实时显 示。 4、GameSetting,游戏画布类。这个类生成的对象将作为游戏界面的方块下落区域,画布的设置为15行10列,当中的方格边长为30,类中还定义了一个二维数组int[][]scrArr作为屏幕数组,表示每一个方格。游戏区域中每一个方格是否存在游戏方块是由该方格的值来决定的,如果该方格的值为1,则表示该方格中存在游戏方块;如果该方格中的值为0,则表示该方格中不存在游戏方块,因此二维数组用于记录游戏区域中每个小方格的值。此外,类中还定义了画方块的方法,根据不同的难度画出不同颜色的方块。单击Play按钮时,系统调用initScr()方法,初始化屏幕,将屏幕数组清零。当满足满行删除的条件时,系统调用deleteFullLine()方法,进行删行加分,而且每删除十行,难度自动增加一级,方块颜色改变,并在难度显示框中相应显示。 5、GameOver,游戏结束弹出提示框类。当游戏结束时,系统弹出提示,包括玩 家分数以及询问玩家要继续游戏还是退出。 6、Help,帮助类。在游戏界面,按F1键,弹出提示窗口,获取帮助。 7、ImagePanel,背景图片类。这个类继承了JPanel类,用来作为游戏界面中控 制区域的容器,并添加图片。 8、JieMian,主界面类。这个类继承了JPanel类,作为游戏的第一个界面,也是难度选择界面。定义了9个单选按钮,当玩家未选任何难度就按Enter时,系统会弹出一个提示框,提示玩家先选难度再进入。 9、MyPanel,重写MyPanel类,使Panel的四周留空间。

俄罗斯方块软件需求规格说明书

软件需求规格说明书 1306401-35 王正 一、引言 1.1编写目的 通过本游戏的设计,综合自己在校期间所学的理论知识,设计开发俄罗斯广场游戏,使自己熟应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,进一步巩固和加强自身对编程语言知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。 1.2项目背景 游戏是人们活动中一项非常重要的内容,有人认为如果哪一天人类对所有的游戏都失去兴趣,恐怕世界的末日就要到了。电脑对游戏的贡献有目共睹,现在摸索电脑的人很少没玩过电脑游戏的,喜欢游戏的人也很少不玩电脑的。 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。随着计算机的发展而发展,俄罗斯方块不断推陈出新,深爱广大玩家喜爱。这个游戏有的简单,有的复杂,但其根本原理是一样的都是对运动的方块进行组合,

来训练玩家的反应能力。因此开发此游戏软件可满足人们的一些娱乐的需求。 此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。 此次需要开发一项软件,在通过认真的考虑之后,决定做一个“俄罗斯方块”,对于我个人来说,这是一个相当具有挑战性的任务,也是一次不错的锻炼机会。 1.3定义 (1)游戏区:玩家可以在游戏区中堆积方块,并能够在游戏过程中随时了解得分情况。 (2)游戏控制:玩家可以通过游戏控制功能来选择开始新的一局游戏,暂停或退出游戏。 (3)级别设置:玩家可以根据自己的需要自行设定游戏的开始级别,级别越高,游戏的速度越快,难度越大。 1.4参考资料 [1]朱福喜著,JAVA程序设计技巧与开发实例[M] 北京:人民邮电出版社,2004.2 [2] 张海藩软件工程(第五版) 北京:清华大学出版社,2008

俄罗斯方块游戏

俄罗斯方块游戏设计规格说明 Ver:1.0

目录 1 引言 (3) 1.1 目标 (3) 1.2 文档范围 (3) 1.3 术语和缩略语 (3) 1.4 参考资料 (3) 2 系统设计 (4) 2.1 逻辑流程视图 (4) 2.1.1 功能模块流程图 (5) 2.1.2 核心模块代码流程图 (5) 3 质量及其他方面 (6) 3.1 可维护性 (6) 3.2 安全性 (6) 3.3 可扩展/灵活性 (6) 3.4 稳定性/可靠性 (6) 3.5 可用性/用户体验 (6) 4 附录 (6) 4.1 附件 (6) 4.2 修过记录 (7)

1引言 1.1目标 通过编写俄罗斯方块游戏学习使用SDL图形库,从而掌握图片的显示方法,声音的播放方法,使用vs应用第三方产品的方法以及软件设计的方法和算法设计的方法。另外,程序的编写也能够进一步熟悉C语言编程方法,有利于提高编程兴趣并获取成就感,为后续课程的开展打下更好的基础。 1.2文档范围 项目目的,设计说明、使用说明。 1.3术语和缩略语 SDL:是Simple DirectMedia Layer缩写,SDL是一个自由的跨平台的多媒体开发包,适用于游戏、游戏SDK、演示软件、模拟器、MPEG播放器和其他应用软件。 1.4参考资料 a)SDL官方文档 b)https://www.360docs.net/doc/3414775532.html,/space.php?uid=7773715&do=blog&cuid=429545 c)https://www.360docs.net/doc/3414775532.html,/SDL_tutorials/index.php

2系统设计2.1逻辑流程视图

C语言俄罗斯方块游戏源代码

/*学无止境*/ #include #include #include #define ESC 27 #define UP 328 #define DOWN 336 #define LEFT 331 #define RIGHT 333 #define BLANK 32 #define BOTTOM 2 #define CANNOT 1 #define CAN 0 #define MAX 30 #define F1 315 #define ADD 43 #define EQUAL 61 #define DEC 45 #define SOUNDs 115 #define SOUNDS 83 #define PAUSEP 80 #define PAUSEp 112

void Init(); void Down(); void GoOn(); void ksdown(); void Display(int color); void Give(); int Touch(int x,int y,int dx,int dy); int GeyKey(); void Select(); void DetectFill(); void GetScores(); void Fail(); void Help(); void Quit(); void DrawBox(int x,int y,int Color); void OutTextXY(int x,int y,char *String); void DispScore(int x,int y,char Ch); void DrawNext(int Color); int Heng=12,Shu=20; /*横竖*/ int Position[MAX][MAX]; int middle[MAX][MAX]; int ActH,ActS;

俄罗斯方块游戏设计

俄罗斯方块游戏设计 俄罗斯方块游戏设计 JAVA语言 Eclipse平台开发 以下为开发过程需要使用的packages及其中classes and methods JAVA语言和C语言、C++语言很接近,它是一种面向对象、独立于开发平台的高级编程语言。它独特的语法规则和类库是组成JAVA技术的两个重要部分。 假期总结: 坦白讲,这个暑假我没花多少时间在学习计算机编程技术上面。在刚放暑假的时候,我去图书馆借了七八本编程书,有Visual C++、C#、以及JAVA方面的书,信誓旦旦这个暑假要好好研究技术。然而,执行力是我很缺乏的一个缺陷吧。在家贪图一时之爽,基本上没去翻书学习,久而久之,就越害怕打开书本。后期提前回学校,学了一点点JAVA。回想整个大一,包括这个暑假,我很羞愧。自己在过去的一年里浪费了太多的时间,对成绩抱着一种比较无所谓的心态,对于学习也是,可想而知,与别人的差距也就越来越大,这也是我现在不愿意看到的。在往后的日子,我不敢保证自己能如何刻苦勤奋地学习,但是,至少我会尽力做到问心无愧,我会清楚自己要什么,并且行动起来。 一、Package cn.itcast.tetris.controller 控制器 控制Ground, Snake, Food 负责游戏的逻辑 处理按键事件

一、Package cn.itcast.tetris.entities

1、Class Ground: public class Ground extends https://www.360docs.net/doc/3414775532.html,ng.Object 可以叫做地形, 或地面 维护障碍物的信息 可以使用提供的 addObstacle(int, int) 和addStubbornObstacle(int ,int) 方法添加障碍物。 可以通过setObstacleColor(), setStubbornObstacleColor() 或setGriddingColor()方法更改障碍物或网格的颜色 通过setDrawGridding() 方法设置是否画空白(网格) 用 setColorfulSupport() 方法设置是否支持彩色显示 覆盖 drawObstacle(Graphics, int, int, int, int) 方法可以改变障碍物的显示方式

俄罗斯方块游戏

课程设计说明书 课程名称:高级语言程序设计 设计题目:俄罗斯方块游戏 院部:计算机科学与信息工程学院 学生姓名: 学号: 专业班级:物联网工程 指导教师: 2015年6月 课程设计任务书

目录 一前言 (4) 二需求分析 (4) 三概要设计 (5) 四详细设计 (7) 五改进或增加功能模块说明 (8) 六程序测试 (8) 七课程设计总结 (11) 八致谢 (11) 九参考文献 (12) 十源程序 (12)

俄罗斯方块游戏 一前言 C++程序设计牵涉到面向对象程序设计的理论、C++语言的语法以及算法等3个方面的内容,其中每一方面都包含十分丰富的内容,都可以分别单独成论。显然在一个程序中深入、详细地介绍以上3个方面的知识是不可能的,必须把它们有机地结合起来,综合应用。不同的书对此采取不同的写法,侧重点有所不同,各有道理,也各有优缺点,适合于不同的读者。需要在教学实践中检验,取长补短,不断完善。 作者认为:要进行C++程序设计当然需要了解面向对象程序设计的有关概念,但是本课程毕竟不是一门面向对象程序设计的理论课程,在本书中不是抽象地介绍面向对象程序设计的理论,而是在介绍C++语言的特点和应用过程中自然地引出面向对象程序设计的有关概念,通过C++的编程过程理解面向对象程序设计方法。在介绍程序设计过程中,介绍有关的算法,引导读者思考怎样构造一个算法。编写程序的过程就是设计算法的过程。 要用C++编程序,最基本的要求是正确掌握和运用C++。由于C++语法复杂,内容又多,如果对它缺乏系统的了解,将难以真正应用,编出来的程序将会错误百出,编译出错,事倍功半。本书的做法是全面而系统地介绍C++的主要特点和功能,引导读者由简而繁地学会编写C++程序。有了C++编程的初步基础后,再进一步提高,掌握更多更深入的算法。这样的方法可能符合大多数学习者的情况,降低了学习难度。 程序设计是一门实践性很强的课程,只靠听课和看书是学不好的。衡量学习好坏的标准不是“懂不懂”,而是“会不会干”。因此必须强调多编程,多上机实践。考虑到不同学校、不同专业、不同读者对学习C++有不同的要求。 二需求分析 1 要求 (1)用C语言实现程序设计;

基于Java语言的俄罗斯方块游戏课程设计

基于Java语言的 俄罗斯方块游戏课程设计 学院:X 专业:X 班级:X 姓名:X 学号:X 指导老师:X

摘要 第一章引言 1.1 设计的课题背景 1.2 研究课题的任务,目的和意义 1.2.1 课题的任务 1.2.2 课题的目的 1.2.3 课题的意义 1.3 系统的主要功能和特色 1.3.1 系统的主要功能 1.3.2 系统的特色 第二章系统需求分析 2.1 本课题研究现状分析 2.2 要解决的问题及解决方法 2.3 系统设计的主要内容、目标 2.3.1 系统设计的主要内容 2.3.2 设计的目标 2.4 使用的关键技术 第三章系统的详细设计 3.1 系统的总体系结构 3.2 系统各模块的界面设计及实现 3.2.1 主窗体程序模块设计与实现 3.2.2 方块变换模块设计与实现 3.2.3 满行消除并计分模块设计与实现第四章系统的安装与测试 4.1 系统的安装 4.1.1 系统的运行环境 4.1.2 系统的安装 4.2 系统的测试 结束语

参考文献 附录:有关程序代码

摘要: 在现代,高科技的飞跃发展,人们工作习惯的改变,特别是电脑的大量普及,人们生活节奏越来越快,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一。俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。为此,我设计了一款简单的俄罗斯方块JAVA 游戏程序,以便更好的满足广大电脑工作者闲暇之余的消遣,并且也让我学到编程技术。 关键字:俄罗斯方块游戏、Java语言、编程

俄罗斯方块游戏设计报告

C语言课程设计 报告 设计题目:俄罗斯方块游戏设计 院系: 班级: 学号: 姓名: 指导教师: 设计地点: 开课时间:

学生姓名成绩 评语: 指导教师(签名) 年月日

目录 1.设计目的和任务....................................................................................................................................... - 1 - 1.1目的: .............................................................................................................................................. - 1 - 1.2任务: .............................................................................................................................................. - 1 - 2.开发环境.................................................................................................................................................... - 1 - 2.1硬件环境:.................................................................................................................................... - 1 - 2.2软件环境:.................................................................................................................................... - 1 - 3.设计题目...................................................................................................................................................... - 2 - 3.1题目名称:.................................................................................................................................... - 2 - 3.2题目详细描述: ........................................................................................................................... - 2 - 3.3功能要求: ............................................................................................................................................ - 2 - 4.相关技术以及知识点.......................................................................................................................... - 3 - 4.1编写BLOCK类:............................................................................................................................... - 3 - 4.2 PATHGRADIENTBRUSH 类: ........................................................................................................ - 3 - 4.3 RANDOM类:.................................................................................................................................. - 3 - 4.4 GDI图形处理: ........................................................................................................................... - 3 - 5. 设计与实现 .............................................................................................................................................. - 4 - 5.1 设计流程图................................................................................................................................... - 4 - 5.2 游戏主体界面 .............................................................................................................................. - 4 - 5.3 游戏图形界面 ............................................................................................................................ - 11 - 5.4 图形的移动与消行 ................................................................................................................... - 13 - 5.5 得分的实现................................................................................................................................. - 15 -6.总结 ........................................................................................................................................................ - 16 -7.参考资料................................................................................................................................................ - 16 -

俄罗斯方块C语言代码

【转载】88行代码实现俄罗斯方块游戏(含讲解) 来源:https://www.360docs.net/doc/3414775532.html,/p/8 在正式阅读本文之前,请你记得你应该用娱乐的心态来看, 本代码所使用到的技巧,在工作了的人眼里会觉得很纠结,很蛋疼,很不可理喻,很丑, 注意,是你蛋疼,不关我的事 通常,写一个俄罗斯方块,往往动不动就几百行,甚至上千行,而这里只有88行 正所谓头脑风暴,打破常规。这里将使用很多不平常的手段来减少代码 以下是Win-TC可以成功编译并执行的代码(代码保证单行长度不超过80字符,如果你是Win7系统,那请看后文): 程序代码: #include"graphics.h" #include #include int gcW = 20, gcColor[] = {DARKGRAY, LIGHTBLUE, LIGHTGREEN, LIGHTCYAN, LIGHTRED, LIGHTMAGENTA,MAGENTA, YELLOW}; struct tetris { int _pool[16][32], (*pool)[32], tmap[8][4][16]; int x, y, s, st, t; }gt; void trsInit() { int sp[8][4] = {{15,4369},{23,785,116,547},{71,275,113,802}, {39,305,114,562},{54,561},{99,306},{51,51},{-1}}; int *p, i, j, b; for (p = sp[0]; *p >= 0; ++p) if ( *p == 0 ) *p = p[-2]; gt.pool = >._pool[4]; for (j = 0; j < 7; ++j) for (i = 0; i < 4; ++i) for (b = 0; b < 16; ++b) gt.tmap[j+1][i][b] = (sp[j][i] & 1) * (j + 1), sp[j][i] >>= 1; memset(gt._pool, -1, sizeof(gt._pool));

俄罗斯方块说明

俄罗斯方块单人版

1、需求分析 俄罗斯方块,或称积木游戏,它是利用一些形状各异却又是用正方形组成的方块,经过不同位置不同角度的变化之后,堆积在一起的一种智力游戏。 2、概要设计 而从编程的角度讲,只需要提供各种方块的图形,提供几个键盘操作键以供方块的形状和位置的变化,提供几个功能函数以供游戏的正常进行。 各种方块图形:利用数组定形,然后利用随机函数随机地不按顺序地按游戏的需要而出现。 功能函数将在变量函数里面介绍。

3、详细设计 添加位图: 封面:IDB_BITMAP1 背景:IDB_BITMAP2 方块:IDB_BITMAP4 添加菜单: 开始:ID_MENU_START 接着就是定义变量了,但是,由于这个游戏要添加的变量和函数太多了,要建一个新类。 是否应该先添加应该类呢?最好是这样。因为新类将会涉及到变量。 添加普通类Crussia,见下图。 图4-1-1 添加变量函数: 由于两个类一共有很多变量函数,列举如下:

View.h : Public: //俄罗斯类 CRussia russia; //开始标志 bool start; //封面 CBitmap fenmian; //暂停 BOOL m_bPause; //开始菜单 afx_msg void OnMenuStart(); //计时器 afx_msg void OnTimer(UINT nIDEvent); //键盘操作 afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); // Russia.h: Public: //游戏数组 int Russia[100][100]; // 当前图形 int Now[4][4]; //上一图形 int Will[4][4]; //变换后的图形 int After[4][4]; //当前图形的左上角位置 CPoint NowPosition; //当前可能出现的图形形状数, int Count; //游戏结束 bool end; //级别 int m_Level; //速度

俄罗斯方块完整源代码

//不多说,直接可以拷贝下面的东西,就可以运行。 package day04; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.applet.*; import https://www.360docs.net/doc/3414775532.html,ng.String.*; import https://www.360docs.net/doc/3414775532.html,ng.*; import java.io.*; public class ERSBlock extends JPanel implements ActionListener,KeyListener//应该是继承JPanel { static Button but[] = new Button[6]; static Button noStop = new Button("取消暂停"); static Label scoreLab = new Label("分数:"); static Label infoLab = new Label("提示:"); static Label speedLab = new Label("级数:"); static Label scoreTex = new Label("0"); static Label infoTex = new Label(" "); static Label speedTex = new Label("1");

static JFrame jf = new JFrame(); static MyTimer timer; static ImageIcon icon=new ImageIcon("resource/Block.jpg"); static JMenuBar mb = new JMenuBar(); static JMenu menu0 = new JMenu("游戏 "); static JMenu menu1 = new JMenu("帮助 "); static JMenuItem mi0 = new JMenuItem("新游戏"); static JMenuItem mi1 = new JMenuItem("退出"); static JMenuItem mi1_0 = new JMenuItem("关于"); static JDialog dlg_1; static JTextArea dlg_1_text = new JTextArea(); static int startSign= 0;//游戏开始标志 0 未开始 1 开始 2 暂停 static String butLab[] = {"开始游戏","重新开始","降低级数","提高级数","游戏暂停","退出游戏"}; static int game_body[][] = new int[19][10]; static int game_sign_x[] = new int[4];//用于记录4个方格的水平位置 static int game_sign_y[] = new int[4];//用于记录4个方格的垂直位置

俄罗斯方块

俄罗斯方块

俄罗斯方块小游戏姓名:罗君 学号:102054221 指导老师:孔老师 日期:2011/12/22

1设计描述 这个程序是由MFC所做的小游戏:俄罗斯方块,俄罗斯方块也就是人们广泛称为积木的游戏,它是利用一些形状各异小方块却是用正方形组成的方块,当然在我所做的这个程序里,我用了有着7种不同的方块。,经过不同位置不同角度的变化之后,堆积在一起的一种智力游戏。而当同一行被小方格填满时,那一行也就跟着消失,此时玩家就可以得到一分,这里所设置的分值为,没消去一行,便可以得到一分,而主界面的背景被设为了12行及18列,当所堆积的小方块的垂直高度等于界面背景的高度时,这时就会在视图类中弹出一个消息对话框“游戏已经结束”。这里所要实现的就是这样一个小游戏,不过出于达到为了更加使游戏玩家得到娱乐的放松,我已经为此游戏添加了动听的游戏的背景音乐。还有就是当程序运行时,首先出现在客户区的是一幅封面位图,当游戏玩家点击文件菜单中的开始子菜单时,游戏正式进入游戏界面。 而从我们编程的角度讲,我们只需要提供各种方块的图形,提供几个键盘操作键以供方块的形状和位置的变化,提供几个功能函数以供游戏的正常进行。各种方块图形:利用数组定形,然后利用随机函数随机地不按顺序地按游戏的需要而出现。键盘操作键:就是四个方向键。其中左、右、下三个键意思一样,上键的功能不是使方块向上,而是使方块的下落角度改变。 2设计分析 2.1由于所选封面的位图的大小的限制,贴的客户区的位图不能完全覆盖整个客户区,考虑到游戏运行的效果,所以必须对运行后客户区大小重新作出界定,处于这种原因,所以应该在CMainFrame类中的PreCreateWindow (CREATESTRUCT& cs)函数中添加代码:cs.cx=500,cs.cy=590;再者就是一个有戏必须有开始,暂停和结束的按钮,为了实现这一功能,我做了如下程序,将菜单栏中的文件菜单项下的子菜单项都删除,重新为该菜单项添加3个子菜单项,分别为开始(IDC_MENU_START),暂停(IDC_MENU_PAUSE),退出(IDC_MENU_EXIT).并分别给这三个菜单项添加Command命令响应,并让CView类接收此命令响应消息。 2.2 资源编辑 添加位图: 封面:IDB_BITMAP1

C语言俄罗斯方块游戏源代码

/*学无止境*/ #include <> #include <> #include <> #define ESC 27 #define UP 328 #define DOWN 336 #define LEFT 331 #define RIGHT 333 #define BLANK 32 #define BOTTOM 2 #define CANNOT 1 #define CAN 0 #define MAX 30 #define F1 315 #define ADD 43 #define EQUAL 61 #define DEC 45 #define SOUNDs 115 #define SOUNDS 83 #define PAUSEP 80 #define PAUSEp 112

void Init(); void Down(); void GoOn(); void ksdown(); void Display(int color); void Give(); int Touch(int x,int y,int dx,int dy); int GeyKey(); void Select(); void DetectFill(); void GetScores(); void Fail(); void Help(); void Quit(); void DrawBox(int x,int y,int Color); void OutTextXY(int x,int y,char *String); void DispScore(int x,int y,char Ch); void DrawNext(int Color); int Heng=12,Shu=20; /*横竖*/ int Position[MAX][MAX]; int middle[MAX][MAX]; int ActH,ActS;

Python 俄罗斯方块游戏

【Python】用Python实现一个俄罗斯方块游戏 俄罗斯方块游戏,使用Python实现,总共有350+行代码,实现了俄罗斯方块游戏的基本功能,同时会记录所花费时间,消去的总行数,所得的总分,还包括一个排行榜,可以查看最高记录。 排行榜中包含一系列的统计功能,如单位时间消去的行数,单位时间得分等。 附源码: from Tkinter import* from tkMessageBox import* import random import time #俄罗斯方块界面的高度 HEIGHT=18 #俄罗斯方块界面的宽度 WIDTH=10 ACTIVE=1 PASSIVE=0 TRUE=1 FALSE=0 root=Tk();root.title('Russia') class App(Frame): def__init__(self,master): Frame.__init__(self) master.bind('',self.Up) master.bind('',self.Left) master.bind('',self.Right) master.bind('',self.Down) #master.bind('',self.Space) master.bind('',self.Space) master.bind('',self.Play) master.bind('',self.Pause) self.backg="#%02x%02x%02x"%(120,150,30) self.frontg="#%02x%02x%02x"%(40,120,150) self.nextg="#%02x%02x%02x"%(150,100,100) self.flashg="#%02x%02x%02x"%(210,130,100) self.LineDisplay=Label(master,text='Lines:',bg='black',fg='red') self.Line=Label(master,text='0',bg='black',fg='red') self.ScoreDisplay=Label(master,text='Score:',bg='black',fg='red') self.Score=Label(master,text='0',bg='black',fg='red') #Display time self.SpendTimeDisplay=Label(master,text='Time:',bg='black',fg='red') self.SpendTime=Label(master,text='0.0',bg='black',fg='red') self.LineDisplay.grid(row=HEIGHT-2,column=WIDTH,columnspan=2)

用matlab编写的俄罗斯方块小游戏

用matlab编写的俄罗斯方块小游戏 ?function RussiaBlock( varargin ) if nargin == 0 OldHandle = findobj( 'Type', 'figure', 'Tag', 'RussiaBlock' ) ; if ishandle( OldHandle ) delete( OldHandle ) ; end FigureHandle = figure( 'Name', '俄罗斯方块MATLAB版', 'Tag', 'RussiaBlock', 'NumberTitle', 'off',... 'Menubar', 'none', 'DoubleBuffer', 'on', 'Resize', 'off', 'visible', 'on',... 'KeyPressFcn', 'RussiaBlock( ''KeyPress_Callback'', gcbo )',... 'HelpFcn', 'helpdlg(''帮不了你- -!'',''不好意思'')',... 'CloseRequestFcn', 'RussiaBlock( ''CloseFigure_Callback'', gcbo )' ) ; generate_FigureContent( FigureHandle ) ; init_FigureContent( FigureHandle ) ; set( FigureHandle, 'Visible', 'on' ) ; elseif ischar( varargin{1} ) feval( varargin{:} ) ; end % ------------------------------------------------------------------------- function generate_FigureContent( FigureHandle ) TabSpace = 30 ; BlockWidth = 20 ; BlockHeight = 20 ; FigureWidth = BlockWidth * (12 + 1) + TabSpace * 7; FigureHeight = 500 ; set( FigureHandle, 'Position', [0 0 FigureWidth FigureHeight] ) ; movegui( FigureHandle, 'center' ) ; % 创建菜单 BeginMenu = uimenu( FigureHandle, 'Label', '开始' ) ; StartMenu = uimenu( BeginMenu, 'Label', '开始新游戏', 'Accelerator', 'N',...

相关文档
最新文档