俄罗斯方块网页小游戏设计开发 毕业设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要
随着internet的迅速发展,社会已经进入了网络时代。
电子商务,网上购物,网上调查,网上学校等等已经确实地存在于我们身边了,而掌握网页和网站的设计技术已经成为程序员的必备技能,将一些编程技术融入网站设计中,可以建立出强大功能的动态网页。
该建立出具有强大功能的动态网页,该论文就是基于以上目的的,通过html 技术来完成网站的设计。
本系统就是利用javaapplet,应用html技术和采用java语言来构成网页游戏应用的基本代码,完成了基于html的网页小游戏。
它操作简单,结果清晰。
本文只要介绍了俄罗斯方块网页小游戏设计开发的整个过程,本网页在开发方法上采用了结构化模块的设计方法,根据用户的需求及程序的应用与响应,将程序各个部分置于不同的模块当中,一一实现各模块,进而完成整个系统的开发。
本游戏界面由网页框架,游戏主屏幕,操作按钮,游戏状态组成。
主要模块分别是图形产生模块,图形移动模块,障碍物模块,中央处理模块,面板显示模块。
最后,对本次设计取得的成绩和不足做出概况性的总结,并对未来的工作进行展望。
关键词:互联网;俄罗斯方块网页小游戏;javaapplet
Abstract
With the rapid development of Internet, the society has entered the Internet age. E-commerce, online shopping, online surveys, online schools have indeed exist around us, and the master page and site design technology has become an essential skill of the programmer, programming technology into the website design, you can create a powerful dynamic web pages. The establishment of a powerful dynamic pages, the paper is based on the above purpose, html technology to complete the design of the site.
The system is the use of javaapplet application html and java language to constitute the application of the basic code of web games, html-based web game. It is simple, clear results. This article as long as the the the whole process of of the the web pages of the Russian box small game design and development is introduced the, this web page in the your development method, on the the uses a the the design method of of the structured module, according to the the the application of and response of the the needs of users and procedures, will the the various parts of of the procedures placed in the different modules among the, one by one each module to achieve, and then complete the the the development of of the the entire system.
The game interface consists of a web framework, the main game screen, the buttons, the game state. The to main module is or module, Graph moving module, obstructions module, the central processing module Transportation, Panel the display module in if you are, respectively is the Graph-generating.
Finally, make an overview summary of the achievements and shortcomings of the design, and future work prospects.
Key words:Internet;the web pages of the Russian box small game;javaapplet
目录
1 绪论 (1)
1.1 开发背景 (1)
2 系统开发平台 (2)
2.1 开发工具简介 (2)
2.1.1 JDK (2)
2.1.2 Eclipse 4.2 (2)
2.2 系统配置 (2)
2.2.1 安装JDK (2)
2.2.2 Eclipse的安装 (3)
2.2.2.1 Eclipse软件安装 (3)
2.2.2.2 Eclipse插件安装 (3)
3 系统分析 (6)
3.1 需求分析 (6)
3.2 可行性研究 (6)
4 系统设计 (7)
4.1 功能概述 (7)
4.1.1 网页框架功能 (7)
4.1.2 游戏功能 (7)
5 详细设计 (8)
5.1网页框架设计 (8)
5.2 游戏设计 (9)
5.2.1 游戏主要框架 (9)
5.2.2 java程序功能与实现 (10)
5.2.2.1 俄罗斯方块背景棋盘的产生 (10)
5.2.2.2 俄罗斯方块功能按钮的产生 (12)
5.2.2.3 俄罗斯方块的事件处理 (17)
5.2.2.3.1开始按钮 (17)
5.2.2.3.2重新开始按钮 (18)
5.2.2.3.3暂停按钮 (20)
5.2.2.3.4继续按钮 (20)
5.2.2.3.5关于按钮 (21)
5.2.2.3.6游戏结束事件处理 (22)
5.2.2.4 俄罗斯方块的产生 (23)
5.2.2.5 俄罗斯方块预览区方块的产生 (29)
5.2.2.6 俄罗斯方块关数以及分数的处理 (31)
6 结论 (34)
主要参考文献: (35)
致谢 (36)
1 绪论
1.1 开发背景
中国互联网络信息中心(以下简称CNNIC)自2008年开始,以每年2次的互联网发展统计报告为基础,对于中国网络游戏行业进行进一步细分研究,连续开展了2008年和2009年网络游戏用户调研并撰写了《中国网络游戏用户调研分析报告》,取得了一定的效果。
为了更加完善的了解中国网络游戏市场状况,CNNIC互联网发展研究部将网络游戏类型进一步细化,针对正处于高速发展期的网页游戏(Web Game/Browser Game)做出专项调研。
中国网页游戏近两年发展迅速,尽管在用户规模上与传统网络游戏还存在很大差距,但在我国整体网络游戏用户增长速度趋于放缓的情况下,网页游戏却持续增长,已经成为带动网络游戏发展的新生力量。
与此同时,网页游戏出现了一些问题:首先,由于网页游戏的进入门槛相对于传统网络游戏低,主要以中小企业为主,其自身原创力不足,抄袭、复制问题严重,导致盲目量产、同质化现象严重;其次,在发展过程中,企业缺乏清晰的盈利模式,忽视社会责任和行业发展状况,仅仅考虑短期利益;第三,由于产品品质和服务等原因,造成个人用户生命周期短,更新换代速度过快,用户黏性低;最后,网页游戏中类似“色情”、“暴力”、“赌博”等方面的内容,也会对用户的行为产生负面影响,众多因素决定了政府和企业对网页游戏市场了解的迫切需求。
综上所述,中国互联网络信息中心(CNNIC)互联网发展研究部开展此次2010年中国网页游戏研究,对于该游戏类型的用户行为与态度、心理认知等状况做出调查,了解该游戏类型市场状况以及存在的问题,为政府以及运营商发展提供有力的支持。
2 系统开发平台
2.1 开发工具简介
本系统的开发主要使用的是javaapplet[1],所以开发工具只用了eclipse和记事本,而语言则选择了java[2]。
2.1.1 JDK
JDK(Java Development Kit)[3]是Sun Microsystems针对Java开发员的产品。
自从Java推出以来,JDK已经成为使用最广泛的Java SDK。
JDK是整个Java的核心,包括了Java运行环境,Java工具和Java基础的类库。
JDK是学好Java的第一步。
而专门运行在x86平台的Jrocket[4]在服务器端运行效率也要比Sun JDK 好很多。
从SUN的JDK1.5开始,提供了泛型等非常使用的功能,其版本也不断更新,运行效率得到了非常大的提高。
现在JDK的最新版本为JDK1.7,本系统使用的是JDK1.6。
2.1.2 Eclipse 4.2
Eclipse[9]是一个开放源代码的、基于Java的可扩展开发平台。
就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。
幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。
2.2 系统配置
2.2.1 安装JDK
将JDK 1.6安装到C:\Program Files目录下,然后配置环境变量
◆进系统-->高级-->环境变量,在系统环境变量中新建下列环境变量,并赋值
如下[10]:
◆java_home=C:\Program Files\Java\jdk1.6
◆catalina_home=C:\apache-tomcat-6.0.18
◆classpath=.;C:\ProgramFiles\Java\jdk1.6\lib
path=%path%;%java_home%\bin;%java_home%\lib;%catalina_home%\bin;
◆%catalina_home%\lib
2.2.2 Eclipse的安装
2.2.2.1 Eclipse软件安装
Eclipse是一款绿色软件,安装很方便,只要将下载的压缩包文件解压到指定目录即可。
可以在/downloads/下载相关软件。
在Eclipse安装目录下找到eclipse.exe执行文件,双击就可以启动Eclipse。
启动后选择工作空间(即您用于存放项目文档的文件夹,就进入Eclipse的欢迎界面,在这里,您可以了解到Eclipse的新功能、新动态等。
至此,Eclipse就安装完成了。
2.2.2.2 Eclipse插件安装
Eclipse插件的安装方法大体有以下三种[5]:
第一种:直接复制法
假设Eclipse的安装目录在C:\eclipse,解压下载的eclipse 插件或者安装eclipse 插件到指定目录AA(如:c:\AA)文件夹,打开AA 文件夹,在AA文件夹里分别包含两个文件夹features和plugins ,然后把两个文件夹里的文件分别复制到C:\eclipse下所对应的文件夹下的features 和plugins 下,一般的把插件文件直接复制到eclipse目录里是最直接也是最愚蠢的一种方法!因为日后想要删除这些插件会非常的困难,不推荐使用。
注意:直接将插件包解压到plugins文件夹下之后,重启eclipse,可能不会加载新的插件。
解决方法是:
1、打开命令行,到当前eclipse的目录下,输入eclipse -clean,重新启动eclipse,这样eclipse就会加
上新的插件了。
2、如果插件不能生效,则请将eclipse\configuration\org.eclipse.update目录删除后再启动eclipse;
你可以在eclipse的菜单"Help"-->"About Eclipse SDK"-->"Feature Details" 和"Plug-in Details"中看到新安装的插件。
第二种:使用link文件法
a.假设Eclipse的安装目录在C:\eclipse,在该文件夹下,新建这样的目录结构C:\eclipse\PluginsEclipse\jode\eclipse;
b.解压下载的eclipse 插件或者安装eclipse 插件到指定目录BB(如:C:\BB)文件夹,打开BB文件夹,然后把BB文件夹里的两个文件夹features和plugins 复制到刚刚新建好C:\eclipse\PluginsEclipse\jode\eclipse,这样eclipse中就有了两个插件目录features and plugins下。
c.在C:\eclipse目录中新建links(C:\eclipse\links)目录,在links目录中建立一个以link为扩展名的文本文件如jode.link,内容如下
path=C:/eclipse/PluginsEclipse/jode 或者path=C:\\eclipse\\PluginsEclipse\\jode(插件的目录),保存后重启eclipse插件就会安装完成。
注意:link文件中path=插件目录的path路径分隔要用\\或是/
Java代码/eclipse/links/jode.linkwebtools.linkupdateManager.link
...
...
/eclipse/ links/ jode.link webtools.link updateManager.link ... ... 可以在eclipse
的菜单"Help"-->"About Eclipse SDK"-->"Feature Details" 和"Plug-in Details"中看到新安装的插件。
第三种:使用eclipse自带图形界面安装[6]
选择Help > Software Updates > Manager Configuration,再选择Add > Extension Location 找到你要安装插件的目录就可以了。
使用eclipse的help->SoftwareUpdates ->Find and install... search for new features... 输入软件安装地址进行安装强烈推荐这种方法,优点很多比如可以方便的添加删除,也不用自己写link文件!
备注:Eclipse插件的目录结构
Java代码/eclipse-plugins/eclipse/.eclipseextensionfeatures/
plugins/
第2.3种方法所指向的目录都指的是"eclipse"目录,
如果用第3种方法,在eclipse这个目录下必须有文件.eclipseextension,如果下载的插件没有这个文件,那就随便eclipse安装目录下的那个文件拷过去就行,只有有这么个文件就可以了,内容没什么用,主要是一些版本信息。
例如:Java代码
id=org.eclipse.platform name=Eclipse Platform
version=3.1.1
id=org.eclipse.platform name=Eclipse Platform version=3.1.1
3 系统分析
3.1 需求分析
网页游戏有着方便快捷、相应配置低的优点。
网页游戏的出现弥补了有端网游对于上班人群的空白,而随着网页游戏的不断发展,目前网页游戏的受众群已上至六旬下至青少年,网页游戏的特性使得网页游戏老少皆宜而有端网游往往只针对部分人群。
众所周知,下载一款网络游戏往往需要好3到10多个小时不等,而下载完后不喜欢又得卸载再重新下载其他有端网游,过程繁琐。
打开网页就能玩的优点,是网页游戏赶超有端网游的有利条件。
3.2 可行性研究
无可争议,《俄罗斯方块》是有史以来最伟大的游戏之一。
它是永恒的娱乐经典,但它实际上又和那些传统的经典娱乐方式不同,因为它的本质是电子化的,所以它的确属于现代产物。
《俄罗斯方块》举世闻名的游戏性,在该游戏新鲜出炉时就显得非常直观。
某些与坠落的玩具碎片和它们的形状有关的东西,使得哪怕新手也会很自然地企图把它们排列起来,并加以适当组合,就好似《俄罗斯方块》触动了我们某些内在的感官,使得哪怕是我们当中最杂乱无章的人也要把事情整理妥当。
在曾经发布过的所有游戏中,《俄罗斯方块》还被认为是仅有的一个能够真正吸引广泛人群的作品。
某些批评家也许会声称,《俄罗斯方块》要比过去二十年间出现的任何东西都要浪费人们的时间。
至于我们,则要欣然提名它为GameSpot 评选出的历史上最伟大游戏之一。
4 系统设计
4.1 功能概述
本系统分为网页框架与游戏两个部分。
4.1.1 网页框架功能
作为让java程序在网页运行的容器。
4.1.2 游戏功能
●用户点击开始游戏,游戏运行。
●用户运行游戏时显示当前游戏分数和难度指数。
●用户得到一定分数,难度自动提高。
●用户点击暂停游戏,游戏暂停,然后点击继续游戏,游戏继续运行。
●用户点击重新开始游戏,当前分数清零,难度初始化,游戏界面也重新开始
运行游戏。
●用户点击关于,显示游戏玩法。
●用户关闭浏览器当前页面,游戏关闭。
5 详细设计
本系统分为网页框架与游戏两个部分。
5.1网页框架设计
作为一个网页游戏,网页是必不可少的,但是由于本系统的重点在于游戏,所以网页做得比较简单。
图5.1网页框架
如图5.1所示只有一个背景图片和标题。
代码如下:
<html>
<head>
<title>俄罗斯方块</title>
</head>
<body background="tu.jpg">
<h1 align="center">
<font color="#FF0000">
俄罗斯方块
</font>
</h1>
<center>
<applet code="Main.class" align="baseline" width="430"
height="500"></applet>
</center>
</body>
</html>
5.2 游戏设计
5.2.1 游戏主要框架
本程序分为6个类,分别是Block,Main,GameCanvas,GameEvent,GameThread,NextGameCanvas。
●Block是画图形以及图形的操作类。
●GameCanvas是游戏中的画布类[7],用于画各种方块。
●GameEvent是游戏中的事件处理类,用于各个事件的处理。
●GameThread是游戏的线程类,管理游戏的运行。
●NextGameCanvas也是游戏中的画布类,但是与GameCanvas不同,是用于预
览下一个出现图形的画布类。
●Main是游戏的主界面类,用于呈现整个游戏。
5.2.2 java程序功能与实现
5.2.2.1 俄罗斯方块背景棋盘的产生
游戏背景的棋盘是利用Canvas类画出来的,如图5.2所示。
图5.2棋盘背景
代码如下:
class GameCanvas extends Canvas implements KeyListener {
int i = 0, j = 0;
int rowNum=15,columnNum=10;//画图形的行数与列数int[][] scrArr;//屏幕数组
Color bgcolor;//用于获得背景颜色
Main haha ;
GameCanvas(Main q)
{
haha = q;
scrArr = new int[16][16];//标记界面初始值全为零
//初始化屏幕,并将屏幕数组清零的方法
for (int i = rowNum; i >=0; i--)
for (int j = columnNum; j >=0 ; j--)
scrArr[i][j] = 0;
setSize(315,465);
bgcolor = getBackground();//得到背景颜色
repaint();
}
public synchronized void paint(Graphics g)//重新刷新画布方法 (同步) {
for( i = 0; i <=rowNum; i++){
g.drawLine(10,30*i+10,310,30*i+10); //画横线
g.drawLine(10,30*i+13,310,30*i+13); //画横线
}
for( i = 0; i <=columnNum; i++) {
g.drawLine(30*i+10,10,30*i+10,460); //画纵线
g.drawLine(30*i+13,10,30*i+13,460); //画纵线
}
//绘制图形
for (i = 0; i < rowNum; i++)
{
for(j = 0; j < columnNum; j++)
{
switch (scrArr[i][j])
{
case 0:
break;
case 1:
{ g.setColor(Color.BLACK); //方块的背景颜色为黑色
g.fillRect(j * 30 + 10, i * 30 + 10, 29, 29);////画正在下落的方块+1是保持线不被覆盖
}
case 2:
{
g.setColor(Color.blue); //方块的前背景颜色为蓝色
g.fillRect(j*30+13,i*30+13,29,28);break; //画已经落下的方法
}
}
}
}
g.dispose();
}
5.2.2.2 俄罗斯方块功能按钮的产生
俄罗斯方块的功能按钮是在Main类种产生的如图5.3所示,。
图5.3功能按钮
代码如下:
public void init()//初始化界面
{
gamecanvas = new GameCanvas(this);//游戏界面绘制类
nextgamecanvas = new NextGameCanvas();//游戏预览区的对象
block = new Block(gamecanvas,nextgamecanvas);//方块类的对象并将GameCanvas 与NextGameCanvas 的对象传递给它
gameevent = new GameEvent(this,block);//按钮功能实现类
gamethread = new GameThread(block,this);
setBackground(Color.LIGHT_GRAY);//设置界面的背景颜色为银灰色
//对象的初始化
panel1 = new Panel();
panel2 = new Panel();
panel3 = new Panel();
// but1=new Button("降低难度");
// but2=new Button("提高难度");
but3=new Button("重新开始");
but4=new Button("开始");
but5=new Button("暂停");
but6=new Button("继续");
but7=new Button("关于");
label1=new Label("得分:");
label2=new Label("关数:");
label3=new Label("下一个图形");
label4=new Label("0");
label5=new Label("1");
label6=new Label("计应1005班易申制作");
//分别设置组建上的字样
// but1.setFont(new Font("Dialog",Font.BOLD,15)); // but2.setFont(new Font("Dialog",Font.BOLD,15)); but3.setFont(new Font("Dialog",Font.BOLD,15)); but4.setFont(new Font("Dialog",Font.BOLD,15)); but5.setFont(new Font("Dialog",Font.BOLD,15)); but6.setFont(new Font("Dialog",Font.BOLD,15)); but7.setFont(new Font("Dialog",Font.BOLD,15)); label1.setFont(new Font("Dialog",Font.BOLD,15)); label2.setFont(new Font("Dialog",Font.BOLD,15)); label3.setFont(new Font("Dialog",Font.BOLD,15)); label4.setFont(new Font("Dialog",Font.BOLD,15)); label5.setFont(new Font("Dialog",Font.BOLD,15)); label6.setFont(new Font("Dialog",Font.BOLD,12)); label4.setForeground(Color.blue);
label5.setForeground(Color.blue); label6.setForeground(Color.yellow); //设置字体大小
this.add(panel1);//主面板
panel1.setLayout(null);
panel1.setBounds(0,0,430,500);
// 主面板中添加各种组件panel1.add(label3);
label3.setBounds(330,10,80,30); panel1.add(label1);
label1.setBounds(340,120,65,25); panel1.add(label4);
label4.setBounds(340,150,65,25); panel1.add(label2);
label2.setBounds(340,180,65,25); panel1.add(label5);
label5.setBounds(340,210,65,25); // panel1.add(but1);
// but1.setBounds(340,250,65,25); // panel1.add(but2);
// but2.setBounds(340,290,65,25); panel1.add(but3);
but4.setBounds(340,250,65,25); panel1.add(but4);
but3.setBounds(340,300,65,25); panel1.add(but5);
but5.setBounds(340,350,65,25); panel1.add(but6);
but6.setBounds(340,400,65,25);
panel1.add(but7);
but7.setBounds(340,450,65,25);
panel1.add(label6);
label6.setBounds(70,475,365,25);
// 注册监听按钮
// but1.addActionListener(this);
// but2.addActionListener(this);
but3.addActionListener(this);
but4.addActionListener(this);
but5.addActionListener(this);
but6.addActionListener(this);
but7.addActionListener(this);
//添加游戏图形的界面
panel1.add(panel2);
panel2.setBounds(5,1,315,470);//设置游戏图形界面的大小
panel2.setBackground(Color.gray);//设置游戏图形界面的颜色
panel2.add(gamecanvas);// 在panel2 中添加图形绘制类的对象gamecanvas.addKeyListener(gamecanvas);//为gamecanvas 添加键盘事件//添加游戏图形预缆区的界面
panel1.add(panel3);
panel3.setBounds(340,45,80,75);
panel3.setBackground( Color.WHITE);
panel3.add(nextgamecanvas);// 在panel3 中添加图形预览绘制类的对象}
5.2.2.3 俄罗斯方块的事件处理
5.2.2.3.1开始按钮
图5.4开始图片
如图5.4所示点击开始游戏,游戏开始。
代码如下:public void bagin()// 游戏开始
{
if (haha.gameFlag == false && zanting == false) {
block.drawBlock();
haha.gamethread.start();
haha.gameFlag = true;
haha.gamecanvas.requestFocus();
} else if (zanting == true) {
JOptionPane.showMessageDialog(this, "游戏已经开始", "俄罗斯方块",
JOptionPane.WARNING_MESSAGE);
haha.gamecanvas.requestFocus();
}
haha.gamecanvas.requestFocus();
}
5.2.2.3.2重新开始按钮
图5.5重新开始
如图5.5所示用户点击重新开始游戏,当前分数清零,难度初始化,游戏界面也重新开始运行游戏。
代码如下:
public void asBagin()// 重新开始
{
if (haha.gameFlag || haha.gamethread.gameover || zanting == true)// 游戏已经开始
{
for (int i = 0; i < haha.gamecanvas.rowNum; i++)
for (int j = 0; j < haha.gamecanvas.columnNum; j++)
haha.gamecanvas.scrArr[i][j] = 0;// 游戏界面重新设置为零block.drawBlock();// 产生一个新的方块
if (haha.gamethread.gameover)// 游戏结束时的从新开始
{
haha.gamethread.gameover = false;
haha.gameFlag = true;
haha.gamethread.resume();
}
haha.gamecanvas.repaint();// 游戏界面的重新绘制
haha.gamesum = 1;
haha.gamescore = 0;
haha.gamethread.gametime = 1000;
bel4.setText("0");
bel5.setText("1");
} else {
JOptionPane.showMessageDialog(this, "游戏还没有开始,请单击开始按钮。
", "俄罗斯方块",
JOptionPane.WARNING_MESSAGE);
}
haha.gamecanvas.requestFocus();// 使游戏界面获得焦点用以判断键盘的
输入
}
5.2.2.3.3暂停按钮
用户点击暂停按钮,游戏暂停。
代码如下:
public synchronized void stop()// 游戏暂停
{
if (haha.gamethread != null && haha.gameFlag == true) {
haha.gamethread.suspend();
haha.gameFlag = false;
zanting = true;
}
haha.gamecanvas.requestFocus();
}
5.2.2.3.4继续按钮
用户点击继续按钮,游戏继续。
代码如下:
public synchronized void over()// 游戏继续
{
if (haha.gamethread != null && haha.gameFlag == false&&zanting==true) {
haha.gamethread.resume();
haha.gameFlag = true;
zanting = false;
}
haha.gamecanvas.requestFocus();
}
5.2.2.3.5关于按钮
图5.6关于按钮
如图5.6所示用户点击关于按钮,弹出游戏玩法。
代码如下:public void about()// 关于
{
// JOptionPane.showMessageDialog(this,"游戏结束了!haha.gamescore","俄罗斯方块",JOptionPane.WARNING_MESSAGE);
haha.gamethread.suspend();
JOptionPane.showMessageDialog(this, "本游戏由计应1005班易申制作~" + "\n" + "游戏玩法:用键盘方向键控制游戏。
\n"
+ "左右键移动方块位置。
\n"+"向上键和空格键使方块变形。
\n"+"祝您玩的愉快哦,亲~~", "俄罗斯方块",
JOptionPane.WARNING_MESSAGE);
haha.gamethread.resume();
haha.gamecanvas.requestFocus();
}
5.2.2.3.6游戏结束事件处理
图5.7游戏结束
如图5.7所示游戏结束,弹出游戏结束事件。
代码如下:if(!haha.gameFlag)
{
haha.gameevent.gameOver();
gameover = true;
haha.gameFlag = false ;
haha.gamecanvas.repaint();
suspend();//游戏结束时暂停游戏
}
public void gameOver()// 游戏结束触发事件
{
// JOptionPane.showMessageDialog(this,"游戏结束了!haha.gamescore","俄罗斯方块",JOptionPane.WARNING_MESSAGE);
JOptionPane.showMessageDialog(this, "很遗憾,您的游戏结束了~" + "\n" + "您的分数是:"
+ haha.gamescore + "\n祝愿您下次获得更高的分数。
", "俄罗斯方块",
JOptionPane.WARNING_MESSAGE);
}
5.2.2.4 俄罗斯方块的产生
图5.8俄罗斯方块产生
如图5.8所示,画方块的代码如下:
switch(blockmessage)//得到(11...14,21...24,31...34.......74)
{
case 11: {}//画横条
case 13://画横条
{
nextscrArr[1][0] = 1 ;
nextscrArr[1][1] = 1 ;
nextscrArr[1][2] = 1 ;
nextscrArr[1][3] = 1 ;
break;
}
case 12: {}//画竖条
case 14://画竖条
{
nextscrArr[0][1] = 1 ;
nextscrArr[1][1] = 1 ;
nextscrArr[2][1] = 1 ;
nextscrArr[3][1] = 1 ;
break;
}
case 21://画土状方块正
{
nextscrArr[1][1] = 1 ;
nextscrArr[2][0] = 1 ;
nextscrArr[2][1] = 1 ;
nextscrArr[2][2] = 1 ;
break;
}
case 22://画土状方块左
{
nextscrArr[1][2] = 1 ;
nextscrArr[2][2] = 1 ;
nextscrArr[3][2] = 1 ;
nextscrArr[2][1] = 1 ;
break;
}
case 23://画土状方块下
{
nextscrArr[1][0] = 1 ;
nextscrArr[1][1] = 1 ;
nextscrArr[1][2] = 1 ;
nextscrArr[2][1] = 1 ;
break;
}
case 24://画土状方块右
{
nextscrArr[1][1] = 1 ;
nextscrArr[2][1] = 1 ;
nextscrArr[3][1] = 1 ;
nextscrArr[2][2] = 1 ;
break;
}
case 31: {}//画田字方块case 32: {}//画田字方块case 33: {}//画田字方块case 34: {}//画田字方块
{
nextscrArr[1][1] = 1 ;
nextscrArr[1][2] = 1 ;
nextscrArr[2][1] = 1 ;
nextscrArr[2][2] = 1 ;
break;
}
case 41:{}//画Z状方块case 43://画Z状方块
{
nextscrArr[1][1] = 1 ;
nextscrArr[2][2] = 1 ;
nextscrArr[3][2] = 1 ;
break;
}
case 42:{}//画Z状方块case 44://画Z状方块
{
nextscrArr[2][0] = 1 ;
nextscrArr[2][1] = 1 ;
nextscrArr[1][1] = 1 ;
nextscrArr[1][2] = 1 ;
break;
}
case 51:{}//画反Z状方块case 53:{}//画反Z状方块
{
nextscrArr[1][2] = 1 ;
nextscrArr[2][2] = 1 ;
nextscrArr[2][1] = 1 ;
nextscrArr[3][1] = 1 ;
break;
}
case 52://画反Z状方块case 54://画反Z状方块
{
nextscrArr[1][1] = 1 ;
nextscrArr[1][2] = 1 ;
nextscrArr[2][2] = 1 ;
break;
}
case 61://画反F状方块正{
nextscrArr[1][1] = 1 ;
nextscrArr[1][2] = 1 ;
nextscrArr[2][2] = 1 ;
nextscrArr[3][2] = 1 ;
break;
}
case 62://画反F状方块左{
nextscrArr[2][1] = 1 ;
nextscrArr[1][1] = 1 ;
nextscrArr[1][2] = 1 ;
nextscrArr[1][3] = 1 ;
break;
}
case 63://画反F状方块下{
nextscrArr[0][1] = 1 ;
nextscrArr[1][1] = 1 ;
nextscrArr[2][1] = 1 ;
nextscrArr[2][2] = 1 ;
break;
}
case 64://画反F状方块右{
nextscrArr[2][1] = 1 ;
nextscrArr[2][2] = 1 ;
nextscrArr[1][2] = 1 ;
break;
}
case 71://画F状方块正
{
nextscrArr[1][1] = 1 ;
nextscrArr[1][2] = 1 ;
nextscrArr[2][1] = 1 ;
nextscrArr[3][1] = 1 ;
break;
}
case 72://画F状方块左
{
nextscrArr[1][1] = 1 ;
nextscrArr[2][1] = 1 ;
nextscrArr[2][2] = 1 ;
nextscrArr[2][3] = 1 ;
break;
}
case 73://画F状方块下
{
nextscrArr[1][2] = 1 ;
nextscrArr[2][2] = 1 ;
nextscrArr[3][2] = 1 ;
nextscrArr[3][1] = 1 ;
break;
}
case 74://画F状方块右
{
nextscrArr[1][0] = 1 ;
nextscrArr[1][1] = 1 ;
nextscrArr[1][2] = 1 ;
nextscrArr[2][2] = 1 ;
break;
}
5.2.2.5 俄罗斯方块预览区方块的产生
图5.9预览区方块
如图5.9所示是预览区方块,代码如下:
public synchronized void paint(Graphics g)
{
for( i = 0; i <= nextrowNum; i++){
g.drawLine(10,15*i+7,70,15*i+7); //划横线
g.drawLine(10,15*i+5,70,15*i+5); //划横线
}
for( i = 0; i <= nextcolumnNum; i++){
g.drawLine(15*i+10,5,15*i+10,65); //划纵线
g.drawLine(15*i+12,5,15*i+12,65); //划纵线
//绘制预览区图形
}
for (i = 0; i < 4; i++)
{
for(j = 0; j < 4; j++)
{
switch (nextscrArr[i][j]) //判断预览区方块显示的状态
{
case 0:
break;
case 1:
{ g.setColor(Color.BLACK); //设置背景颜色为黑色
g.fillRect(j * 15 + 11, i * 15 + 6, 14, 14);//填充矩形
}
case 2:
{
g.setColor(Color.blue); //方块的前背景颜色为蓝色
g.fillRect(j*15+13,i*15+8,14,15);break; //画已经落下的方法
}
}
}
}
}
5.2.2.6 俄罗斯方块关数以及分数的处理
图5.10 俄罗斯方块关数以及分数的处理
如图5.10所示,游戏每消一行加10分,根据关数不同,得到不同的分数即可进入下一关,总共有10关。
代码如下:
void deleteRow() {
int num = 0; // 所消的总行数
int row = 14; // 从低行开始
boolean dflag = true; // 消行工作结束标志
boolean flag; // 是否满行标志
int count = 0;// 每行中1的个数,便于满行或空行的判断
while (dflag && row >= 0) // 消行没有结束且所有行没有判断完毕
{
count = 0;
for (int col = 0; col < 10; col++)
// 从i行的各列开始
if (gamecanvas.scrArr[row][col] == 0) // 如果为0,则不满行,进行上层行的处理
count++;
if (count == 0) // 满行情况,消行
{
num++;
// 消行,由于消行而使该行的内容需要重新判断,所以当前处理行值row值不变
for (int k = row - 1; k >= 0; k--)
// 上行下落
for (int m = 0; m < 10; m++)
// 传值
gamecanvas.scrArr[k + 1][m] = gamecanvas.scrArr[k][m];
gamecanvas.repaint();
}
if (count == 10) // 空行,消行结束
dflag = false;
if (count > 0 && count < 10) // 该行不做任何处理,进入上层临近行处理
row--;
} // while
// 重绘,并显示分数
gamecanvas.haha.gamescore = gamecanvas.haha.gamescore + num * 10;
bel4.setText(String
.valueOf(gamecanvas.haha.gamescore));
// 游戏的升级
if (gamecanvas.haha.gamescore >= gamerise * 200)// 判断游戏是否能每20行升级一级
{
gamerise++;
if (gamecanvas.haha.gamethread.gametime > 100) // 游戏的升级
gamecanvas.haha.gamethread.gametime -= 100;
if (gamecanvas.haha.gamesum < 10)// 关数增加一
{
String s = String.valueOf(++gamecanvas.haha.gamesum);// 具体关数还有待确定
bel5.setText(s);
}
}
6 结论
本系统主要实现了网页俄罗斯方块游戏的运行,本系统最大的优点就是方便,只要装有浏览器和java插件,即可运行该系统。
但是本系统也还有很多不足之处,比如说javaapplet的功能没有其他的网页语言多[8],游戏的画面也不是非常好看等等。
对本系统的展望:
1.希望将网站做的更加全面,添加开始游戏以及结束游戏的动画效果。
2.希望将游戏做的更加美观,让用户玩游戏的时候能够更加赏心悦目。
3.希望添加排行榜功能,记录每次结束的分数并加以排序。
4.希望增加双人模式,可以两人一起开始游戏。
经过两个多月的开发,本系统终于完成了,虽然有很多的不足,但我学到了很多,我学到了Eclipse的使用java语言以及javaapplet。
与此同时,该系统也给了我很多经验和教训,让我理解了前期系统设计对于整个系统开发的非凡意义。
在以后的学习中,我会更加努力,并且时常复习这段时间学到的东西,一步一步提高自己的开发能力。
主要参考文献:
[1] 张慧斌: C#网络编程高级篇之网页游戏辅助程序设计[M]. 北京: 电子工业出版社, 2012. 21~30
[2] 郑阿奇: Visual C#网络编程[M]. 北京: 电子工业出版社, 2011.1 21~127
[3] 马骏: C#网络应用编程(第2版)[M]. 北京: 人民邮电出版社, 2010. 36~39
[4] 杨富国: Visual C#.NET网络编程案例解析[M]. 北京: 清华大学出版社有限公司, 2009. 45~56
[5] Patrick McNeil: 网页设计创意书(卷2)(Web页面的视觉盛宴设计师的灵感源泉)[M]. 北京:人民邮电出版社, 2012.77~79
[6] 刘增杰: 精通HTML5 + CSS3+JavaScript网页设计[M]. 北京: 清华大学出版社, 2012. 45~52
[7] [美]Julie C.Meloni: HTML、CSS和JavaScript入门经典[M]. 北京: 人民邮电出版社, 2012.24~28
[8] 斯托克斯: 网页的吸引力设计法则(全彩)[M]. 北京: 电子工业出版社, 2011. 55~63
[9] 温谦: HTML+CSS网页设计与布局从入门到精通[M]. 北京: 人民邮电出版社, 2008. 123~131
[10]亚当斯(Adams,E.): 游戏设计基础[M]. 北京: 机械工业出版社, 2009. 121~127
致谢
本次毕业设计我得到了来自周围老师和同学多方面的帮助和支持,在这里,我要对他们表示衷心的感谢。
首先,我要感谢武汉科技大学计算机科学与技术学院,在过去的三年里,学院为我们提高丰富的课程,充足的图书资源以及优秀的师资队伍,让我们在良好的氛围里学习。
在这里,我不仅学会了各项的知识,也学会了如何待人接物,如何主动自学,这将使我获益一生。
我还要感谢我的指导老师乔瑞,她待人亲切,工作认真负责,并且为我的毕业设计提供了大量的参考资料,当有疑问向她请教时,她总是可以很好的解答出来。
从她那里,我学到了很多,她是我的良师,没有她的帮助,我的毕业设计不可能这么顺利完成。
与此同时,我还要感谢周围的同学。
他们经常热心帮助我,有疑问的时候经常能从同学那里得到解答,从他们那里,我认识到自己的不足,也学会敢于正视自己的缺点。
最后,我要感谢我的父母和亲人。
他们不仅为我提供物质条件,还很关心我的学业,经常打电话询问我的学习情况。
正是他们的期望和支持使我能够全身心的投入到学业中,永远激励我不断前进。
还有许多人都给予过我指导和帮助,在这里,让我再次对给予过我帮助的人至于最衷心的感谢,并祝愿他们永远幸福与快乐。
36。