实训报告.docx
- 文档编号:30207240
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:43
- 大小:219.03KB
实训报告.docx
《实训报告.docx》由会员分享,可在线阅读,更多相关《实训报告.docx(43页珍藏版)》请在冰豆网上搜索。
实训报告
实训报告
实训名称:
俄罗斯方块项目设计
院系:
计算机科学与工程学院
专业:
物联网工程
班 级:
0923121
学号:
092312113
姓名:
林秋照
指导教师:
乐德广
开课时间:
2013至2014学年短学期
常熟理工学院计算机科学与工程学院制
简介
1.1目的
了解体验软件工程开发的一般步骤
体验面向对象设计开发的设计和过程
熟悉掌握软件开发的技巧和过程
阐述C语言实现俄罗斯方块游戏的界面的功能和界面设计。
体验团队合作精神
参考资料
《C编程基础》、《软件测试和软件质量保证》、《基于软件开发项目的毕业设计》;
属于本项目的其他已发表文件:
暂无;
所要用到的软件开发标准:
国家计算机标准。
1.2术语定义及说明
列出本文件中用到的专门术语的定义和外文首字母组词的原词组。
①.形状:
由4个小方块组成的7种形状。
②.形状活动区域:
由24行和12列组成,形状不能在此区域外活动。
③.计分系统:
消除一行是10分,二行是30分,三行是60分,四行是100分。
④.游戏难度:
初始速度为0.8秒下落一次初始等级为0级。
每升一级,需要200分,速度提升0.04秒。
游戏的最大速度为0.04秒,最高等级为19级。
⑤.检测:
当有n行存储满方块时,消除方块。
当最顶行存储方块时,结束游戏,或者当新方块打印不出开时,结束游戏。
⑥.移动:
左移设置为“方向左键”,右移设置为“方向右键”,旋转设置为“方向上键”,加速下落设置为“方向下键”,暂停设置为“空格键”,重新开始设置为“r或R”键,直落(直落是由容器内形状由移动位置直接落到容器底部)设置为“enter键”。
⑦.菜单选项:
包括游戏选项(开始和关闭游戏、退出游戏)、难度级别(调速)
⑧.下一个形状预览框。
形状是由游戏随机产生的。
2系统详细设计
2.1主流程
1游戏流程:
1)、登录界面:
用户执行程序,输入游戏进入密码,如果正确,则进入游戏;如果5次密码错误,退出登录,或者按“q”退出;
2)、欢迎界面:
界面打印“WELCOME”及动态笑脸图
3)、游戏难度选择界面:
欢迎界面结束后显示游戏难度选择选项,根据不同的难度进行不一样的游戏体验,并提示游戏按键操作
4)、游戏界面:
用户进入游戏,根据按键来控制游戏,具体包括左右移动、旋转、直降、暂停、重新开始和退出,并根据用户玩的情况打印出分数和等级。
5)、退出游戏:
显示“--------gameover!
----------”以及结束图片、
2、功能模块
玩家定义游戏开始,游戏显示开始界面,通过对信号的处理,设置时钟,然后随机出示方块,玩家进行方块的旋转。
对方块左右移动,和下落控制,然后在旁边的表格中出示另一个表格显示下一个即将下落的方块,然后判断是否到达底部,若到,继续出示方块,若没,则可继续变换,下落到低端后在进行判断,是否可以消除该行,再进行分数的变换,速度的调整,然后判断是否已经满,若未满,则继续出示下一个方块,若满,则结束游戏,打印分数,出示结束界面,游戏终止。
3、打印模块:
打印界面、打印分数、打印等级、打印游戏区方块、打印预览区方块、消除方块(打印空格)
4、控制模块:
左移、右移、下落、加速下落、旋转变形、消行、暂停、重新开始、停止游戏、设置定时器、信号处理、设置终端属性、游戏结束
整体流程图:
2.2非功能模块介绍
增加对分数和等级的存储
->增加登录界面
->增加欢迎界面
->一次消除多行并根据一次消除的行数不同
而设定不同的等级
->美化界面
->增加用户名和密码
3模块详细设计
3.1游戏模块
3.1.1功能概述
俄罗斯方块的基本功能:
变换形状、移动、下落、消行、分数等级、暂停、重新开始等;
添加功能:
重新开始、登陆界面、欢迎界面、难度选择;
3.1.2界面概述
主界面最简形式征集效果如下:
1、用户登录界面:
2、欢迎界面及难度选择界面:
3、游戏框架界面(包括主游戏区、预览区、分数、等级):
4、游戏结束界面:
3.1.3函数设计
#include
#include"print.h"
#include"control.h"
#include
intmain(void)
{
while
(1)
{
srand(time(NULL));
pnum=rand()%7;
pmode=rand()%4;
pcolor=rand()%8+40;
print_interface();/*打印界面*/
mode_choose();
while
(1)
{
intch=getch();
if(ch=='')
{
set_time(0);
while
(1)
{
intch=getch();
if(ch=='')
{
change_rate();
break;
}
if(ch=='q'||ch=='Q')
{
game_over()/*程序结束*/;
}
}
}
if(ch=='r'||ch=='R')
{
restart();
break;
}
if(ch=='q'||ch=='Q')
{
game_over()/*程序结束*/;
}
if(ch=='\r')
{/*快速下落*/
fall_down();
}
if(ch=='\33')
{
intch=getch();
if(ch=='[')
{
intch=getch();
switch(ch)
{
case'A':
change_shape();
break;
case'B':
move_down(num,mode,color);
break;
case'C':
move_right(num,mode,color);
break;
case'D':
move_left(num,mode,color);
break;
default:
break;
}
}
}
}
}
3.1.4关键逻辑与算法说明
逻辑:
开始游戏——〉选择难度——〉方块开始下落,游戏开始——〉游戏结束或者重新开始
算法:
pwd()//要求玩家输入密码,并判断玩家密码是否出错,只有正确才能进入游戏。
print_welcome()//打印欢迎界面
print_interface()//打印界面函数,在一定的范围内打印游戏界面,包括方块打印区,方块预览区以及等级分数区;
print_diamond()//打印方块函数,将方块的7种形状的每4种变换存储到数组shape中,设计一个随机数,在游戏开始时随机打印一个方块;
print_next()//打印预览区方块;
eraser_diamond()//消除方块函数,将已经打印的方块消去,即在方块原有的位置打印空格覆盖已有的方块;
set_time()//设定时间函数,设定方块的下落时间;
signal_handle()//信号处理函数;
make_shape()//打印方块函数,包括游戏区和预览区方块;
judge()//判断碰撞函数,将方块存放到数组matrixs中,通过判断方块是否超出边界或者来判断方块是否落定;
move_down()//下移函数,通过judge函数来判断有没有到底和下方是否有方块,有则落定,没有则下移一个位置,移除上一个位置的方块,打印新位置的方块;
move_right()/move_left()//左右移动函数,通过judge函数判断是否有碰撞,来判断是否可以左右移动;
store_shape()//存储方块函数,通过遍历shape数组的16个方格来确定方块的形状,然后将方块的颜色存储到matrixs数组中;
change_shape()//改变形状函数,通过判断是否碰撞,如不碰撞将mode+1,改变方块的形状;
fall_down()//快速下落函数,通过一个死循环来实现快速下落;
destroy_line()//消行函数,设置一个循环,定义一个标志flag默认为1是可以消行的,从最后一行开始遍历,如果有一行是不满的则flag=0,反之flag=1,然后将满格的一行消除,即将满行都打印成空格,然后上面的所有都下移消除的行数;
restart()//重新开始游戏,如果从键盘输入“r”后者“R”,则重新开始游戏;
is_game_over()//判断游戏结束游戏,判断matrixs数组最上面一行是否有存储,有则结束游戏;
game_over()//游戏结束调用此函数,显示结束界面。
3.1.5调用外部接口说明
在print.c中定义的函数:
print_interface()
print_diamond()
eraser_diamond()
在control.c中定义的函数:
set_time()
signal_handle()
make_shape()
judge()
move_down(
move_right()/move_left()
store_shape()
change_mode()
fall_down()
destroy_line()
is_game_over()
restart()
3.1.6提供调用接口说明
#include"print.h"
在print.h中声明了有关打印的一些函数包括打印界面、方块、消除等;
#include"control.h"
control.h中声明了有关游戏控制的函数包括产生方块、控制下落、左右移动、消行、分数等级等。
3.1.7模块内部使用的公共函数、包的说明
头文件:
#include
#include
#include
函数:
printf()函数
etitime()设置定时器函数
srand()函数
if函数
while()死循环函数
3.1.8流程逻辑
流程图如下:
3.1.9尚未解决的问题
1、用户注册
2、双人对抗
3.2预览模块
3.2.1功能概述
在预览区中打印下一个在游戏区中打印的方块
3.2.2界面概述
查看下一个方块以及当前的游戏分数和等级
3.2.3函数设计
voidprint_next()
{
/*设置随机数种子*/
intx=p_x+len_x1+6;
inty=p_y+2;
eraser_diamond(pnum,pmode,x,y);
srand(time(NULL));
pnum=rand()%7;
pmode=rand()%4;
pcolor=rand()%8+40;
print_diamond(pnum,pmode,pcolor,x,y);
}
3.2.4关键逻辑与算法说明
逻辑:
设置随机种子确定方块——〉消除上一个方块——〉打印下一个方块
算法:
print_diamond()//打印方块函数;
eraser_diamond()//消除方块函数,将已经打印的方块消去,即在方块原有的位置打印空格覆盖已有的方块;
3.2.5调用外部接口说明
eraser_diamond()消除方块函数,在打印新的方块之前要删除旧的方块;
print_diamond()在消除方块后就打印新的方块;
3.2.6提供调用接口说明
#include"print.h"
在print.h中声明了有关打印的方块的函数;
3.2.7模块内部使用的公用函数/包等的说明
头文件:
函数:
srand()函数
3.3等级积分表模块
3.3.1功能概述
打印等级分数,通过等级分数的改变改变方块的下落速度
3.3.2界面概述
图:
积分板效果图
3.3.3关键逻辑与算法说明
逻辑:
消除行——〉分数增加,判断等级是否增加——〉改变下落速率
算法:
print_score()//分数打印函数,在消行之后根据消行的行数确定分数,并累积打印出来;
print_level()//等级打印函数,根据分数确定分数并打印
3.3.4调用外部接口说明
printf()函数,打印分数等级时调用;
set_time()函数,改变下落速率;
3.3.5提供调用接口说明
#include”control.h”
set_time()在改变下落速率的时候调用;
#include”print.h”
print_score()在消行后调用;
print_level()在分数满足条件时调用;
3.3.6模块内部使用的公共函数、包的说明
#include
printf()在打印分数等级的时候需要调用
3.3.7流程逻辑
流程图:
3.3.8尚未解决的问题
显示历史最高分排行榜
4附录:
函数:
main.c
#include
#include"print.h"
#include"control.h"
#include
intmain(void)
{
while
(1)
{
srand(time(NULL));
pnum=rand()%7;
pmode=rand()%4;
pcolor=rand()%8+40;
print_interface();/*打印界面*/
mode_choose();
while
(1)
{
intch=getch();
if(ch=='')
{
set_time(0);
while
(1)
{
intch=getch();
if(ch=='')
{
change_rate();
break;
}
if(ch=='q'||ch=='Q')
{
game_over()/*程序结束*/;
}
}
}
if(ch=='r'||ch=='R')
{
restart();
break;
}
if(ch=='q'||ch=='Q')
{
game_over()/*程序结束*/;
}
if(ch=='\r')
{/*快速下落*/
fall_down();
}
if(ch=='\33')
{
intch=getch();
if(ch=='[')
{
intch=getch();
switch(ch)
{
case'A':
change_shape();
break;
case'B':
move_down(num,mode,color);
break;
case'C':
move_right(num,mode,color);
break;
case'D':
move_left(num,mode,color);
break;
default:
break;
}
}
}
}
}
return0;
}
Print.h
#ifndef__PRINT_H__
#define__PRINT_H__
#definep_x10
#definep_y1
#definelen_x46
#definelen_y25
#definelen_x130
#definelen_y17
//全局变量
intscore,level;
/*游戏区方块的类型、形态和颜色*/
intnum,mode,color;
/*预览区方块的类型、形状和颜色*/
intpnum,pmode,pcolor;
intshape[7][4][18];
voidprint_interface(void);/*打印界面*/
voidprint_score();/*打印分数*/
voidprint_level();/*打印等级*/
voidprint_diamond(intnum,intmode,intcolor,intx,inty);/*打印方块*/
voidprint_next();/*打印下一个方块*/
voideraser_diamond(intnum,intmode,intx,inty);/*消除方块*/
#endif
print.c
#include
#include
#include"print.h"
intshape[7][4][18]=
{
{
{1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,3},//[][][][][]
{1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0},//[]
{1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,3},//[]
{1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,3,0}//[]
},
{
{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,2,1},//[][][]
{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,2},//[][][][]
{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,2,1},//[]
{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,2}//
},
{
{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,2,1},//[][][]
{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,2},//[][][][]
{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,2,1},//[]
{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,2}//
},
{
{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,2},//[][][][][][][]
{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,2,1},//[][][][][][]
{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,2},//[][][]
{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,2,1}//
},
{
{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0,1,2},//[][][][]
{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,1},//[][][][][][][][]
{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,2},//[][][][]
{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,2,1}
},
{
{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,2,2},//[][]
{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,2,2},//[][]
{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,2,2},//
{1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,2,2}
},
{
{0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,2,1},//[][][]
{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,2},//[][][][][][][][][][]
{1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,2,1},//[][][]
{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,2}
}
};
voidprint_score()
{
printf("\33[%d;%dH\33[35mscore:
%d\33[0m",p_y+len_y1+5,p_x+len_x1+5,score);
}
voidprint_level(void)
{
printf("\33[%d;%dH\33[35mlevel:
%d\33[0m",p_y+len_y1+12,p_x+len_x1+5,level);
}
voidprint_interface(void)
{
inti,j;
printf("\33[2J");
for(i=p_x;i { printf("\33[%d;%dH\33[42m\33[0m",p_y,i); printf("\33[%d;%dH\33[42m\33[0m",p_y+len_y,i); if(i>p_x+len_x1) printf("\33[%d;%dH\33[42m\33[0m",p_y+len_y1,i); } for(j=p_y;j<=p_y+len_y;j++) { printf("\33[%d;%dH\33[4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 报告