西工大C++大作业第2题.docx
- 文档编号:5704315
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:24
- 大小:108.15KB
西工大C++大作业第2题.docx
《西工大C++大作业第2题.docx》由会员分享,可在线阅读,更多相关《西工大C++大作业第2题.docx(24页珍藏版)》请在冰豆网上搜索。
西工大C++大作业第2题
作业名称:
俄罗斯方块小游戏
学院:
自动化学院
班级:
学号:
姓名:
团队组成:
西北工业大学
2018年9月7日
请填写以下十项内容,将表格按页对齐(插入空行),勿删除任何部分。
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等软件(XX搜索)。
游戏运行中截图:
游戏结束截图:
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;i for(intj=0;j if(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][blo[1].y-2])ok=0; if(ok){for(i=0;i<5;i++)block[i]=blo[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西工大 C+ 作业