俄罗斯方块C语言实现_第1页
俄罗斯方块C语言实现_第2页
俄罗斯方块C语言实现_第3页
俄罗斯方块C语言实现_第4页
俄罗斯方块C语言实现_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、安阳师范学院本科学生毕业论文俄罗斯方块的C语言实现姓 名 马成强 系(院) 计算机与信息工程学院专业 网络 年级 08级 学号 080902072指导教师 王希杰 日期 2012年5月 目录1. 摘要.22. 前言.33. 需求分析.34. 游戏总体设计.45. 功能设计分析.45.1游戏方块预览 .45.2游戏方块控制.45.3游戏显示更新.45.4游戏速度分数更新.46.流程图.57.具体设计.6 7.1定义变量.6 7.2定义声明函数.6 7.3过程判断.68.系统测试.7 8.1游戏界面显示测试.7 8.2按键功能测试.7 8.3方块的消行和行满游戏结束功能的测试.7 8.4测试结果及

2、界面显示.79.参考文献.810.总结致谢.811源代码.91.摘要:俄罗斯方块是一款风靡全球的掌上游戏机和PC机游戏,它造成的轰动与创造的经济价值可以说是游戏史上的一件大事。它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。它看似简单却变化无穷,俄罗斯方块上手极其简单,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。相信大多数人都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。由于俄罗斯方块具有的数学

3、性、动态性与知名度,也经常拿来作为游戏程序设计的练习题材。关键词:俄罗斯方块开发 游戏编程 程序开发AbstractsTetris is a fashionable global handheld game and PC games,it caused stir and create the economic value of gaming history is a great event.It is invented by the Russian Alexey Pazhitnov.The basic rule of tetris is moving,rotation and put the

4、Game output squares,It arranged in a complete row or a complete multi row,Chac and score.It seems simple but Full of change.As household the mass games all ages,Its popularity is any games that cannot be compared.Tetris often used for game programming practice subject.Key words: Tetris development ,

5、Game programming ,program development2.前言:俄罗斯方块(Tetris)原本是前苏联科学家阿列克谢·帕吉特洛夫在1984年6月利用空闲时间所编写的游戏程序,据说游戏的作者最喜欢网球(Tennis)运动,于是,它把来源于希腊语的tetra(意为“四”)与其结合,造了“tetris”一词,之后开始提供授权给各个游戏公司,造成各平台上俄罗斯游戏软件大量发行的现象。 俄罗斯方块由于上手简单、老少皆宜,从而成为了家喻户晓款风靡全球的一款电视游戏机和掌上游戏机游戏。 C语言则是目前国际上比较流行的计算机高级编程语言之一,因其简洁、使用方便且具备强大的功能而受

6、到编程人员的普遍青睐。它既适合作为系统描述语言,也可以用来编写系统软件,还可以来编写应用软件。 用C语言来编写俄罗斯方块这个游戏有较大优势:C语言具有各种各样的数据类型,并引入了指针概念,使得程序效率更高;C语言还包含很广泛的运算符;另外C语言具有强大的图形功能,支持多种显示器和驱动器,而且计算功能、逻辑判断能力也比较强大。选择此论文题是旨在训练基本编程能力和游戏开发技巧,熟悉C语言图形模式下的编程。本程序中涉及结构体、数组、时钟中断及绘图等方面的知识。通过本程序的训练,能对C语言有一个更深刻的了解,掌握俄罗斯方块游戏开发的基本原理,为将来开发出高质量的游戏软件打下坚实的基础3.需求分析:俄罗

7、斯方块游戏由19种不同状态的方块随机产生,进入界面时方块开始自由下移,下落的时候玩家左侧的窗口填满,则游戏结束。游戏界面需求:界面要求良好,这样可以给玩家带来良好的视觉享受。游戏的背景,背景色为黑色,方块为白色,这样便于方块的移动和消行,键盘上按键w来控制方块的变形即旋转,以便玩家可以得到合适的形状和位置落下。游戏形状需求:用数组作为存储方块19 种状态的数据结构,即长条形、Z 字形、反Z 形、田字形、7 字形、反7 形、T 字型,各个方块要能实现它的变形,可设为顺时针或逆时针变形。键盘处理需求:方块下落时,可通过键盘方向键(w、a、s、d)对该方块进行向上(变形),向下(加速)、向左、向右移

