西工大C++大作业第2题Word文件下载.docx
- 文档编号:18691389
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:24
- 大小:108.15KB
西工大C++大作业第2题Word文件下载.docx
《西工大C++大作业第2题Word文件下载.docx》由会员分享,可在线阅读,更多相关《西工大C++大作业第2题Word文件下载.docx(24页珍藏版)》请在冰豆网上搜索。
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<
iostream>
stdio.h>
string.h>
time.h>
stdlib.h>
windows.h>
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;
HEIGHT;
i++)
for(intj=0;
j<
SIDE;
j++){
if(i==0||i==HEIGHT-1||j==0||j==SIDE-1)map[i][j]=1;
elsemap[i][j]=0;
/********右上方提前显示方块******/
voidFormer_Print_block(intn)
inti;
for(i=0;
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[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;
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){
if(n==6){
i++){
SetCursor(bl[i].y,bl[i].x);
printf("
■"
);
/*********获取不同的方块,出现在中间***********/
voidprint_block(intn)
{inti;
i++){block[i].x=block[i].y=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;
block[0].x=1,block[0].y=11;
block[3].x=2,block[3].y=7;
block[0].x=1,block[0].y=9;
block[1].x=2,block[1].y=7;
block[2].x=1,block[2].y=11;
block[3].x=1,block[3].y=13;
block[1].x=1,block[1].y=11;
SetCursor(block[i].y,block[i].x);
/*************按上键旋转*************/
inti,ok=1;
nodeblo[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++)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;
if(map[blo[1].x-1][blo[1].y])ok=0;
state=0;
elseif(m==1){
blo[3].y+=4;
if(map[blo[1].x][blo[1].y-2])ok=0;
if(ok)for(i=0;
i++){block[i]=blo[i];
else{
blo[3].y-=4;
if(map[blo[0].x-1][blo[0].y])ok=0;
elseif(m==2)
if(state==0)
blo[1].x+=1;
blo[1].y+=2;
blo[3].x-=1;
blo[3].y-=2;
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;
elseif(state==1)
blo[1].x-=1;
blo[3].x+=1;
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;
state=2;
elseif(state==2)
blo[1].y-=2;
blo[3].y+=2;
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;
state=3;
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;
elseif(m==3)
if(map[blo[0].x][blo[0].y-2]||map[blo[2].x][blo[2].y+2])ok=0;
if(map[blo[0].x+1][blo[0].y]||map[blo[2].x-1][blo[2].y])ok=0;
elseif(m==5)
blo[0].x+=2;
blo[1].x+=1;
if(map[blo[3].x][blo[3].y+2])ok=0;
blo[0].y+=4;
blo[1].x-=1;
if(map[blo[3].x-1][blo[3].y])ok=0;
blo[0].x-=2;
if(map[blo[3].x][blo[3].y-2])ok=0;
blo[0].y-=4;
if(map[blo[3].x+1][blo[3].y])ok=0;
elseif(m==6)
i++)block[i]=blo[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西工大 C+ 作业