c语言数据结构程序设计俄罗斯方块解读.docx
《c语言数据结构程序设计俄罗斯方块解读.docx》由会员分享,可在线阅读,更多相关《c语言数据结构程序设计俄罗斯方块解读.docx(21页珍藏版)》请在冰豆网上搜索。
![c语言数据结构程序设计俄罗斯方块解读.docx](https://file1.bdocx.com/fileroot1/2023-4/21/6db1254b-322d-406f-b63f-5013f6675dd2/6db1254b-322d-406f-b63f-5013f6675dd21.gif)
c语言数据结构程序设计俄罗斯方块解读
课程论文(设计)
课程名称《数据结构》课程设计
指导老师
所在学院
专业年级
提交日期
成绩
小组成员表
姓名
学号
承担任务
俄罗斯方块的基本算法实现
系统调试
游戏场景的规划与实现
游戏得分算法分析、游戏后期测试开场动画
制作ppt
游戏结束条件判断
游戏得分算法分析、游戏后期测试
开场动画
制作ppt
课程设计实验
起止日期:
2012-2013学年第二学期
系别
班级
学号
姓名
实验题目
■设计性口
综合性
俄罗斯方块小游戏
在本次课程设计中,我负责编写游戏的界面和场景。
这是很重要的工作,
直接关系到玩家的游戏体验和对游戏的评价。
所以我充分发挥想象力和创造力在场景位置安排上下了一番苦工,也和组内成员进行过多次的探讨,最终
自
写出了一个具有美感的游戏场景,力求让用户在游戏中体验到给多的快感。
我
更重要的是在此次程序设计中与组员在游戏框架上的讨论中学到了很多新
评
知识,对数据结构的理解也在实践中得到了提高。
价
能够实现实验要求的功能
□全部□部分
算法有新意
□有
□一
般
程序运行通过
□全部□部分
教师评语
算法注释说明
□完善□仅有功能说明
接口参数说明
□有
□无
按期上交打印文档资料及源程序
□所有□部分
综合设计说明报告结构
□合理□不合理
用户使用说明
□完整□不全
现场演示操作有准备
□有
□无
问题解答流畅
□流畅□不流畅
独立完成实验
□能
□不能
体现团队合作精神。
□能够□不能
成
绩
、需求分析
我们对俄罗斯方块这个游戏一点也不陌生,知道游戏的玩法和实现后,我们很快就着手
开干。
游戏要有出现场景、方块、消除方块得分、判断游戏结束等几个大功能。
结构清晰简洁便于分工。
二、算法原理介绍
游戏主要使用了数组这个数据结构。
不过与以往的程序不同,这个游戏有一个大数组包
含很多个小数组,大数组不断的吸收小数组内的元素,达到条件得分。
三、概要设计
1、功能块各函数列表
-鏗Igameclasses軌
-_jGlobals
•gameoverf)
•gotoxy[int比inty]
•JudgelnO
•main||
.nextboxfl
•rollD_
•scoreO
.showm方p[]
&box
3box_nextstep
2boxtype
◎flags
Wgamespeed
3gamespeedl
@key
ykey1
“map
3map_x
pmap_y
wma>Cx
•MAX,
2nextbox
V
Jh■r
■*ClassView冒FileView2、场景的设置intmap[28][17]={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1},{0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1},{0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1},{0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
voidshowmap()
{
inti,j;
for(i=5;i<28;i++)
{for(j=1;j<17;j++){
gotoxy(2*j,i);
if(j==1||j==2||j==15||j==16)
{printf("丨");}
elseif(i==26||i==27)
{printf("—");}
elseif(map[i][j]==1)printf("■");elseif(map[i][j]==0)printf("□");
}
3、其余功能的实现(如方块的出现下落旋转得分计算游戏结束条件判断等)
(1)旋转voidroll()
{inti,j;
p_xnext=p_x;
p_ynext=p_y;
for(i=0;i<5;i++)for(j=0;j<5;j++){box_next_step[4-j][i]=box[i]j}一一
(2)得分计算
voidscore()
inti,j,k;for(i=25;i>5;i--)
{for(j=3;j<15;j++)
{if(map[i][j]==1)flags=1;else{
flags=0;break;
}
}
if(flags==1)
{pointrank++;for(j=3;j<15;j++){
for(k=i;k>5;k--)
{map[k][j]=map[k-1][j];
}
}i++;
}
}switch(pointrank)
{
case1:
scores=scores+10;break;
case2:
scores=scores+25;break;
case3:
scores=scores+40;break;
case4:
scores=scores+60;break;
default:
scores=scores+0;
}gotoxy(40,15);
printf("YourScore:
%d",scores);pointrank=0;
showmap();
Sleep(300);
3)游戏结束判断intgameover()
{
inti;
for(i=3;i<15;i++)
{if(map[5][i]==1)return1;
}
return0;
}
四、测试分析
1、游戏开始界面2、游戏进行中,操作键为键盘数字2、4、6、8,其中2为加速下落,4为左移,
6为右移,8为旋转。
3、游戏介绍,按任意键退出游戏。
游戏结束条件:
当方块高度到达顶部时,游戏自动停止,并提示GameOver。
总结:
需求分析方面:
我们对俄罗斯方块这个游戏一点也不陌生,知道游戏的玩法和实现后,我们很快就着手开干。
游戏要有出现场景•方块•消除方块得分・判断游戏结束等几个大功能。
结构清晰简洁便于分工。
问题:
设计过程中遇到了些许难题,那就是如何才能可以在屏幕上指定位置显示内容。
一开始发现很困难,不过在和组员讨论过后,我们发现gotoxy()函数,十分简单的就解决了这个难题。
数据结构:
游戏主要使用了数组这个数据结构。
不过与以往的程序不同,这个游戏有一个大数组包含很多个小数组,大数组不断的吸收小数组内的元素,达到条件得分。
代码
#include
#include
#include
#include
#include
#defineMAX_BOX7
int
p_x=5,p_y=1,map_x=1,map_y=1,p_xnext=5,p_ynext=1,scores=0,key1=0,flags=0,gamespeed=200,gamespeed1=200,pointrank=0;
intMAX_X=17,MAX_Y=28;
charkey;intbox[5][5]={0};
intbox_next_step[5][5]={0};
intnextbox[5][5]={0};
intboxtype[MAX_BOX][5][5]={{
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0},
{0,0,1,0,0}
},
{
{0,0,0,0,0},
{0,0,1,0,0},
{0,1,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{
{0,0,0,0,0},
{0,1,1,0,0},
{0,0,1,1,0},
{0,0,0,0,0},
{0,0,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,0,0}
},
{
{0,0,0,0,0},
{0,0,1,1,0},
{0,0,1,1,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{
{0,0,0,0,0},
{0,0,1,0,0},
{1,1,1,0,0},
{0,0,0,0,0},
{0,0,0,0,0}
},
{
{0,0,0,0,0},
{0,0,1,0,0},
{0,0,1,1,1},
{0,0,0,0,0},{0,0,0,0,0}
}
};
intmap[28][17]={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1},
{0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1},{0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1},{0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1},{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},{0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}};
externvoidshowlogo();
voidgotoxy(intx,inty){//gotoxy在TC中是在system.h库文件里的一个函
COORDc;
c.X=x-1;c.Y=y-1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);}
voidshowmap()
{
inti,j;
for(i=5;i<28;i++)
{
for(j=1;j<17;j++)
{
gotoxy(2*j,i);
if(j==1||j==2||j==15||j==16)
{printf("丨");}
elseif(i==26||i==27)
{printf(”—");}
elseif(map[i][j]==1)printf("■");
elseif(map[i][j]==0)printf("□");
}
}
}
voidnext_box()
{
inttype,i,j;
srand(time(NULL));
type=rand()%6;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
nextbox[i][j]=boxtype[type][i][j];
}
gotoxy(40,6);
printf("Next:
");
gotoxy(40,7);
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
gotoxy(40+2*j,7+i);
if(nextbox[i][j]==1)printf("■");elseprintf("");
}
}
intjudgein()
{
inti,j;
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
if(box_next_step[i][j]==1)
{
if(map[p_ynext+i][p_xnext+j]==1)return0;
}
}
}
return1;
}
intgameover()
{
inti;
for(i=3;i<15;i++)
{
if(map[5][i]==1)
return1;
}
return0;
}
voidroll()
{
p_xnext=p_x;
p_ynext=p_y;
inti,j;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{box_next_step[4-j][i]=box[i][j];
}
}
voidscore()
{
inti,j,k;
for(i=25;i>5;i--)
{
for(j=3;j<15;j++)
{
if(map[i][j]==1)flags=1;else{
flags=0;
break;
}
}
if(flags==1)
{
pointrank++;
for(j=3;j<15;j++)
{
for(k=i;k>5;k--)
{
map[k][j]=map[k-1][j];
}
}
i++;
}
}
switch(pointrank)
{
case1:
scores=scores+10;break;
case2:
scores=scores+25;break;
case3:
scores=scores+40;break;
case4:
scores=scores+60;break;
default:
scores=scores+0;
}gotoxy(40,15);
printf("YourScore:
%d",scores);pointrank=0;
showmap();
Sleep(300);
}
voidmain()
{
showlogo();gotoxy(50,20);
printf("w转向s加速下降");gotoxy(50,21);
printf("a左d右");
inttype,flag1=1,i,j,flag=0,flag2=1;showmap();
next_box();
Sleep(1000);srand(time(NULL));type=rand()%6;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
box[i][j]=boxtype[type][i][j];
}
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
gotoxy(2*p_x+2*j,p_y+i);if(box[i][j]==1&&map[p_y+i][p_x+j]==0){
printf("■");
}
}
}gotoxy(40,15);printf("YourScore:
0");Sleep(gamespeed);
Here:
while
(1)
if(!
kbhit())
{
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
box_next_step[i][j]=box[i][j];
}
p_xnext=p_x;
p_ynext=p_y+1;
flag1=judgein();
if(flag1==0)
{
for(i=0;i<5;i++)
{
for(j=0;j<5;j++)
{
gotoxy(2*p_x+2*j,p_y+i);
if(box[i][j]==1&&map[p_y+i][p_x+j]==0){printf("■");
}
}
}
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
if(box[i][j]==1)
map[p_y+i][p_x+j]=1;
}
flag=gameover();
if(flag!
=0)
{
gotoxy(10,10);
printf("");
gotoxy(10,12);
printf("");
gotoxy(10,11);printf("GameOver");gotoxy(40,20);
break;//应该修改!
!
!
!
!
}
else
{
score();
p_x=5;p_y=1;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
box[i][j]=nextbox[i][j];
}
next_box();
Sleep(300);
}
}
else
{
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
gotoxy(2*p_x+2*j,p_y+i);if(box[i][j]==1&&map[p_y+i][p_x+j]==0){printf("□");
}
}
p_y++;
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{
gotoxy(2*p_x+2*j,p_y+i);
if(box[i][j]==1&&map[p_y+i][p_x+j]==0)
{
printf("■");
}
Sleep(gamespeed);gamespeed=gamespeed1;
}
gotoHere;
}
else{
key=getch();
switch(key)
{
case'w':
case'W':
roll();
flag2=judgein();
if(flag2==1){for(i=0;i<5;i++)for(j=0;j<5;j++){gotoxy(2*p_x+2*j,p_y+i);
if(box[i][j]==1&&map[p_y+i][p_x+j]==0){
printf("□");
}
}
for(i=0;i<5;i++)
for(j=0;j<5;j++)
{box[i][j]=box_next_step[i][j];
}
}
gotoHere;
case'a':
case'A':
p_xnext=p_x-1;
p_ynext=p_y;
flag2=judgein();
if(flag2==1){for(i=0;i<5;i++)for(j=0;j<5;j++){gotoxy(2*p_x+2*j,p_y+i);if(box[i][j]==1&&map[p_y+i][p_x+j]==0){
printf("□");
}
}
p_x--;
}
gotoHere;
case'd':
case'D':
p_xnext=p_x+1;
p_ynext=p_y;
flag2=judgein();
if(flag2==1){
for(i=0;i<5;i++)for(j=0;j<5;j++){gotoxy(2*p_x+2*j,p_y+i);if(box[i][j]==1&&map[p_y+i][p_x+j]==0){
printf("□");
}
}
p_x++;
}
gotoHere;
case