俄罗斯方块课程设计.docx
《俄罗斯方块课程设计.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
俄罗斯方块课程设计
学生课程设计
题目:
俄罗斯方块
学生姓名:
学号:
所在院(系):
数学与计算机学院
专业:
2013级软件工程
班级:
软件工程1班
指导教师:
职称:
题 目
俄罗斯方块
1、课程设计的目的
通过本课程设计使学生能够较全面的掌握面向对象程序设计的有关概念和开发方法,以便能较全面地理解、掌握和综合运用所学的知识,提高自身的编程能力。
2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)
实现一个俄罗斯游戏,要求:
(1)尽量使用图形用户界面方式实现(不作硬性要求)
(2)可以实现人机对战,自动判断胜负
(3)界面美观
3、主要参考文献
4、课程设计工作进度计划
序号
时间(天)
内容安排
备注
1
1
分析设计准备
周一
2
2
编程调试阶段
周
至周三
3
1
编写课程设计报告
周四
4
1
考核
周五
总计
5(天)
指导教师(签字)
日期
年月日
教研室意见:
年月日
学生(签字):
接受任务时间:
年月日
注:
任务书由指导教师填写。
附件3:
课程设计(论文)指导教师成绩评定表
题目名称
评分项目
分值
得分
评价内涵
工作
表现
20%
01
学习态度
6
遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。
02
科学实践、调研
7
通过实验、试验、查阅文献、深入生产实践等渠道获取与课程设计有关的材料。
03
课题工作量
7
按期圆满完成规定的任务,工作量饱满。
能力
水平
35%
04
综合运用知识的能力
10
能运用所学知识和技能去发现与解决实际问题,能正确处理实验数据,能对课题进行理论分析,得出有价值的结论。
05
应用文献的能力
5
能独立查阅相关文献和从事其他调研;能提出并较好地论述课题的实施方案;有收集、加工各种信息及获取新知识的能力。
06
设计(实验)能力,方案的设计能力
5
能正确设计实验方案,独立进行装置安装、调试、操作等实验工作,数据正确、可靠;研究思路清晰、完整。
07
计算及计算机应用能力
5
具有较强的数据运算与处理能力;能运用计算机进行资料搜集、加工、处理和辅助设计等。
08
对计算或实验结果的分析能力(综合分析能力、技术经济分析能力)
10
具有较强的数据收集、分析、处理、综合的能力。
成果
质量
45%
09
插图(或图纸)质量、篇幅、设计(论文)规范化程度
5
符合本专业相关规范或规定要求;规范化符合本文件第五条要求。
10
设计说明书(论文)质量
30
综述简练完整,有见解;立论正确,论述充分,结论严谨合理;实验正确,分析处理科学。
11
创新
10
对前人工作有改进或突破,或有独特见解。
成绩
指导教师评语
指导教师签名:
年 月 日
摘要
近年来,随着游戏产业的突飞猛进,游戏玩家的技术也是与日俱增,当你看见游戏高手完美的表演时,你是否想过我也能达到那种水平,本程序采用全世界最金典的游戏—俄罗斯方块作为背景,程序设置了鼠标和键盘两个选择方式,游戏运行时随着等级的提高而速度加快,这需要玩家快速操作。
因此,本程序主要意义是为高手玩家提供训练平台。
其次也可为刚踏入游戏领域的新手们,提供一个很好的锻炼机会。
本次课程设计主要解决利用VisualC++设计实现俄罗斯方块游戏的算法、游戏内部功能、游戏区域的绘图的程序设计。
对于每个俄罗斯方块各自的形态变化改变到下一个形态利用数组来实现,在程序设计中,采用WIN32机制来实现,并且直接从架构的其中一个类对象中继承下来,将它完善而变成有某功能特性的物件对象。
关键词俄罗斯方块数据结构算法数组VisualC++
摘要………………………………………………………………………………………Ⅰ
一、绪论…………………………………………………………………………………2
1.1课题背景………………………………………………………………………………2
二、课程设计的要求与目的……………………………………………………3
2.1课程设计的要求………………………………………………………3
2.2课程设计的目的…………………………………………………………3三、程序需求分析
3.1功能需求…………………………………………………………………………………
3.2方块及各种变化需求……………………………………………………………………
3.3操作需求
3.31向上键……………………………………………………………………………………
3.32向下键……………………………………………………………………………………
3.33向右键………………………………………………………………………………….
四、程序流程图
4.1主要功能设计…………………………………………………………………………
4.2程序流程图……………………………………………………………………………
4.3游戏界面………………………………………………………………………………
4.4生成方块……………………………………………………………………………
4.5方块变形………………………………………………………………………………
4.6方块显示……………………………………………………………………………
4.7障碍判断………………………………………………………………………………
4.8消行记分………………………………………………………………………………
4.9暂停退出………………………………………………………………………………
4.10软件使用说明……………………………………………………………………………
五、源程序代码
5.1源程序代码………………………………………………………………………………
六、程序结果
6.1程序结果…………………………………………………………………………………
参考文献………………………………………………………………………………………
致谢……………………………………………………………………………………………56
第一章绪论
俄罗斯方块是个老幼皆宜的小游戏,是经久不衰的一款游戏,自从它诞生那天起就一直深受人们的喜爱。
几乎每个人都玩过这个游戏,也是人们接触最多的一款游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停得产生,用户根据键盘的四个方向翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键消息函数实现)。
然后程序根据这七种方块堆叠成各种不停得模型。
1.1游戏的背景
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾造成的轰动与造成的经济价值可言说是游戏史上的一件大事。
这款游戏最初是由苏联的游戏制作人AlexPajitnov制作的,它看似简单但却变化无穷,令人上瘾。
相信大多数用户都还记得为它痴迷得茶饭不思不想的那个俄罗斯方块时代。
俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。
现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。
对于一般用户来说,它的规则简单,容易上手,且u、游戏过程变化无穷,俄罗斯方块游戏现在基本上是每个手机必备的游戏,种类千变万化,多种多样。
第二章
课程设计的目的与要求
2.1课程设计的目的
本课程是一个综合性的实践教学环节,其目的在于促进学生复习和巩固计算机软件设计知识,加深对软件设计方法、软件设计技术和设计思想的理解,并能运用所学知识进行开发。
希望通过本课程设计中简单系统的开发,使学生掌握软件设计的基本方法和基本的流程,提高学生的综合应用能力。
2.2课程设计的要求
要求用VC++编写与实现俄罗斯方块。
要求包括系统的需求分析;
系统总框图及每个模块的设计分析;
算法的设计与实现;
游戏的内部实现;
游戏区域绘画的实现;
系统存在的问题及错误处理;
列出所有定义的函数及说明;
附上源程序;
第三章
程序需求分析
3.1功能需求
随机给出不同的形状下落填充给定的区域,若填满一条便消掉,记分,设计不同的游戏难度,即方块下落的速度不同,若在游戏中各形状填满了给定区域为输者。
3.2方块及各种变换需求
本游戏需要七种方块,而每种方块还可以进行旋转。
每种方块每行每列最多只有4个小方块。
可以将它们放在一个n*m的区域内,该区域可以看做是有许多个等面积小方块构成的区域,而这些区域的状态只有两种,被方块占据或空闲。
因此,对于整个游戏区域的空间是被占据或空闲,可以用一位数来标识。
对于七种方块和它们旋转后的形态我们可以用不同的标识进行标记。
对于旋转,游戏中所有方块都是按照逆时针旋转的规则进行的,而且在旋转过程中它们不会因为旋转而下降,总会保持在同一高度。
任何方块经过一个旋转周期还会变
回原型。
3.3操作需求
3.31向上键
产生方块旋转操作,方块并非任何情况都能旋转,如果旋转后与小方块矩阵显示的方块有冲突或超出边界是,均不发生旋转。
因此首先要判断是否有足够的空间进行旋转。
然后是旋转是否旋转。
3.32向下键
产生方块加速下落操作,如果方块已经达到游戏区域底部或者有其他方块遮挡,则方块停止下降。
3.33向右键
产生下落方块右移操作。
首先要判断此方块是否能够发生右移,当越界或被其他显示方块阻挡时,则不能右移。
第四章详细设计
4.1主要功能设计
根据分析,俄罗斯方块这个程序一共要实现如下几个功能,开始游戏(F8)、游戏的暂停\继续(S)和退出游戏(Q)。
其中游戏控制最为主要和重要,它控制着整个游戏的画面和有关数据的操作,是游戏的核心部分。
暂停和退出功能做成一体,在退出的提示下不做任何操作即可实现暂停的功能。
4.2程序流程图
根据分析后的程序结构图设计出相应的流程图。
俄罗斯方块的内容主要包括游戏开始,画背景和边框,显示分数等级和下一个方块的预览图;根据速度没隔一定时间方块自动下落,当有按键操作时,根据相应按键执行动作,每次动作前要判断是否动作可以执行。
下落方块满一行时,消去该行,根据消去行数得到相应分数。
分数达到一定程度,等级提升,速度加快。
同时可以响应Esc按键,提示是否退出程序。
4.3游戏界面
俄罗斯方块的游戏界面包括游戏区域边框、下落方块绘制、右部计分和预览图显示等。
游戏区域边框的绘制比较简单,循环中确定光标的位置输出特定字符,即可完成边框绘制。
游戏区方块的绘制,循环从数据数组中依次读出数据,根据读到的数据显示“□”,最后组成方块的形状,完成方块的绘制。
计分和预览图部分先画出一个矩形区域,然后控制光标在其中显示分数、等级、预览图和提示信息。
4.4生成方块
本程序中生成的方块有7种形状,每一种方块以shapeindex标记,在程序运行生成方块时,调用shapeindex=rand()%5+1;语句,确定当前要显示的是哪一个方块形状。
而在实际运行中,第一次需要调用两次生成方块函数make(),将先产生的赋给游戏当前方块,第二个赋给预览图方块。
以后每次产生一个方块,把预览方块赋给当前方块,把新产生的赋给预览方块。
4.5方块变形
俄罗斯方块的特点就在于通过方块的变形拼满整行来消去该行方块从而使游戏可以继续下去,很难想象不能变形的俄罗斯方块是什么样子。
而变形的过程就是根据当前方块形状改变方块的相对位置,这样就可以改变方块的形状了。
在程序中每当按下“↑”键,程序判断可以变形后,根据当前方块的形状序号shapeindex和变化形状序号changeindex调用相应的方块数值赋给draw()函数,通过刷新重画就可以显示变化后的方块了。
4.6方块显示
以上方块的操作都是数据层面的操作,而真正要在游戏窗口中看到数据的变化,还必须把方块不断的绘制出来。
这就是draw()函数的作用。
把当前运动的方块对应节点存储在一个4*4数组里,变形和生成方块的过程就是更新该数组数据的过程。
然后在draw()函数里检测数组的各个值,并控制光标跳到一定位置,画出“□”组成方块。
4.7障碍判断
障碍判断,就是在方块运动中或者变形中判断周围是否有障碍阻碍下落、移位、变形。
当方块下落遇到下面有方块或者到达下边界则应停止下落并记录数据,存入背景数据数组。
变形时应判断这个变形是否可以进行,如果有障碍则不能变形。
例如当方块达到右边界,而若变形则会越过边界,那么这个变形的命令是不应执行的。
所有这些判断都由meet()函数进行,根据是否有障碍返回1或0,再由其他函数接收执行相应操作。
4.8消行计分
游戏玩家拼满一行后,程序消去满行,并计分。
中当一个方块下落停止后,程序检查方块是否充满了游戏区域,如果是结束游戏。
不是,则判断是否构成消行条件,从下落方块的最低点依次向上检查是否可以消行,根据消去行数分数增加。
分数达到一定程度,等级提升,分数暂定为每1000升一级。
4.9暂停退出
游戏的友好性在于能考虑用户的需要,随时可以暂停/继续游戏,在不愿继续游戏时退出游戏。
本程序可以在用户需要的时候响应Esc按键,提示是否退出游戏,如果不做选择即可暂停游戏,等待选择。
程序调试
经过调试和修改,程序完全实现设计要求,成功模拟了俄罗斯方块的运行过程和游戏效果,只是界面略微简陋,但已从程序层面上实现了游戏,达到了这次实训的要求和目的。
程序正常生成方块,根据速度值每隔一定时间自动下落,如有操作按键按下,根据按键实现位移和变形。
当方块满一行后,可以消除该行,同时记录分数和等级。
按下Esc键红色提示信息正常显示,可以响应Y,N键决定是否退出游戏
4.10软件使用说明
打开俄罗斯方块游戏后,通过控制方向区域的“↑”、“↓”、“←”、“→”来控制,“↑”键代表变形转换,“↓”、“←”、“右”均代表方向键,“Q”代表退出游戏键。
若想暂停游戏,可通过“S”键,当初来询问框是,可不做选择,则可达到暂停的效果
第五章源代码
#include
#include
#include
#include
#include
classConsole
{
public:
Console()
{
hStdOutput=INVALID_HANDLE_VALUE;
hStdError=INVALID_HANDLE_VALUE;
}
boolOpen(void)
{
hStdOutput=GetStdHandle(STD_OUTPUT_HANDLE);
hStdError=GetStdHandle(STD_ERROR_HANDLE);
returnINVALID_HANDLE_VALUE!
=hStdOutput&&INVALID_HANDLE_VALUE!
=hStdError;
}
inlineboolSetTitle(char*title)//设置标题
{
returnTRUE==SetConsoleTitle(title);
}
boolRemoveCursor(void)//去处光标
{
CONSOLE_CURSOR_INFOcci;
if(!
GetConsoleCursorInfo(hStdOutput,&cci))returnfalse;
cci.bVisible=false;
if(!
SetConsoleCursorInfo(hStdOutput,&cci))returnfalse;
if(!
GetConsoleCursorInfo(hStdError,&cci))returnfalse;
cci.bVisible=false;
if(!
SetConsoleCursorInfo(hStdError,&cci))returnfalse;
returntrue;
}
boolSetWindowRect(shortx,shorty)//设置窗体尺寸
{
SMALL_RECTwrt={0,0,x,y};
if(!
SetConsoleWindowInfo(hStdOutput,TRUE,&wrt))returnfalse;
if(!
SetConsoleWindowInfo(hStdError,TRUE,&wrt))returnfalse;
returntrue;
}
boolSetBufSize(shortx,shorty)//设置缓冲尺寸
{
COORDcoord={x,y};
if(!
SetConsoleScreenBufferSize(hStdOutput,coord))returnfalse;
if(!
SetConsoleScreenBufferSize(hStdError,coord))returnfalse;
returntrue;
}
boolGotoXY(shortx,shorty)//移动光标
{
COORDcoord={x,y};
if(!
SetConsoleCursorPosition(hStdOutput,coord))returnfalse;
if(!
SetConsoleCursorPosition(hStdError,coord))returnfalse;
returntrue;
}
boolSetColor(WORDcolor)//设置前景色/背景色
{
if(!
SetConsoleTextAttribute(hStdOutput,color))returnfalse;
if(!
SetConsoleTextAttribute(hStdError,color))returnfalse;
returntrue;
}
boolOutputString(constchar*pstr,size_tlen=0)//输出字符串
{
DWORDn=0;
returnTRUE==WriteConsole(hStdOutput,pstr,len?
len:
strlen(pstr),&n,NULL);
}
boolOutputStringNoMove(shortx,shorty,constchar*pstr,size_tlen=0)//输出字符串
{
COORDcoord={x,y};
DWORDn=0;
returnTRUE==WriteConsoleOutputCharacter(hStdOutput,pstr,len?
len:
strlen(pstr),coord,&n);
}
private:
HANDLEhStdOutput;
HANDLEhStdError;
};
constcharbg[]=
"┏━━━━━━━━━━━┓"
"┃■■■■■■■■■■■┃←↓→↑"
"┃■■■■■■■■■■■┃Begin:
F8"
"┃■■■■■■■■■■■┃"
"┃■■■■■■■■■■■┃Sleep"
"┃■■■■■■■■■■■┃Quit"
"┃■■■■■■■■■■■┃"
"┃■■■■■■■■■■■┃"
"┃■■■■■■■■■■■┃NEXT"
"┃■■■■■■■■■■■┃┏━━━━┓"
"┃■■■■■■■■■■■┃┃ ┃"
"┃■■■■■■■■■■■┃┃ ┃"
"┃■■■■■■■■■■■┃┗━━━━┛"
"┃■■■■■■■■■■■┃LEVEL"
"┃■■■■■■■■■■■┃┏━━━━┓"
"┃■■■■■■■■■■■┃┃0┃"
"┃■■■■■■■■■■■┃┗━━━━┛"
"┃■■■■■■■■■■■┃SCORE"
"┃■■■■■■■■■■■┃┏━━━━┓"
"┃■■■■■■■■■■■┃┃00000┃"
"┗━━━━━━━━━━━┛┗━━━━┛";
constcharbk[7][4][4][4]=
{
{
{{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}},
{{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}},
{{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}}
}
{
{{1,1,1,0},{1,0,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}},
{{0,0,1,0},{1,1,1,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}}
}
{
{{1,1,1,0},{0,0,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,0,0,0},{1,1,1,0},{0,0,0,0},{0,0,0,0}},
{{0,1,0,0},{0,1,0,0},{1,1,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,1,0,0},{1,1,0,0