西工大C++大作业第2题.docx

上传人:b****5 文档编号:5704315 上传时间:2022-12-31 格式:DOCX 页数:24 大小:108.15KB
下载 相关 举报
西工大C++大作业第2题.docx_第1页
第1页 / 共24页
西工大C++大作业第2题.docx_第2页
第2页 / 共24页
西工大C++大作业第2题.docx_第3页
第3页 / 共24页
西工大C++大作业第2题.docx_第4页
第4页 / 共24页
西工大C++大作业第2题.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

西工大C++大作业第2题.docx

《西工大C++大作业第2题.docx》由会员分享,可在线阅读,更多相关《西工大C++大作业第2题.docx(24页珍藏版)》请在冰豆网上搜索。

西工大C++大作业第2题.docx

西工大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[

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1