8、动。显示需求:当方块落下后能完全填满一行,则这一行消去,并且给玩家加分,同时下一个方块被打印出来.分数达到一定时,关数增加,速度加快,直到游戏结束。游戏编写使用语言需求:C语言其自身有许多优点:有利于用c编写俄罗斯方块游戏。(1)C语言简洁、紧凑、使用方便、灵活。程序书写形式自由。(2)运算符丰富,c语言共有34中运算符,括号、赋值、强制类型转换、从而使c语言的运算符极其丰富,表达式类型多样化,灵活使用各种运算符可以实现在其他语言中难以实现的运算。(3)数据结构丰富,具有现代语言的各种数据结构。(4)C语言具有结构化的控制语句,如ifelse语句,while语句,dowhile语句,switc

9、h语句,for语句,用函数作为程序的模块单位,便于实现程序的模块化。(5)语法限制不太严格,程序设计自由度大。(6)C语言具有高级语言的功能又具有低级语言的功能,编写系统安全性好。4.游戏总体设计:当用户进入游戏界面时,会随机生成一个方块,自动下落,用户可以按下“p”暂停游戏,也可以按“w”对方块进行变形,得到适合的方块,按“a”、“s”、“d”分别将方块左移、下移、右移;当方块遇到障碍物时就停止,或者方块的下落使某行满行,下一个方块就会被打印出来;在界面右侧会生成下一个方块,显示游戏的得分score,游戏的关数level;如果窗口中的某行被填充满了,就将此行消除,得分是消去行数的倍数,当玩家

10、达到一定分数时,进入下一关,方块的下降速度speed会随着level的增加而变快,当窗口中无法容纳下落的方块时,则游戏结束.5.功能设计分析:5.1游戏方块预览游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。5.2游戏方块控制游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。5.3游戏显示更新游戏显示更新功能。当游戏方块左右移动、下落、旋转时

11、,要清除先前的游戏方块,用新坐标重绘游戏方块。当消除满行时,要重绘游戏底板的当前状态。5.4游戏速度分数更新游戏速度分数更新功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给游戏玩家计算游戏分数。比如,消除一行加1分。当游戏分数达到一定数量之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。6.流程图:开始初始化背景定义并开始时间Y显示并打印背景对左右下变形暂停等进行处理N自由下落是否有键入?是否结束?NY是否到底?NY产生并打印下一个方块是否消行?NYAllscore += scoreCase 0;Speed=25Level=0Case 1;S

12、peed=20Level=1Case 9;Speed=0Level=9结束printf("n")return 0;printf("%d", level);7.具体设计:7.1定义变量int box_x, box_y; /存储方块的位置int form, change, nextform, nextchange;/定义方块的形状,下一个形状和变形clock_t starttime;/定义开始时间int BGCHANGKUAN = 0;/定义背景并初始化int Is_Gethit = 0;/接受按键为1, 否则为0int Sfhf;/判断是否非法int Is

13、_GameOver;/判断游戏是否结束int score = 0, Allscore = 0;/你的得分int speed ;/速度int level ;/关数int kbhit(void); /检查当前是否有键盘输入HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);/设置控制台定义一个数组Tetris,通过Tetris方块数组输出方块的所有的俄罗斯方块图形,共有19种不同的俄罗斯方块图形7.2定义声明函数1gotoxy(),/用gotoxy(int x, int y)设置光标位置(为了控制方块出现的位置,以及定位其他输出显示的位置)2Beij

14、ing(),/用Beijing()函数初始化背景3Print_Beijing(),/用Print_Beijing()重新打印背景4Print_Box(),/打印方块5Rong_Beijing(),/用Rong_Beijing()函数将方块融入背景6NextTetris(),/用NextTetris()函数设置下一个方块并打印出来7Disappear(),/用Disappear()函数实现对方块的消行8Chac_Box()/擦出方块函数,当方块下落到下一时刻时,上一时刻的方块必须进行擦出,调用该函数显示下一方块 9Getkbhit(),/用Getkbhit()函数对上下左右键进行处理,如果键入“

