西工大C++大作业第合集.docx
《西工大C++大作业第合集.docx》由会员分享,可在线阅读,更多相关《西工大C++大作业第合集.docx(27页珍藏版)》请在冰豆网上搜索。
西工大C++大作业第合集
作业名称:
俄罗斯方块小游戏
学院:
自动化学院
班级:
学号:
姓名:
团体组成:
西北工业大学
2021年7月12日
请填写以下十项内容,将表格按页对齐(插入空行),勿删除任何部分。
1、问题与背景(描述程序所要处理问题或应用背景)
1.1游戏需求
给出不一样形状(长条形、Z字形、反Z字形、田字形、7字形、反7字形、T字形)下落填充给定区域,若填满一条便消掉,若在游戏中个形状填满了给定区域就判定输,弹出对应提醒。
1.2游戏界面需求
良好用户界面,有相关操作方法(如速度、分数以及下一步要落下形状等)。
让方块在一定区域内运动和变形,该区域用一个颜色表明,即用一个颜色作为背景,本游戏背景为黑色。
还需用另外一个颜色把黑色围起来,宽度适中,要实现美感。
而不一样方块在本游戏中一律用灰色填充后,从而使界面愈加清楚有条理。
1.3游戏方块需求
良好方块设计,绘制七种常见基础图形(长条形、Z字形、反Z形、田字形、L字形、反L形、T字形)以及另外本程序加入点形方块,哥哥方块要能实现它变形,本游戏设置为逆时针变形。
1.4游戏控制需求
游戏控制分为多个方面,包含画面绘制,控制命令分配、控制命令处理,方块绘制,方块移动,方块旋转,方块下落和消层以及计分等。
对各个命令合理处理和综合控制十分关键,一旦犯错可能造成整个程序瓦解,所以设计要十分小心。
2、开发工具(列出所使用开发工具和第3方开发库)
Code:
:
block
DEV-C++
3、关键功效(具体说明程序功效)
这个游戏实现了1中四个游戏需求,完成了以下功效:
(1)给出不一样形状(长条形、Z字形、反Z字形、田字形、7字形、反7字形、T字形)下落填充给定区域,并能完成消除以及结束判定。
(2)用户界面,有相关提醒(如速度、分数以及下一步要落下形状等)。
(3)绘制七种常见基础图形(长条形、Z字形、反Z形、田字形、L字形、反L形、T字形)以及点图形。
(4)操作上用上下左右按键控制
4、设计内容(具体描述处理问题原理和方法、算法、数据结构等)
1、程序步骤图
2、定义方块数据结构
方块是本游戏基础要素,对于方块设计,本游戏采取矩阵画出来在对应位置用‘1’和‘0’表示,以实现多种方块形状。
3、方块变形
方块要实现变形,其实就是经过Exchange俩画出不谈图形来实现,当然乱画是不行,而要控制其改变情况,必需设定对应图形描述,本程序是使用不一样图形不一样ID码表示方法来实现方块描述。
能经过接收键盘指令(即向上键),将所得信号传输给接收函数,再经过信号处理函数改变目前方块ID值,最终依据新ID值打印出新图形,从而实现了方块变形。
4、定时处理机制
为了提升游戏易控性和制动性,定时机制是很有必需。
经过定时器设置后,这里经过利用控制程序跳到定时器时间处理函数去实现,当固定时间片间隔抵达后,先检测目前下坠物是否已经抵达了底部,不是则进行下坠物向下移动一个单位操作,是则到底后产生一个新“下坠物”并替换旧,将原先旧“下坠物”用作目前激活状态下正在使用下坠物,并对使用后部分状态进行分析检测:
是否立即下沉到底部,是则进行销毁操作:
是否在抵达底部同时抵达游戏区顶部,从而判定游戏是否因违规而结束,弹出对应对话框供用户选择是否继续重新开始。
5、程序文件与工程名称(标出程序中全部文件名、工程名称及其说明)
(1)俄罗斯.cpp
(2)俄罗斯.exe
6、函数模块(程序中各个函数原型申明及其说明)
(1)/**********设置光标位置**********/
voidSetCursor(intx,inty)
(2)/**************初始化图**************/
voidINITMAP()
(3)/********右上方提前显示方块******/
nodebl[5];
voidFormer_Print_block(intn)
(4)/*********获取不一样方块,出现在中间***********/
nodeblock[5];//全局使用关键!
!
!
voidprint_block(intn)
(5)/*************按上键旋转*************/
voidExchange(intm)
(6)/*********清除目前方块**********/
voidclear_cube(node*block)
(7)/*******打印目前方块*********/
voidprintt_cube(node*block)
(8)/**********按键***********/
voidMove(intm,intn)
(9)/******判定是否能够向左移动*****/
intIf_Can_Left(node*block)
(10)/******判定是否能够向右移动********/
intIf_Can_Right(node*block)
(11)/*********打印图**********/
voidprint_map()
(12)/*******下降一格*******/
voidcube_drop(node*block)
(13)/*****抵达底部返回1*******/
intis_at_botton(node*block)
(14)/******抵达底部map赋值为1*****/
voidprint_map(node*block)
(15)/******是否能够消去并消去**********/
intCan_It_Cut()
(16)/********是否GameOver********/
intis_gameover(intnum)
(17)/*******游戏结束,再来一局,清理屏幕******/
voidClear_map()
(18)/*******main函数程序入口******/
intmain()
7、使用说明(运行程序小型说明书)
游戏操作说明:
↑控制方块在要求区域内逆时针改变形状
↓控制方块在要求区域内下沉到底部
←控制方块在要求区域内向左移动
→控制方块在要求区域内向又移动
Esc退出游戏
Enter继续游戏
8、程序开发总结(简明叙述编写本作业收获与思索)
此次C++课程设计前期准备阶段,设想部分构想和关键任务;后期这是具体功效私实现。
这次设计中我碰到了不少困难,原来想设计实现双人版对战,美化界面等但因为时间仓促最终没有完成,心里不免有些遗憾,但在实现类封装和类继承和多态性时,也碰到了不少问题,经过和同学们一起讨论和分析,问题最终都得到了处理。
经过这次课程设计,是我知道了不少东西。
我们在日常学习中应该注意对所学知识进行实践利用,在学习时应该进行深入了解,体会知识,这对我们以后学习和工作都会有很大帮助。
经过此次时间,我体会到学以致用乐趣,收获了很多。
9、运行截图(附上程序运行截图画面,最少有1幅,截图越翔实得分越高)
Windows中抓取目前活动窗口:
Alt+PrintScreen,抓取全屏:
PrintScreen。
或者使用HyperSnap等软件(baidu搜索)。
游戏运行中截图:
游戏结束截图:
10、源程序(附上程序源代码,若是多个文件,标出文件名)
#include
#include
#include
#include
#include
#include
usingnamespacestd;
#defineme(a)memset(a,0,sizeof(a))
#definejudge(bl,ok)for(i=0;i<5;i++)if(bl[i].x&&map[bl[i].x][bl[i].y])ok=0
#defineis_pure(node,ok)if(map[node.x][node.y])ok=0
constintHEIGHT=24,LENGTH=40,SIDE=22;
charINIT_MAP[HEIGHT+1][LENGTH+1];
intmap[HEIGHT][SIDE];
structnode{intx,y;intcolor;};
constintTIME_DWELL=1000;
intstate=0;
/**********获取句柄**********/
HANDLEOutput=GetStdHandle(STD_OUTPUT_HANDLE);
HANDLEInput=GetStdHandle(STD_INPUT_HANDLE);
/**********设置光标位置**********/
voidSetCursor(intx,inty){
COORDcd={x,y};
SetConsoleCursorPosition(Output,cd);
}
/**************初始化图**************/
voidINITMAP()
{
for(inti=0;ifor(intj=0;jif(i==0||i==HEIGHT-1||j==0||j==SIDE-1)map[i][j]=1;
elsemap[i][j]=0;
}
}
/********右上方提前显示方块******/
nodebl[5];
voidFormer_Print_block(intn)
{
inti;
for(i=0;i<5;i++){bl[i].x=bl[i].y=0;}
if(n==0){
bl[0].x=3,bl[0].y=28;bl[1].x=3,bl[1].y=30;
bl[2].x=4,bl[2].y=30;bl[3].x=4,bl[3].y=32;
}
if(n==1){
bl[0].x=3,bl[0].y=32;bl[1].x=3,bl[1].y=30;
bl[2].x=4,bl[2].y=30;bl[3].x=4,bl[3].y=28;
}
if(n==2){
bl[0].x=3,bl[0].y=30;bl[1].x=4,bl[1].y=28;
bl[2].x=4,bl[2].y=30;bl[3].x=4,bl[3].y=32;
}
if(n==3){
bl[0].x=3,bl[0].y=27;bl[1].x=3,bl[1].y=29;
bl[2].x=3,bl[2].y=31;bl[3].x=3,bl[3].y=33;
}
if(n==4){
bl[0].x=3,bl[0].y=29;bl[1].x=3,bl[1].y=31;
bl[2].x=4,bl[2].y=29;bl[3].x=4,bl[3].y=31;
}
if(n==5){
bl[0].x=3,bl[0].y=28;bl[1].x=4,bl[1].y=28;
bl[2].x=4,bl[2].y=30;bl[3].x=4,bl[3].y=32;
}
if(n==6){
bl[0].x=3,bl[0].y=32;bl[1].x=4,bl[1].y=28;
bl[2].x=4,bl[2].y=30;bl[3].x=4,bl[3].y=32;
}
for(i=0;i<5;i++){
SetCursor(bl[i].y,bl[i].x);
printf("■");
}
}
/*********获取不一样方块,出现在中间***********/
nodeblock[5];//全局使用关键!
!
!
voidprint_block(intn)
{inti;
for(i=0;i<5;i++){block[i].x=block[i].y=0;}
if(n==0){
block[0].x=1,block[0].y=7;block[1].x=1,block[1].y=9;
block[2].x=2,block[2].y=9;block[3].x=2,block[3].y=11;
}
if(n==1){
block[0].x=1,block[0].y=11;block[1].x=1,block[1].y=9;
block[2].x=2,block[2].y=9;block[3].x=2,block[3].y=7;
}
if(n==2){
block[0].x=1,block[0].y=9;block[1].x=2,block[1].y=7;
block[2].x=2,block[2].y=9;block[3].x=2,block[3].y=11;
}
if(n==3){
block[0].x=1,block[0].y=7;block[1].x=1,block[1].y=9;
block[2].x=1,block[2].y=11;block[3].x=1,block[3].y=13;
}
if(n==4){
block[0].x=1,block[0].y=9;block[1].x=1,block[1].y=11;
block[2].x=2,block[2].y=9;block[3].x=2,block[3].y=11;
}
if(n==5){
block[0].x=1,block[0].y=7;block[1].x=2,block[1].y=7;
block[2].x=2,block[2].y=9;block[3].x=2,block[3].y=11;
}
if(n==6){
block[0].x=1,block[0].y=11;block[1].x=2,block[1].y=7;
block[2].x=2,block[2].y=9;block[3].x=2,block[3].y=11;
}
for(i=0;i<5;i++){
SetCursor(block[i].y,block[i].x);
printf("■");
}
}
/*************按上键旋转*************/
voidExchange(intm)
{
inti,ok=1;
nodeblo[5];
for(i=0;i<5;i++)blo[i]=block[i];
if(m==0){
if(state==0){
blo[0].x+=1;blo[0].y+=2;blo[2].x-=1;blo[2].y+=2;blo[3].x-=2;
judge(blo,ok);
if(map[blo[0].x][blo[0].y-2])ok=0;
if(ok){for(i=0;i<5;i++)block[i]=blo[i];state=1;}
}
else{
blo[0].x-=1;blo[0].y-=2;blo[2].x+=1;blo[2].y-=2;blo[3].x+=2;
judge(blo,ok);
if(map[blo[1].x-1][blo[1].y])ok=0;
if(ok){for(i=0;i<5;i++)block[i]=blo[i];state=0;}
}
}
elseif(m==1){
if(state==0){
blo[0].x-=1;blo[0].y-=2;blo[2].x-=1;blo[2].y+=2;blo[3].y+=4;
judge(blo,ok);
if(map[blo[1].x][blo[1].y-2])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=1;}
}
else{
blo[0].x+=1;blo[0].y+=2;blo[2].x+=1;blo[2].y-=2;blo[3].y-=4;
judge(blo,ok);
if(map[blo[0].x-1][blo[0].y])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=0;}
}
}
elseif(m==2)
{
if(state==0)
{
blo[0].x+=1;blo[0].y-=2;blo[1].x+=1;blo[1].y+=2;blo[3].x-=1;blo[3].y-=2;
judge(blo,ok);
if(map[blo[0].x+1][blo[0].y]||map[blo[0].x-1][block[0].y]||map[blo[3].x][blo[3].y+2])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=1;}
}
elseif(state==1)
{
blo[0].x+=1;blo[0].y+=2;blo[1].x-=1;blo[1].y+=2;blo[3].x+=1;blo[3].y-=2;
judge(blo,ok);
if(map[blo[0].x][blo[0].y+2]||map[blo[0].x][blo[0].y-2]||map[blo[3].x-1][blo[3].y])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=2;}
}
elseif(state==2)
{
blo[0].x-=1;blo[0].y+=2;blo[1].x-=1;blo[1].y-=2;blo[3].x+=1;blo[3].y+=2;
judge(blo,ok);
if(map[blo[0].x+1][blo[0].y]||map[blo[0].x-1][blo[0].y]||map[blo[3].x][blo[3].y-2])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=3;}
}
else{
blo[0].x-=1;blo[0].y-=2;blo[1].x+=1;blo[1].y-=2;blo[3].x-=1;blo[3].y+=2;
judge(blo,ok);
if(map[blo[0].x][blo[0].y+2]||map[blo[0].x][blo[0].y-2]||map[blo[3].x+1][blo[1].y])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=0;}
}
}
elseif(m==3)
{
if(state==0){
blo[0].x+=1;blo[0].y+=2;blo[2].x-=1;blo[2].y-=2;blo[3].x-=2;blo[3].y-=4;
judge(blo,ok);
if(map[blo[0].x][blo[0].y-2]||map[blo[2].x][blo[2].y+2])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=1;}
}
else{
blo[0].x-=1;blo[0].y-=2;blo[2].x+=1;blo[2].y+=2;blo[3].x+=2;blo[3].y+=4;
judge(blo,ok);
if(map[blo[0].x+1][blo[0].y]||map[blo[2].x-1][blo[2].y])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=0;}
}
}
elseif(m==5)
{
if(state==0)
{
blo[0].x+=2;blo[1].x+=1;blo[1].y+=2;blo[3].x-=1;blo[3].y-=2;
judge(blo,ok);
if(map[blo[3].x][blo[3].y+2])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=1;}
}
elseif(state==1)
{
blo[0].y+=4;blo[1].x-=1;blo[1].y+=2;blo[3].x+=1;blo[3].y-=2;
judge(blo,ok);
if(map[blo[3].x-1][blo[3].y])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=2;}
}
elseif(state==2)
{
blo[0].x-=2;blo[1].x-=1;blo[1].y-=2;blo[3].x+=1;blo[3].y+=2;
judge(blo,ok);
if(map[blo[3].x][blo[3].y-2])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=3;}
}
else{
blo[0].y-=4;blo[1].x+=1;blo[1].y-=2;blo[3].x-=1;blo[3].y+=2;
judge(blo,ok);
if(map[blo[3].x+1][blo[3].y])ok=0;
if(ok)for(i=0;i<5;i++){block[i]=blo[i];state=0;}
}
}
elseif(m==6)
{
if(state==0)
{
blo[0].y-=4;blo[1].x+=1;blo[1].y+=2;blo[3].x-=1;blo[3].y-=2;
judge(blo,ok);
if(map[blo[1].x][