Download presentation
Presentation is loading. Please wait.
1
C语言实现俄罗斯方块 邓友明( ) 胡文峰( ) 李乐( ) 李博( )
2
具体内容 1俄罗斯方块简介. 2功能简介. 3所用知识 4模块分析. 5数据结构. 6算法设计.
3
一. 俄罗斯方块简介: 相信大家都应该玩过俄罗斯方块这个游戏。 具体介绍略。 大部分俄罗斯方块游戏都是用比较高级的语言实现的。
这里我们要用C语言实现之。
4
二.功能分析: 1具有基本的游戏背景/界面。 2能随机生成所有可能的方块。 3能根据难度确定方块下落速度。 4能用键盘控制方向,变形。
5方块判别停止条件及墙壁。 6能判别消行及游戏结束。 7电脑能自动玩,可以选择人机对抗玩.(难) 8能记录玩者姓名及最佳成绩。
5
三.所用知识: 基本的C语言知识。 数据结构。 图形交互技术。 算法分析和设计。 数据库知识. 人工智能
6
四.模块分析 根据七种功能可得到六个模块. 分别为:1.界面; 2.方块; 3.下落及控制; 4.碰壁停止; 5.消行及玩完;
6.电脑判别最优走法(难) 7.记录.(难) 具体见下:
7
模块1.界面设计 基本符合一般的俄罗斯方块游戏;
我们设计时考虑倒我们屏幕的大小,采用16X24的方格阵.背景用蓝色,墙用红色, 墙内用白色. 这部分已设计好,看演示!
8
模块2.定义所有方块 所有俄罗斯方块都是有四个方格,所有可能情况有二十种(由于方块所占比率太小,有两!颜色随机!)
具体如下:
10
上述二十种方块中,0号1号可循环变形;2,3 号相同;4,5,6,7可循环变形;8,9,10,11可循 环变形;12,13,14,15可循环变形;16,17,18,19 可循环变形. 具体实现见数据结构部分. 此模块已实现,看演示!
11
模块3.下落及控制 下落比较简单. 控制也容易. 控制包括控制方向和变形. 变形可由方块定义的号码循环变换. 已部分实现,演示!
即图形的插,写及步长的大小来实现. 插写速度及步长大小可控制难度. 已实现,有演示! 控制也容易. 控制包括控制方向和变形. 变形可由方块定义的号码循环变换. 已部分实现,演示!
12
但两个嵌套起来就出现了问题(请大家指教):
即控制的时候不要影响下落,但控制时如用到getch()函数,要等待输入字符,因此下落因等待停止!查到一个kbhit()函数虽能在输入字符时不影响下落,但不能返回所输字符!最后用kbhit()判断是否有控制输入,用getch()判断控制操作虽能实现,但反应滞后!!??不完美! 演示之.
13
模块4.墙和已有方块阻挡的实现 我们讨论得到的一个方案为:
定义界面的时候,墙设为红色(好看起见),空白格为白色.方块为除黑白的其他随机颜色. 定义一个数组m保存界面当前每个方格的坐标及颜色值. 方块下落过程中遇到非白色的就停止.自定义一个stopmove( m,…)判断是否停止. 控制遇到非白色阻挡就失效. 停止的方块替换掉所在位置以前界面数组m的对应颜色.用自定义的getbk()函数返回新的数组m. 这一部分我们正在努力之中!!!
14
模块5.消行操作及失败判断 消行操作是难点. 首先是判断哪几行已满,然后要将该行以上所有内容整体下移所消的行数.具体算法我们还在研究之中.
失败与否就是判断是否有方块超过界面上界.不难!
15
模块6.能实现电脑玩 这一部分比较难,我们正在查找相应的书,学习相应的知识.
16
模块7.玩者姓名及成绩排行榜 分数由所消行数及难度确定. 设计时定义好.
在指定时间之内,或失败后都有一个最终分数.可以选择记录之.这将会被录入对应文件.用到C语言的文件操作. 能够调出排行榜,及最高纪录.用到数据库方面知识,及排序. 这一部分不容易,我们还在思考之中!
17
五.数据结构 通过以上模块分析,我们已经设计出如下数据结构: 1.点坐标结构: typedef struct{ int x; int y;
}Pos; 2.点及颜色数据结构: Typedef struct{ Pos pos; //点坐标 int color; //颜色值 }PosType1; //用于保存界面及其他
18
3.头节点及方块号码数据结构: 4.方块定义: typedef struct{
Pos node0; /*int x1;int y1;*/ //方块头节点左上点 int num; //方块号码不同,对应形状不同 }PosType; 4.方块定义: Pos node[4]; //0号为头节点,其他三个与之对应 int color; //方块颜色 }Square;
19
以上数据结构不算完美,有待改进. 用上述结构,实际使用如下全局变量: PoseType start; // start.num号对应方块及头节点起始位置 Square squa; // 一种方块. ………….还有其他 自定义一个Square initsqua( PoseType start)的函数可将start.num号方块返回在start.Pos位置.方块具体设计见下一页:
20
1 3 2 以下为initsqua()函数内部12号方块 的定义: squa.node[0].x=start.node0.x;
2 以下为initsqua()函数内部12号方块 的定义: squa.node[0].x=start.node0.x; squa.node[0].y=start.node0.y; //0号节点 switch(start.num) //start.num为12 ………. case 12: squa.node[1].x=squa.node[0].x; squa.node[1].y=squa.node[0].y-STEP*1; //1号 squa.node[2].x=squa.node[0].x+STEP*1; squa.node[2].y=squa.node[0].y; //2号 squa.node[3].x=squa.node[0].x-STEP*1; squa.node[3].y=squa.node[0].y; //3号 break; //以上的 STEP 为每正方块边长,定义为20象素. ……..
21
通过使start.pos坐标的变换,调用函数initsqua(start)便可实现控制方块的功能.
控制功能函数在PoseType movestart(PoseType start)内编写. 由方块的左上点坐标及STEP可画出方块: bar(squa.node[0].x, squa.node[0].y, squa.node[0].x+STEP, squa.node[0].y+STEP); //bar为图形库中画方块函数,四个参数为左上角坐标x,y, //右下角坐标x,y.
22
六.算法设计 考虑中…………
Similar presentations