15、p”则暂停,如果键入w、a、s、d则分别将方块变形,左移,下移,右移;没有键入则自动下移。10Score(),/用Score()函数对游戏进行计分和难度设置。11Pause(),/用Pause()函数来实现暂停游戏 7.3过程判断 进入界面时,判断是否有键入,用 kbhit()检测,如果有键入,则执行相应的操作,w 变形,a左移,s下移,d右移,p暂停游戏,如果没有键入,自由下落。void Getkbhit()/对上下左右按键的处理if(kbhit()/如果有按键刚进入按键处理switch(getch()case'p':Pause();break;case 'w'

16、;:if(change + 1) > 3)if(Sfhf(box_x, box_y, form, 0)Chac_Box(box_x, box_y, form, change);change = 0;Print_Box(box_x, box_y, form, change);elseif(Sfhf(box_x, box_y, form, change + 1)Chac_Box(box_x, box_y, form, change);Print_Box(box_x, box_y, form, +change);break;case 's':if(Sfhf(box_x, box

17、_y + 1, form, change)Chac_Box(box_x, box_y, form, change);Print_Box(box_x, +box_y, form, change);break;case 'a':if(Sfhf(box_x - 1, box_y, form, change)Chac_Box(box_x, box_y, form, change);Print_Box(-box_x, box_y, form, change);break;case 'd':if(Sfhf(box_x + 1, box_y, form, change)Cha

18、c_Box(box_x, box_y, form, change);Print_Box(+box_x, box_y, form, change);break;default :break;if(clock() - starttime) >= 1000 && Sfhf(box_x, box_y + 1, form, change)/自动下落Chac_Box(box_x, box_y, form, change);Print_Box(box_x, +box_y, form, change);starttime = clock();判断方块是否到达底部,如到达,则重新打印下一个

19、方块。void NextTetris()/设置下一个方块并打印出来gotoxy(KUAN*2+5, CHANG-21);printf("next tetris:");Chac_Box(KUAN+5, CHANG-20, nextform, nextchange); nextform = rand()%7;nextchange = rand()%4;Print_Box(KUAN+5, CHANG-20, nextform, nextchange);方块到达底部时,进行行满判断,如行满,用Disappear()进行消行。在游戏过程中,方块的下落速度speed会随着level的增

20、加变快。用 Is_GameOver()判断游戏是否结束,当游戏窗口不允许有方块下落时,游戏结束int Is_GameOver()/判断游戏结束了没int j;for(j = 1; j < KUAN-1; +j)if(BG2j = 1)return 0;/返回0代表 死掉了return 1;/返回1代表还活着8.系统测试:8.1游戏界面显示测试 进入游戏界面时,窗口左侧显示一个25行14列的游戏窗口,右侧显示next tetris :,score:,level:8.2按键功能测试在方块下落的过程中,按下w方块就变形;按下a方块左移,碰到边界自动下移,遇到障碍物停止;按下d方块右移,碰到边界

21、自动下移,遇到障碍物就停止;按下p方块停止不动;按下d方块自由下落,遇到障碍物停止。8.3方块的消行和游戏结束功能的测试 在游戏过程中有一行行满时,这行自动消去,下一个方块被打印出来,同时score开始加相应的分数。8.4测试结果及界面显示结果:经测试以上测试都能够实现,游戏界面:9.参考文献:1,C语言程序设计(第三版)+上机指导 谭浩强 清华大学出版社2,C语言程序设计方法 邓文新 主编 清华大学出版社3,C语言课程设计案例精编 姜灵芝、余健 编著 清华大学出版社4,数据结构(C语言版) 严蔚敏 吴伟民 编著 清华大学出版社5,C语言程序设计教程 冉崇善 主编 机械工业出版社6,Visua

22、lC+游戏设计 荣软科技 编著 北京科海电子出版社7, C primer plus 第五版 stephen prata 著人民邮政出版社8,Charles Petzold.Windows 程序设计M. 北京大学出版社.2004( 9) .9,求是科技.Visual C+6.0 程序设计与开发技术大全M.北京:人民邮电出版社,2006.10,数据结构用C语言描述蔡明志 编著 中国水利水电出版社10.总结和致谢:本次论文写作俄罗斯方块主要运用到了C语言的相关知识,课设题目要求不仅要求对课本知识有较深刻的了解,同时要求程序设计者有较强的思维和动手能力。这次论文设计使我了解我编程思想和编程技巧,也让我

23、认识到了游戏开发中程序编写的重要性,修补了以前学习的漏洞。本论文顺利完成,首先我要感谢我的导师王希杰给我的指导和帮助。无论是在论文选题、写作阶段还是在程序设计的实践过程中,王老师都加以悉心的指导,给予意见和修正。其次,要感谢在程序设计过程中给予我帮助的同学。本论文的写作参考、引用了很多书籍及文献,在此向这些文章的作者表示深深的谢意!11.源代码:#include <stdio.h>#include <windows.h>#include <stdlib.h>#include <conio.h>#include <time.h>#def

24、ine KUAN 14 /方框的横轴大小#define CHANG 25 /方框的竖轴大小int Tetris7444 = 0,0,0,0,0,1,1,0,0,1,1,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,1,1,0,0,1,1,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,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1

25、,0,0,0,1,1,0,0,1,0,/T形0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,/长条0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,/z0,0,0,0,0,1,1,0,1

26、,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,1,0,/反Z0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,1,1,0,1,0,0,0,0,0,0,0,/J0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0,1,0,0,0,1,1,1,

27、0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,/L;/方块数组 int box_x, box_y;/存储方块的位置,左上角int form, change, nextform, nextchange;/定义方块的开关与变型clock_t starttime;/定义开始时间int BGCHANGKUAN = 0;/定义背景并初始化int Is_Gethit = 0;/接受按键为1, 否则为0; int speed;int level;int kbhit(void); /检查当前是否有键盘输入int

28、score = 0, Allscore = 0;/你的得分HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);/设置控制台void gotoxy(int x, int y)/设置光标位置COORD coord;coord.X = x;coord.Y = y;SetConsoleCursorPosition(hConsole, coord);void Chac_Box(int box_x, int box_y, int form, int change)/擦除方块int i, j;for(j = 0; j < 4; +j)for(i = 0;

29、 i < 4; +i)if(Tetrisformchangeji = 1)gotoxy(2*box_x + 2*j, box_y + i);printf(" ");void Pause()/暂停 char c;doc=getch(); while(c!='p');void Print_Box(int box_x, int box_y, int form, int change)/打印方块int i, j;for(j = 0; j < 4; +j)for(i = 0; i < 4; +i)if(Tetrisformchangeji = 1)g

30、otoxy(2*box_x + 2*j, box_y + i);printf("");void Rong_Beijing(int box_x, int box_y, int form, int change)/将方块融入背景int j, i;for(j = 0; j < 4; +j)for(i = 0; i < 4; +i)if(Tetrisformchangeji = 1)BGbox_y + ibox_x + j = 1;void Print_Beijing()/显示背景int j, i;for(j = 0; j < CHANG; +j)for(i =

31、0; i < KUAN; +i)if(BGji = 1)gotoxy(2*i, j);printf("");int Sfhf(int box_x, int box_y, int form, int change)/判断是否非法int j, i;for(j = 0; j < 4; +j)for(i = 0; i < 4; +i)if(BGbox_y + ibox_x + j = 1) && (Tetrisformchangeji = 1)return 0;/返回0代表非法了return 1;/返回1代表不非法int Is_GameOver()

32、/判断游戏结束了没int j;for(j = 1; j < KUAN-1; +j)if(BG2j = 1)return 0;/返回0代表 死掉了return 1;/返回1代表还活着void NextTetris()/设置下一个方块并打印出来gotoxy(KUAN*2+5, CHANG-21);printf("next tetris:");Chac_Box(KUAN+5, CHANG-20, nextform, nextchange); nextform = rand()%7;nextchange = rand()%4;Print_Box(KUAN+5, CHANG-2

33、0, nextform, nextchange);void Disappear()/消行int jj, ii, j, i, CanPrint, num = 0;score = 0;for(j = (CHANG - 2); j > 0; -j)CanPrint = 1;X:for(i = 1; i < (KUAN - 1); +i)if(BGji != 1)CanPrint = 0;if(CanPrint = 1)for(jj = j; jj > 1; -jj)/调整背景数组for(ii = 1; ii < (KUAN - 1); +ii)BGjjii = BGjj-1i

34、i;+num;goto X;if(num)system("cls");Print_Beijing();/重新打印背景score = num*num;void Score()/分数系统Allscore += score;gotoxy(KUAN*2+5, CHANG-15);printf("score:");gotoxy(KUAN*2+5, CHANG-13);printf("%d", Allscore);switch(Allscore/100) case 0:speed=25;break; case 1:speed=20;break;

35、case 2:speed=17;break; case 3:speed=15;break; case 4:speed=12;break; case 5:speed=10;break; case 6:speed=7;break; case 7:speed=5;break; case 8:speed=2;break; case 9:speed=0;break; gotoxy(KUAN*2+5, CHANG-11);printf("level:");if(speed=25)level=0;if(speed=20)level=1;if(speed=17)level=2;if(spe

36、ed=15)level=3;if(speed=12)level=4;if(speed=10)level=5;if(speed=7)level=6;if(speed=5)level=7;if(speed=2)level=8;if(speed=0)level=9;gotoxy(KUAN*2+5, CHANG-9);printf("%d", level);void Beijing()/初始化背景 int i, j;for(i = 0; i < KUAN; +i)/初始化横的BG0i = 1;BGCHANG-1i = 1;for(j = 1; j < (CHANG-1)

37、; +j)/初始化竖的BGj0 = 1;BGjKUAN-1 = 1;srand(unsigned)time(NULL);box_x = KUAN/2-1;box_y = 1;Print_Beijing();Score();form = rand()%7;change = rand()%4;NextTetris();void Getkbhit()/对上下左右按键的处理if(kbhit()/如果有按键刚进入按键处理switch(getch()case'p':Pause();break;case 'w':if(change + 1) > 3)if(Sfhf(box_x, box_y, form, 0)C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论