C语言编写俄罗斯方块论文.docx
《C语言编写俄罗斯方块论文.docx》由会员分享,可在线阅读,更多相关《C语言编写俄罗斯方块论文.docx(53页珍藏版)》请在冰豆网上搜索。
C语言编写俄罗斯方块论文
俄罗斯方块
学号:
班级:
姓名:
指导教师:
完成日期:
2012年5月
基于C语言的俄罗斯方块游戏
[摘要]:
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏。
俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
由于上手简单、老少皆宜,从而家喻户晓,风靡世界。
[关键词]:
C语言;心得体会;影响
1.引言
随着社会的发展,人们生活的步调日益加快,越来越多的人加入了全球化的世界.人们不在拘泥于一小块天地.加班,出差成了现代人不可避免的公务.而此时一款可以随时随地娱乐的游戏成了必需品.在手机和电脑成为人们日用品的社会,一款能在其上能便捷运行的游戏成为买家的参考点.
现在我们所要设计的这一款基于C语言的游戏——贪吃蛇,就是满足以上要求而设计出来的,希望能给玩家带来娱乐.贪吃蛇这一游戏简单易行,操作方便,娱乐性较强,吸引了不少人.这一款游戏紧紧地抓住了人们的心理,虽然简单,却起乐无穷,在人们不断追求更多的欲望下,该游戏给人们带来了追逐的快感,以及成功后的满足感,对于一直处于高压下的现代人是很好的放松工具.
1.1开发工具
《C/C++程序设计学习与试验系统》
该系统继承了TurboC2.0/C++3.0、GCC、VisuaC++6.0这四种常见的编译器,可以很好满足目前主流的C语言教材的实验需求。
C语言具有下列特点:
1.1.1C是中级预言
它把高级语言的基本结构和语句与低级语言的实用性结合起来,C语言可以像汇编语言一样对位、字节和地址进行操作,通常还是称C为高级语言。
1.1.2C是结构化语言
结构化语言的特点是程序的各个部分除了必要地数据交流外彼此独立。
这种结构化方式可使程序层次清晰,便于使用,维护及调试。
1.1.3C语言功能齐全
C语言具有多种数据类型,并引入了指针概念,可使程序效率更高;C语言也具有强大的图形功能;具有较强的计算功能、逻辑判断功能。
1.1.4C语言可移植性好
与汇编语言相比,C语言程序适用围大,可用于各种操作系统和各种型号的计算机。
2游戏设计
2.1游戏设计要求
2.1.1.设计题目:
俄罗斯方块游戏
2.1.2.设计容:
一组由4个小型正方形组成的规则图形,中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。
通过设计者预先设置的随机发生器不断地输出单个方块到场地顶部,以一定的规则进行移动、旋转、下落和摆放,锁定并填充到场地中。
每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并且以此来换取一定的积分或者其他形式的奖励。
而未被消除的方块会一直累积,并对后来的方块摆放造成各种影响。
如果未被消除的方块堆放的高度超过场地所规定的最大高度则游戏结束。
2.1.3.功能模块划分:
系统功能模块
2.2游戏设计思想
2.2.1游戏界面:
方块堆积。
遇整则消。
2.2.2设计思路
1、一个用于摆放小型正方形的平面虚拟场地,其标准大小:
行宽为10,列高为20,以每个小正方形为单位。
2.、一组由4个小型正方形组成的规则图形,英文称为Tetromino,中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。
I:
一次最多消除四层 J(左右):
最多消除三层,或消除二层 L:
最多消除三层,或消除二层 O:
消除一至二层 S(左右):
最多二层,容易造成孔洞 Z(左右):
最多二层,容易造成孔洞 T:
最多二层
(1)部分游戏有单格方块,可以穿透固定的方块到达最下层空位。
其他的改版中出现更多特别的造型。
方块会从区域上方开始缓慢继续落下。
(2)玩家可以做的操作有:
以90度为单位旋转方块,以格子为单位左右移动方块,让方块加速落下。
(3)方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。
(4)当区域中某一列横向格子全部由方块填满,则该列会消失并成为玩家的得分。
同时删除的列数越多,得分指数上升。
(5)当固定的方块堆到区域最上方而无法消除层数时,则游戏结束。
(6)一般来说,游戏还会提示下一个要落下的方块,熟练的玩家会计算到下一个方块,评估现在要如何进行。
由于游戏能不断进行下去对商业用游戏不太理想,所以一般还会随着游戏的进行而加速提高难度。
3、通过设计者预先设置的随机发生器不断地输出单个方块到场地顶部,以一定的规则进行移动、旋转、下落和摆放,锁定并填充到场地中。
每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并且以此来换取一定的积分或者其他形式的奖励。
而未被消除的方块会一直累积,并对后来的方块摆放造成各种影响。
4、如果未被消除的方块堆放的高度超过场地所规定的最大高度(并不一定是20或者玩家所能见到的高度),则游戏结束。
具体到每一款不同的游戏,其中的细节规则都可能有千差万别,但是以上的基本规则是相同的。
2.3:
游戏功能
2.3.1:
开始部分
游戏是运行在图形模式下的,所以第一步一定是初始化图形模式,接着要有开始的界面,就像书有封面一样,我设置了一个游戏的标题画面,除了游戏标题画面我还设置了一个欢迎画面。
标题画面以后,还要为游戏的运行部分作初始化,包括绘制游戏运行时的背景,对游戏某些重要变量的初始化。
2.3.2.运行部分
俄罗斯方块的要求为:
不同形状组合的方块从界面上方落下。
通过键盘上的四个光标控制方块下落时的形状转换和下落方向。
方块堆积在一起,将区域占满时则会消除以增加
游戏分数。
整个游戏过程分为三个步骤:
1、按游戏界面的"开始"按钮或者F2键来开始游戏,自己使用右边的窗口,对手使用左边的窗口
2、键盘操作:
系统缺省设置使用右边的窗口,用光标操作,"←"左移一格;"→"右移一格;"↑"旋转方块;↓方块丢下(方块下落到底),"End"健可以一格格的下落,用户还可以自定义习惯的按键来操作游戏。
3、计分牌显示的容:
“分数”为双方本局的分数,计分标准为下落一个块10分,一次消一行100分、2行200分、3行400分、4行800分。
等级”为双方的游戏设置等级,当分数达到一定的值,等级就会提升、速度加快。
“行数”第一行为双方消的行数,第二行是送给对方的行数。
“比分”为双方赢的局数。
2.3.3:
结束部分:
游戏结束时,显示“GAMEOVER”
3.实验总结:
3.1开发背景与需求分析
随着网络技术的发展,人们的生活越来越离不开网络,网络给人们带来了各种各样的信息和更多更新的娱乐。
据统计。
每天上网的人群中75%的人用来丰富自己的生活。
其中游戏最为常见和普遍。
所以,这次课程设计我想实现一个小游戏:
俄罗斯方块。
需求分析
1)游戏面板(画布)GameCanvas类,完成游戏显示;
2)方块绘画drawUnit类,方块下落过程中的各种形态;
3)主界面实现游戏的开始,退出,暂停,提高级数,降低级数功能及图像界面排版;
4)通过键盘按键实现游戏,并且可以调节游戏速度。
3.2系统功能介绍
俄罗斯方块是一个非常复杂但比较有趣并且耐玩的游戏,相信很多人对俄罗斯方块并不陌生,如下图所示,游戏中共有七种方块,每种方块都有四个方格组成。
这七种方块可以旋转90度、180度、270度,因此每种方块有四种状态,七种方块总有28种状态,这28种状态的方块随机产生,自由下落,落下时可由玩家通过键盘上的上、下、左、右控制键来控制方块的反转、移动和加速下落。
如果下落时,方块填满某一行则这一行消失,同时给玩家加分,若由存在空格的方块填满整个窗口,则游戏结束。
图1-1初始状态
图1-2开始游戏
图1-3消除一行
图1-4消除两行
图1-5消除四行
图1-6游戏结束
4.核心代码:
importjava.awt.*;
importjava.awt.event.*;
//俄罗斯方块类
publicclasscomputerextendsFrame{
publicstaticbooleanisPlay=false;
publicstaticintlevel=1,score=0;
publicstaticTextFieldscoreField,levelField;
publicstaticMyTimertimer;
GameCanvasgameScr;//声明一个属于画布类得变量
publicstaticvoidmain(String[]argus){
computerers=newcomputer("俄罗斯方块游戏V1.0Author:
Vincent");//运用构造方法为框架名
WindowListenerwin_listener=newWinListener();//定义一个窗口监听事件对象
ers.addWindowListener(win_listener);//为框架添加该监听器
}
computer(Stringtitle)//俄罗斯方块类的构造方法
{
super(title);//调用父类得构造方法
setSize(600,480);//设置框架的尺寸
setLayout(newGridLayout(1,2));//设置框架的布局流
gameScr=newGameCanvas();
gameScr.addKeyListener(gameScr);//为该对象注册键盘点击监听器
timer=newMyTimer(gameScr);
timer.setDaemon(true);
timer.start();
timer.suspend();
add(gameScr);
PanelrightScr=newPanel();
rightScr.setLayout(newGridLayout(2,1,0,30));
rightScr.setSize(120,500);
add(rightScr);
//右边信息窗体的布局
MyPanelinfoScr=newMyPanel();
infoScr.setLayout(newGridLayout(4,1,0,5));
infoScr.setSize(120,300);
rightScr.add(infoScr);
//定义标签和初始值
Labelscorep=newLabel("分数:
",Label.LEFT);
Labellevelp=newLabel("级数:
",Label.LEFT);
scoreField=newTextField(8);
levelField=newTextField(8);
scoreField.setEditable(false);
levelField.setEditable(false);
infoScr.add(scorep);
infoScr.add(scoreField);
infoScr.add(levelp);
infoScr.add(levelField);
scorep.setSize(newDimension(20,60));
scoreField.setSize(newDimension(20,60));
levelp.setSize(newDimension(20,60));
levelField.setSize(newDimension(20,60));
scoreField.setText("0");
levelField.setText("1");
//右边控制按钮窗体的布局
MyPanelcontrolScr=newMyPanel();
controlScr.setLayout(newGridLayout(5,1,0,5));
rightScr.add(controlScr);
//定义按钮play
Buttonplay_b=newButton("开始游戏");
play_b.setSize(newDimension(50,200));
play_b.addActionListener(newCommand(Command.button_play,gameScr));
//定义按钮LevelUP
Buttonlevel_up_b=newButton("提高级数");
level_up_b.setSize(newDimension(50,200));
level_up_b.addActionListener(newCommand(Command.button_levelup,
gameScr));
//定义按钮LevelDown
Buttonlevel_down_b=newButton("降低级数");
level_down_b.setSize(newDimension(50,200));
level_down_b.addActionListener(newCommand(Command.button_leveldown,
gameScr));
//定义按钮LevelPause
Buttonpause_b=newButton("游戏暂停");
pause_b.setSize(newDimension(50,200));
pause_b.addActionListener(newCommand(Command.button_pause,gameScr));
//定义按钮Quit
Buttonquit_b=newButton("退出游戏");
quit_b.setSize(newDimension(50,200));
quit_b.addActionListener(newCommand(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的四周留空间
classMyPanelextendsPanel{
publicInsetsgetInsets(){
returnnewInsets(30,50,30,50);
}
}
//游戏画布类
classGameCanvasextendsCanvasimplementsKeyListener{
finalintunitSize=30;//小方块边长
introwNum;//正方格的行数
intcolumnNum;//正方格的列数
intmaxAllowRowNum;//允许有多少行未削
intblockInitRow;//新出现块的起始行坐标
intblockInitCol;//新出现块的起始列坐标
int[][]scrArr;//屏幕数组
Blockb;//对方快的引用
//画布类的构造方法
GameCanvas(){
rowNum=15;
columnNum=10;
maxAllowRowNum=rowNum-2;
b=newBlock(this);
blockInitRow=rowNum-1;
blockInitCol=columnNum/2-2;
scrArr=newint[32][32];
}
//初始化屏幕,并将屏幕数组清零的方法
voidinitScr(){
for(inti=0;ifor(intj=0;jscrArr[i][j]=0;
b.reset();
repaint();
}
//重新刷新画布方法
publicvoidpaint(Graphicsg){
for(inti=0;ifor(intj=0;jdrawUnit(i,j,scrArr[i][j]);
}
//画方块的方法
publicvoiddrawUnit(introw,intcol,inttype){
scrArr[row][col]=type;
Graphicsg=getGraphics();
switch(type){//表示画方快的方法
case0:
g.setColor(Color.black);
break;//以背景为颜色画
case1:
g.setColor(Color.blue);
break;//画正在下落的方块
case2:
g.setColor(Color.magenta);
break;//画已经落下的方法
}
g.fill3DRect(col*unitSize,getSize().height-(row+1)*unitSize,
unitSize,unitSize,true);
g.dispose();
}
publicBlockgetBlock(){
returnb;//返回block实例的引用
}
//返回屏幕数组中(row,col)位置的属性值
publicintgetScrArrXY(introw,intcol){
if(row<0||row>=rowNum||col<0||col>=columnNum)
return(-1);
else
return(scrArr[row][col]);
}
//返回新块的初始行坐标方法
publicintgetInitRow(){
return(blockInitRow);//返回新块的初始行坐标
}
//返回新块的初始列坐标方法
publicintgetInitCol(){
return(blockInitCol);//返回新块的初始列坐标
}
//满行删除方法
voiddeleteFullLine(){
intfull_line_num=0;
intk=0;
for(inti=0;ibooleanisfull=true;
L1:
for(intj=0;jif(scrArr[i][j]==0){
k++;
isfull=false;
breakL1;
}
if(isfull)
full_line_num++;
if(k!
=0&&k-1!
=i&&!
isfull)
for(intj=0;jif(scrArr[i][j]==0)
drawUnit(k-1,j,0);
else
drawUnit(k-1,j,2);
scrArr[k-1][j]=scrArr[i][j];
}
}
for(inti=k-1;ifor(intj=0;jdrawUnit(i,j,0);
scrArr[i][j]=0;
}
}
computer.score+=full_line_num;
computer.scoreField.setText(""+computer.score);
}
//判断游戏是否结束方法
booleanisGameEnd(){
for(intcol=0;colif(scrArr[maxAllowRowNum][col]!
=0)
returntrue;
}
returnfalse;
}
publicvoidkeyTyped(KeyEvente){
}
publicvoidkeyReleased(KeyEvente){
}
//处理键盘输入的方法
publicvoidkeyPressed(KeyEvente){
if(!
computer.isPlay)
return;
switch(e.getKeyCode()){
caseKeyEvent.VK_DOWN:
b.fallDown();
break;
caseKeyEvent.VK_LEFT:
b.leftMove();
break;
caseKeyEvent.VK_RIGHT:
b.rightMove();
break;
caseKeyEvent.VK_UP:
b.leftTurn();
break;
}
}
}
//处理控制类
classCommandimplementsActionListener{
staticfinalintbutton_play=1;//给按钮分配编号
staticfinalintbutton_levelup=2;
staticfinalintbutton_leveldown=3;
staticfinalintbutton_quit=4;
staticfinalintbutton_pause=5;
staticbooleanpause_resume=true;
intcurButton;//当前按钮
GameCanvasscr;
//控制按钮类的构造方法
Command(intbutton,GameCanvasscr){
curButton=button;
this.scr=scr;
}
//按钮执行方法
publicvoidactionPerformed(ActionEvente){
switch(curButton){
casebutton_pl