对在c语言中经典c语言俄罗斯方块块游戏中怎么改变下落方块颜色

&C语言俄罗斯方块游戏源代码素材
秒后自动跳转到登录页
快捷登录:
举报类型:
不规范:上传重复资源
不规范:标题与实际内容不符
不规范:资源无法下载或使用
其他不规范行为
违规:资源涉及侵权
违规:含有危害国家安全等内容
违规:含有反动/色情等内容
违规:广告内容
详细原因:
任何违反下载中心规定的资源,欢迎Down友监督举报,第一举报人可获5-10下载豆奖励。
视频课程推荐
C语言俄罗斯方块游戏源代码素材
上传时间:
技术分类:
资源评价:
(2位用户参与评价)
已被下载&40&次
C语言俄罗斯方块游戏源代码素材
本资料共包含以下附件:
C语言俄罗斯方块游戏源代码素材.txt
(2位用户参与评价)
down友评价
51CTO下载中心常见问题:
1.如何获得下载豆?
1)上传资料
2)评论资料
3)每天在首页签到领取
4)购买VIP会员服务,无需下载豆下载资源
5)更多途径:点击此处
2.如何删除自己的资料?
下载资料意味着您已同意遵守以下协议:
1.资料的所有权益归上传用户所有
2.未经权益所有人同意,不得将资料中的内容挪作商业或盈利用途
3.51CTO下载中心仅提供资料交流平台,并不对任何资料负责
4.本站资料中如有侵权或不适当内容,请邮件与我们联系()
5.本站不保证资源的准确性、安全性和完整性, 同时也不承担用户因使用这些资料对自己和他人造成任何形式的伤害或损失
相关专题推荐
本专题收录Java经典编程的实例源码,
在国内的开发语言中,java凭借这简单
本套视频教程是韩顺平老师,循序渐进
北京圣思园张龙(风中叶)老师的Java
讲述Arm嵌入式Linux系统下的C语言编程
这段视频是从尚学堂科技的教学课堂上
本套视频共78集,是由郝斌老师根据多
本视频专题共180集涵盖了C语言概述中
本视频专题共107集涵盖了Java概述、数
由传智播客毕向东老师讲解的Java基础
本专题为spring视频教程,共31集。教
本专题为C语言黑客编程系列视频教程,
本专题为韩顺平讲解的Java从入门到精
本专题为Java Web项目开发案例精粹视
SSH为struts+spring+hibernate的一个
本专题为疯狂Java李刚老师讲解的Stru
意见或建议:
联系方式:
您已提交成功!感谢您的宝贵意见,我们会尽快处理[c语言编程]俄罗斯方块游戏(上)
Tc2.0 编写俄罗斯方块游戏&
很多编程爱好者都编写过俄罗斯方块的游戏程序。很久以前,我用Tc2.0也做过一个;最近有好些朋友看见我以前的俄罗斯方块的程序后,&
问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。正好现在放假了,而且离回家还有几天。于是我就把这个程序重新写了一遍,尽量使程序的结构比较清晰好懂一些。同时写了下面的这份东西。&
  俄罗斯方块游戏的程序中用到了一些方法。为了比较容易理解这些方法,我在讲述的同时写了些专门针对这些方法的示例程序。这些示例程序力求短小,目的是用最小的代码能够清楚的示例所用的方法。这些示例程序都经过tc2.0测试。最后还附了完整的俄罗斯方块游戏的源代码,和最终的可执行程序。如果你看了这份东东,有什么意见和想法,请发电子邮件告诉我。我将会继续更新这分东东,最新的版本可以在我的个人主页上下载。&
  下面的问题是有关俄罗斯方块程序的,其中有些是朋友问我的,有些是我认为可能会被问到的。我尽量按问题从易到难排列这些问题。
关于俄罗斯方块程序的一些问题:&
******************************************************&
Tc2.0中怎么样设置图形显示?&
Tc2.0中常用图形函数的用法?&
怎样获取键盘输入?&
怎样控制方块的移动?&
怎样控制时间间隔(用于游戏中控制形状的下落)?&
游戏中的各种形状及整个游戏空间怎么用数据表示?&
游戏中怎么判断左右及向下移动的可能性?&
游戏中怎么判断某一形状旋转的可能性?&
按向下方向键时加速某一形状下落速度的处理?&
怎么判断某一形状已经到底?&
怎么判断某一已经被填满?&
怎么消去已经被填满的一行?&
怎么消去某一形状落到底后能够消去的所有的行?(如长条最多可以消去四行)&
怎样修改游戏板的状态?&
怎样统计分数?&
怎样处理升级后的加速问题?&
怎样判断游戏结束?&
关于计分板设计的问题。&
关于“下一个”形状取法的问题。&
剩下的问题。&
******************************************************&
新的问题:&
 我想有一个最高记录的显示,应该怎么做呀?&
 我想实现一个进度存储功能,应该怎么做呀?&
Tc2.0中怎么样设置图形显示?&
  Tc2.0中有两种显示模式,一种是我们所熟知的字符模式,另一种是图形模式。在字符模式下只能显式字符,如ASCII字符。一般是显示25&
行,每行80个字符。程序缺省的是字符模式。在字符模式下不能显式图形和进行绘图操作。要想进行图形显示和绘图操作,必须切换到图形模&
  Tc2.0中用initgraph()函数可以切换到图形模式,用closegraph()可以从图形模式切换回字符模式。initgraph()和closegraph()都是图形&
函数,使用图形函数必须包括头文件"graphics.h"。&
  void far initgraph(int far *graphdriver,int far
*graphmode,char far
*pathtodriver);graphdriver是上涨指向图形驱动序号变量的指针;graphmode是在graphdriver选定后,指向图形显示模式序号变量的指针。pathtodriver表示存放图形驱动文件的路径。&
  Tc2.0中有多种图形驱动,每种图形驱动下又有几种图形显示模式。在我的程序中图形驱动序号为VGA,图形显示模式序号为VGAHI。这是一种分辨率为640*480(从左到右坐标依次为0-639,从上到下坐标依次为0-479),能够显示16种颜色的图形模式。别的图形驱动序号和图形显示模式序号,可以从手册或联机帮助中找到。&
  pathtodriver指示存放图形驱动文件的路径。图形驱动序号不同,图形驱动文件也不同。序号为VGA图形驱动对应"egavga.bgi"这个图形驱动文件。"egavga.bgi"一般在Tc目录下。&
void far closegraph(void);&
  没有参数,从图形模式直接返回字符模式。&
initgraph()和closegraph()的常用用法如下:
&int gdriver = VGA, gmode=VGAHI,
initgraph(&gdriver, &gmode,
"e:\\tc2");&
errorcode = graphresult();&
if (errorcode != grOk) &
printf("Graphics error: %s\n",
grapherrormsg(errorcode));&
printf("Press any key to halt:");&
exit(1); &
closegraph();&
Tc2.0中常用图形函数的用法?&
在这里讲几个游戏中用到的绘图用的图形函数:&
setcolor();&
rectangle();&
settextjustify();&
outtextxy();&
setfillstyle();&
void far setcolor(int color);&
  设置画线、画框和在图形模式下显示文字的当前颜色。这个函数将影响line()、rectangle()和outtextxy()函数绘图的颜色。&
color可以取常的颜色常量:&
BLACK ? 0&
GREEN ? 2&
MAGENTA ? 5&
BROWN ? 6&
LIGHTGRAY ? 7&
DARKGRAY ? 8&
LIGHTBLUE ? 9&
LIGHTGREEN ?10&
LIGHTCYAN ?11&
LIGHTRED ?12&
LIGHTMAGENTA ?13&
YELLOW ?14&
WHITE ?15&
void far line(int x1,int y1,int x2,int
用当前颜色从(x1,y1)画一条到(x2,y2)的线段。&
void far rectangle(int left,int top,int right,int
用当前颜色画一个左上角为(left,top)、右下角为(right,bottom)的矩形框。&
void far settextjustify(int horz,int
设置图形模式下文字输出的对齐方式。主要影响outtextxy()函数。&
horiz和vert可取如下枚举常量:&
horiz ?LEFT_TEXT ? 0 ?Left-justify text&
?CENTER_TEXT ? 1 ?Center text&
?RIGHT_TEXT ? 2 ?Right-justify text&
vert ?BOTTOM_TEXT ? 0 ?Justify from bottom&
?CENTER_TEXT ? 1 ?Center text&
?TOP_TEXT ? 2 ?Justify from top&
void far outtextxy(int x,int y,char *
textsing);&
在(x,y)处用当前字体(缺省的字体是DEFAULT_FONT)显示字符串textsing,字符串的对齐方式由settextjustify()指定。&
void far setfillstyle(int pattern,int
设置图形的填充模式和填充颜色,主要影响bar()等函数。&
pattern一般取枚举常量值SOLID_FILL,color的取值与setcolor(int
color)中color的取值范围相同。&
  介绍完了前面两个问题,现在来写一个程序。这个程序演示前了面所介绍的几个图形函数。&
程序prog1.c&
怎样获取键盘输入?&
  在Tc2.0中有一个处理键盘输入的函数bioskey();&
int bioskey(int cmd);&
  当cmd为1时,bioskey()检测是否有键按下。没有键按下时返回0;有键按下时返回按键码(任何按键码都不为0),但此时并不将检测到的按&
键码从键盘缓冲队列中清除。&
  当cmd为0时,bioskey()返回键盘缓冲队列中的按键码,并将此按键码从键盘缓冲队列中清除。如果键盘缓冲队列为空,则一直等到有键按&
下,才将得到的按键码返回。&
  Escape键的按键码为0x11b,下面的小程序可以获取按键的按键码。&
key=bioskey(0); &
printf("0x%x\n",key);&
if (key==0x11b) &
常用按键的按键码如下:&
#define VK_LEFT 0x4b00&
#define VK_RIGHT 0x4d00&
#define VK_DOWN 0x5000&
#define VK_UP 0x4800&
#define VK_HOME 0x4700&
#define VK_END 0x4f00&
#define VK_SPACE 0x3920&
#define VK_ESC 0x011b&
#define VK_ENTER 0x1c0d&
  完整的程序请参见prog2.c、prog3.c。&
prog2.c获取按键的按键码,按Escape键退出程序。&
prog3.c根据不同的按键进行不同的操作,按Escape键退出程序.
怎样控制方块的移动?&
  方块移动的实现很简单,将方块原来的位置用背景色画一个同样大小的方块,将原来的方块涂去。然后在新的位置上重新绘制方块就可以&
了。这样就实现了方块的移动。完整的程序请参见prog4.c。这个用方向键控制一个黄色的小方块在屏幕上上、下、左、右移动。这个程序用到了前面几个问题讲的内容,如果你有点忘了,还要回头看看哦。:)&
怎样控制时间间隔(用于游戏中控制形状的下落)?&
  解决这个问题要用到时钟中断。时钟中断大约每秒钟发生18.2次。截获正常的时钟中断后,在处理完正常的时钟中断后,将一个计时变量&
加1。这样,每秒钟计时变量约增加18。需要控控制时间的时候,只需要看这个计时变量就行了。&
  截获时钟中断要用到函数getvect()和setvect()。&
两个函数的声明如下:&
?void interrupt (*getvect(int
interruptno))();&
?void setvect(int interruptno, void interrupt (*isr) (
  保留字interrupt指示函数是一个中断处理函数。在调用中断处理函数的时候,所有的寄存器将会被保存。中断处理函数的返回时的指令是iret,而不是一般函数用到的ret指令。&
getvect()根据中断号interruptno获取中断号为interruptno的中断处理函数的入口地址。&
setvect()将中断号为interruptno的中断处理函数的入口地址改为isr()函数的入口地址。即中断发生时,将调用isr()函数。&
  在程序开始的时候截获时钟中断,并设置新的中断处理。在程序结束的时候,一定要记着恢复时钟中断哦,不然系统的计时功能会出问题&
的。具体演示程序请参见prog5.c。由于中断处理大家可能用的不多,所以我把prog5.c这个程序完整地贴在下面,并加上详细的解释。&
This is an interrupt service routine. You can NOT compile
program with Test Stack Overflow turned on and get an
file which will operate correctly. */&
#define VK_ESC 0x11b&
#define TIMER 0x1c &
#ifdef __cplusplus&
#define __CPPARGS ...&
#define __CPPARGS&
int TimerCounter=0; &
void interrupt ( *oldhandler)(__CPPARGS);&
void interrupt newhandler(__CPPARGS)&
oldhandler();&
void SetTimer(void interrupt
(*IntProc)(__CPPARGS))&
oldhandler=getvect(TIMER);&
disable(); &
setvect(TIMER,IntProc);&
enable(); &
void KillTimer()&
disable();&
setvect(TIMER,oldhandler);&
enable();&
void main(void)&
int key,time=0;&
SetTimer(newhandler); &
if (bioskey(1))&
key=bioskey(0);&
if (key==VK_ESC) &
printf("User cancel!\n");&
if (TimerCounter&18) &
TimerCounter=0;&
printf("%d\n",time);&
if (time==10) &
printf("Program terminated normally!\n");&
KillTimer(); &
游戏中的各种形状及整个游戏空间怎么用数据表示?&
以后我提到的形状都是指下面七种形之一及它们旋转后的变形体。&
□□□□ □□□□ □□□□ □□□□&
□■□□ □■■□ □□□□ □□□□&
□■□□ □■□□ □■□□ □■■□&
□■■□ □■□□ ■■■□ ■■□□&
□□□□ □■□□ □□□□&
□□□□ □■□□ □□□□&
■■□□ □■□□ □■■□&
□■■□ □■□□ □■■□&
我定义了一个结构来表示形状。&
suct shape&
int xy[8];&
-3□□□□&
-2□□□□&
-1□□□□&
0□■□□&
  所有的各种形状都可以放在4x4的格子里。假定第二列,第四行的格子坐标为(0,0)(如上图中黑块所示),则每个形状的四个方块都可以用4&
个数对来表示。坐标x从左向右依次增加,y从上到下依次增加。表示的时候,组成该形状的四个方块从左到右,从上到下(不一定非要按这个顺&
序)。如上面七种形状的第一个用数对来表示就是(-2,0)、(-1,0)、(0,0)、(1,0)。结构shape中的xy就是用来表示这4个数对的。为了简化程序,用一维数组xy[8]来表示。xy[0]、xy[1]表示第一个数对,xy[2]、xy[3]表示第二个数对,依次类推。&
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。C语言编写的《俄罗斯方块》详解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C语言编写的《俄罗斯方块》详解
&&用C语言编写俄罗斯方块,很详细的解释,希望对你C语言的提高有帮助
你可能喜欢25283人阅读
&&& 曾经对IT感兴趣可能很大原因是因为游戏吧,那时候我真没想过自己能做俄罗斯方块这样的游戏,多亏了我们班一个大年三十都在写代码的童鞋。陈年之作,拿来晒晒,,,,,,
&&& 我记得当时我在网上下载了不少关于俄罗斯方块的代码,都运行不了,就是因为缺少头文件,或者头文件不可用,不支持,哎,那些年可苦了自己啊,所以,我今天的肯定是可以运行的,这个,我对五星红旗保证。
/**************************************************************************************************************
&**文件:Tetris.c
&**编写者:huangminqiang
&**编写日期:号
&**简要描述:俄罗斯方块游戏
&**修改者:
&**修改日期:号 第3次修改
&**注:后期功能有些不太完善,主要因为时间原因。VC6.0环境能正常的跑起来。
&**************************************************************************************************************/
#include &stdio.h&
#include &windows.h&
#include &conio.h&
#include &time.h&
//游戏窗口
#define&FrameX&4&&&//游戏窗口左上角的X轴坐标
#define&FrameY&4&&&//游戏窗口左上角的Y轴坐标
#define&Frame_height& 20&//游戏窗口的高度
#define&Frame_width&& 18&//游戏窗口的宽度
//定义全局变量
int i,j,temp,temp1,temp2;&//temp,temp1,temp2用于记住和转换方块变量的值
int a[80][80]={0};&&&//标记游戏屏幕的图案:2,1,0分别表示该位置为游戏边框、方块、无图案;初始化为无图案
int b[4];&&&&&//标记4个&口&方块:1表示有方块,0表示无方块
//声明俄罗斯方块的结构体
struct Tetris
&&&&&&//中心方块的x轴坐标
&&&&&&//中心方块的y轴坐标
&&&&&//标记方块类型的序号
&&&&&//下一个俄罗斯方块类型的序号
&&&&&//俄罗斯方块移动的速度
&&&&&//产生俄罗斯方块的个数
&&&&&//游戏的分数
&&&&&//游戏的等级
//函数原型声明
//光标移到指定位置
void gotoxy(HANDLE hOut, int x, int y);
//制作游戏窗口
void make_frame();
//随机产生方块类型的序号
void get_flag(struct Tetris *);
//制作俄罗斯方块
void make_tetris(struct Tetris *);
//打印俄罗斯方块
void print_tetris(HANDLE hOut,struct Tetris *);
//清除俄罗斯方块的痕迹
void clear_tetris(HANDLE hOut,struct Tetris *);
//判断是否能移动,返回值为1,能移动,否则,不动
int if_moveable(struct Tetris *);
//判断是否满行,并删除满行的俄罗斯方块
void del_full(HANDLE hOut,struct Tetris *);
//开始游戏
void start_game();
void main()
&//制作游戏窗口
&make_frame();&&&&&&
&//开始游戏
&start_game();
/******光标移到指定位置**************************************************************/
void gotoxy(HANDLE hOut, int x, int y)
&pos.X =&&//横坐标
&pos.Y =&&//纵坐标
&SetConsoleCursorPosition(hOut, pos);
/******制作游戏窗口******************************************************************/
void make_frame()
&HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);&&//定义显示器句柄变量
&gotoxy(hOut,FrameX+Frame_width-5,FrameY-2);&&&//打印游戏名称
&printf(&俄罗斯方块&);
&gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+7);&&//打印选择菜单
&printf(&**********下一个方块:&);
&gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+13);
&printf(&**********&);
&gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+17);
&printf(&↑键:变体&);
&gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+19);
&printf(&空格:暂停游戏&);
&gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+15);
&printf(&Esc :退出游戏&);
&gotoxy(hOut,FrameX,FrameY);&&&&&&&//打印框角并记住该处已有图案
&printf(&╔&);
&gotoxy(hOut,FrameX+2*Frame_width-2,FrameY);
&printf(&╗&);
&gotoxy(hOut,FrameX,FrameY+Frame_height);
&printf(&╚&);
&gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+Frame_height);
&printf(&╝&);
&a[FrameX][FrameY+Frame_height]=2;&&&&&
&a[FrameX+2*Frame_width-2][FrameY+Frame_height]=2;
&for(i=2;i&2*Frame_width-2;i+=2)
&&gotoxy(hOut,FrameX+i,FrameY);
&&printf(&═&);&&&&&&&&&//打印上横框
&for(i=2;i&2*Frame_width-2;i+=2)
&&gotoxy(hOut,FrameX+i,FrameY+Frame_height);
&&printf(&═&);&&&&&&&&&//打印下横框
&&a[FrameX+i][FrameY+Frame_height]=2;&&&&//记住下横框有图案
&for(i=1;i&Frame_i++)
&&gotoxy(hOut,FrameX,FrameY+i);&
&&printf(&║&);&&&&&&&&&//打印左竖框
&&a[FrameX][FrameY+i]=2;&&&&&&&//记住左竖框有图案
&for(i=1;i&Frame_i++)
&&gotoxy(hOut,FrameX+2*Frame_width-2,FrameY+i);&
&&printf(&║&);&&&&&&&&&//打印右竖框
&&a[FrameX+2*Frame_width-2][FrameY+i]=2;&&&//记住右竖框有图案
/******制作俄罗斯方块********************************************************************/
void make_tetris(struct Tetris *tetris)
&a[tetris-&x][tetris-&y]=b[0];&&&&//中心方块位置的图形状态:1-有,0-无
&switch(tetris-&flag)&&&&&&//共6大类,19种类型
&&case 1:&&&&&&&&&//田字方块
&&&&a[tetris-&x][tetris-&y-1]=b[1];
&&&&a[tetris-&x+2][tetris-&y-1]=b[2];
&&&&a[tetris-&x+2][tetris-&y]=b[3];
&&case 2:&&&&&&&&&//直线方块:----
&&&&a[tetris-&x-2][tetris-&y]=b[1];
&&&&a[tetris-&x+2][tetris-&y]=b[2];
&&&&a[tetris-&x+4][tetris-&y]=b[3];
&&case 3:&&&&&&&&&//直线方块: |
&&&&a[tetris-&x][tetris-&y-1]=b[1];
&&&&a[tetris-&x][tetris-&y-2]=b[2];
&&&&a[tetris-&x][tetris-&y+1]=b[3];
&&case 4:&&&&&&&&&//T字方块
&&&&a[tetris-&x-2][tetris-&y]=b[1];
&&&&a[tetris-&x+2][tetris-&y]=b[2];
&&&&a[tetris-&x][tetris-&y+1]=b[3];
&&case 5:&&&&&&&&&//T字顺时针转90度方块
&&&&a[tetris-&x][tetris-&y-1]=b[1];
&&&&a[tetris-&x][tetris-&y+1]=b[2];
&&&&a[tetris-&x-2][tetris-&y]=b[3];
&&case 6:&&&&&&&&&//T字顺时针转180度方块
&&&&a[tetris-&x][tetris-&y-1]=b[1];
&&&&a[tetris-&x-2][tetris-&y]=b[2];
&&&&a[tetris-&x+2][tetris-&y]=b[3];
&&case 7:&&&&&&&&&//T字顺时针转270度方块
&&&&a[tetris-&x][tetris-&y-1]=b[1];
&&&&a[tetris-&x][tetris-&y+1]=b[2];
&&&&a[tetris-&x+2][tetris-&y]=b[3];
&&case 8:&&&&&&&&&//Z字方块
&&&&a[tetris-&x][tetris-&y+1]=b[1];
&&&&a[tetris-&x-2][tetris-&y]=b[2];
&&&&a[tetris-&x+2][tetris-&y+1]=b[3];
&&case 9:&&&&&&&&&//Z字顺时针转90度方块
&&&&a[tetris-&x][tetris-&y-1]=b[1];
&&&&a[tetris-&x-2][tetris-&y]=b[2];
&&&&a[tetris-&x-2][tetris-&y+1]=b[3];
&&case 10:&&&&&&&&//Z字顺时针转180度方块
&&&&a[tetris-&x][tetris-&y-1]=b[1];
&&&&a[tetris-&x-2][tetris-&y-1]=b[2];
&&&&a[tetris-&x+2][tetris-&y]=b[3];
&&case 11:&&&&&&&&//Z字顺时针转270度方块
&&&&a[tetris-&x][tetris-&y+1]=b[1];
&&&&a[tetris-&x+2][tetris-&y-1]=b[2];
&&&&a[tetris-&x+2][tetris-&y]=b[3];
&&case 12:&&&&&&&&//7字方块
&&&&a[tetris-&x][tetris-&y-1]=b[1];
&&&&a[tetris-&x][tetris-&y+1]=b[2];
&&&&a[tetris-&x-2][tetris-&y-1]=b[3];
&&case 13:&&&&&&&&//7字顺时针转90度方块
&&&&a[tetris-&x-2][tetris-&y]=b[1];
&&&&a[tetris-&x-2][tetris-&y+1]=b[2];
&&&&a[tetris-&x+2][tetris-&y]=b[3];
&&case 14:&&&&&&&&//7字顺时针转180度方块
&&&&a[tetris-&x][tetris-&y-1]=b[1];
&&&&a[tetris-&x][tetris-&y+1]=b[2];
&&&&a[tetris-&x+2][tetris-&y+1]=b[3];
&&case 15:&&&&&&&&//7字顺时针转270度方块
&&&&a[tetris-&x-2][tetris-&y]=b[1];
&&&&a[tetris-&x+2][tetris-&y-1]=b[2];
&&&&a[tetris-&x+2][tetris-&y]=b[3];
&&case 16:&&&&&&&&//倒7字方块
&&&&a[tetris-&x][tetris-&y+1]=b[1];
&&&&a[tetris-&x][tetris-&y-1]=b[2];
&&&&a[tetris-&x+2][tetris-&y-1]=b[3];
&&case 17:&&&&&&&&//倒7字顺指针转90度方块
&&&&a[tetris-&x-2][tetris-&y]=b[1];
&&&&a[tetris-&x-2][tetris-&y-1]=b[2];
&&&&a[tetris-&x+2][tetris-&y]=b[3];
&&case 18:&&&&&&&&//倒7字顺时针转180度方块
&&&&a[tetris-&x][tetris-&y-1]=b[1];
&&&&a[tetris-&x][tetris-&y+1]=b[2];
&&&&a[tetris-&x-2][tetris-&y+1]=b[3];
&&case 19:&&&&&&&&//倒7字顺时针转270度方块
&&&&a[tetris-&x-2][tetris-&y]=b[1];
&&&&a[tetris-&x+2][tetris-&y+1]=b[2];
&&&&a[tetris-&x+2][tetris-&y]=b[3];
//******判断是否可动*************************************************************************/
int if_moveable(struct Tetris *tetris)
&if(a[tetris-&x][tetris-&y]!=0)//当中心方块位置上有图案时,返回值为0,即不可移动
&&return 0;
&&if(&//当为田字方块且除中心方块位置外,其他&口&字方块位置上无图案时,返回值为1,即可移动
&&&( tetris-&flag==1& && ( a[tetris-&x][tetris-&y-1]==0&& &&
&&&&a[tetris-&x+2][tetris-&y-1]==0 && a[tetris-&x+2][tetris-&y]==0 ) ) ||
&&&//或为直线方块且除中心方块位置外,其他&口&字方块位置上无图案时,返回值为1,即可移动
&&&( tetris-&flag==2& && ( a[tetris-&x-2][tetris-&y]==0&& &&
&&&&a[tetris-&x+2][tetris-&y]==0 && a[tetris-&x+4][tetris-&y]==0 ) )&& ||
&&&( tetris-&flag==3& && ( a[tetris-&x][tetris-&y-1]==0&& &&
&&&&a[tetris-&x][tetris-&y-2]==0 &&&a[tetris-&x][tetris-&y+1]==0 ) )&& ||
&&&( tetris-&flag==4& && ( a[tetris-&x-2][tetris-&y]==0&& &&
&&&&a[tetris-&x+2][tetris-&y]==0 &&&a[tetris-&x][tetris-&y+1]==0 ) )&& ||
&&&( tetris-&flag==5& && ( a[tetris-&x][tetris-&y-1]==0&& &&
&&&&a[tetris-&x][tetris-&y+1]==0 && a[tetris-&x-2][tetris-&y]==0 ) )&& ||
&&&( tetris-&flag==6& && ( a[tetris-&x][tetris-&y-1]==0&& &&
&&&&a[tetris-&x-2][tetris-&y]==0 &&&a[tetris-&x+2][tetris-&y]==0 ) )&& ||
&&&( tetris-&flag==7& && ( a[tetris-&x][tetris-&y-1]==0&& &&
&&&&a[tetris-&x][tetris-&y+1]==0 &&&a[tetris-&x+2][tetris-&y]==0 ) )&& ||
&&&( tetris-&flag==8& && ( a[tetris-&x][tetris-&y+1]==0&& &&
&&&&a[tetris-&x-2][tetris-&y]==0 &&&a[tetris-&x+2][tetris-&y+1]==0 ) ) ||
&&&( tetris-&flag==9& && ( a[tetris-&x][tetris-&y-1]==0&& &&
&&&&a[tetris-&x-2][tetris-&y]==0 && a[tetris-&x-2][tetris-&y+1]==0 ) ) ||
&&&( tetris-&flag==10 && ( a[tetris-&x][tetris-&y-1]==0&& &&
&&&&a[tetris-&x-2][tetris-&y-1]==0 && a[tetris-&x+2][tetris-&y]==0 ) ) ||
&&&( tetris-&flag==11 && ( a[tetris-&x][tetris-&y+1]==0&& &&
&&&&a[tetris-&x+2][tetris-&y-1]==0 && a[tetris-&x+2][tetris-&y]==0 ) ) ||
&&&( tetris-&flag==12 && ( a[tetris-&x][tetris-&y-1]==0&& &&
&&&&a[tetris-&x][tetris-&y+1]==0 && a[tetris-&x-2][tetris-&y-1]==0 ) ) ||
&&&( tetris-&flag==13 && ( a[tetris-&x-2][tetris-&y]==0&& &&
&&&&a[tetris-&x-2][tetris-&y+1]==0 && a[tetris-&x+2][tetris-&y]==0 ) ) ||
&&&( tetris-&flag==14 && ( a[tetris-&x][tetris-&y-1]==0&& &&
&&&&a[tetris-&x][tetris-&y+1]==0 && a[tetris-&x+2][tetris-&y+1]==0 ) ) ||
&&&( tetris-&flag==15 && ( a[tetris-&x-2][tetris-&y]==0&& &&
&&&&a[tetris-&x+2][tetris-&y-1]==0 && a[tetris-&x+2][tetris-&y]==0 ) ) ||
&&&( tetris-&flag==16 && ( a[tetris-&x][tetris-&y+1]==0&& &&
&&&&a[tetris-&x][tetris-&y-1]==0 &&&a[tetris-&x+2][tetris-&y-1]==0 ) ) ||
&&&( tetris-&flag==17 && ( a[tetris-&x-2][tetris-&y]==0&& &&
&&&&a[tetris-&x-2][tetris-&y-1]==0 && a[tetris-&x+2][tetris-&y]==0 ) ) ||
&&&( tetris-&flag==18 && ( a[tetris-&x][tetris-&y-1]==0&& &&
&&&&a[tetris-&x][tetris-&y+1]==0 && a[tetris-&x-2][tetris-&y+1]==0 ) ) ||
&&&( tetris-&flag==19 && ( a[tetris-&x-2][tetris-&y]==0&& &&
&&&&a[tetris-&x+2][tetris-&y+1]==0 && a[tetris-&x+2][tetris-&y]==0 ) ) )
&&&&return 1;
&return 0;
/******随机产生俄罗斯方块类型的序号**********************************************************/
void get_flag(struct Tetris *tetris)
&tetris-&count++;&&&&&//记住产生方块的个数
&srand((unsigned)time(NULL));&&//初始化随机数
&if(tetris-&count==1)
&&tetris-&flag = rand()%19+1;&&//记住第一个方块的序号
&tetris-&next = rand()%19+1;&&&//记住下一个方块的序号
/******打印俄罗斯方块**********************************************************************/
void print_tetris(HANDLE hOut,struct Tetris *tetris)
&for(i=0;i&4;i++)
&&b[i]=1;&&&&&&&&&//数组b[4]的每个元素的值都为1
&make_tetris(tetris);&&&&&&//制作俄罗斯方块
&for( i=tetris-&x-2; i&=tetris-&x+4; i+=2 )
&&for(j=tetris-&y-2;j&=tetris-&y+1;j++)
&&&if( a[i][j]==1 && j&FrameY )
&&&&gotoxy(hOut,i,j);
&&&&printf(&□&);&&&&&//打印边框内的方块
&//打印菜单信息
&gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+1);
&printf(&level : %d&,tetris-&level);
&gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+3);
&printf(&score : %d&,tetris-&score);
&gotoxy(hOut,FrameX+2*Frame_width+3,FrameY+5);
&printf(&speed : %dms&,tetris-&speed);
/******清除俄罗斯方块的痕迹****************************************************************/
void clear_tetris(HANDLE hOut,struct Tetris *tetris)
&for(i=0;i&4;i++)
&&b[i]=0;&&&&&&&&&//数组b[4]的每个元素的值都为0
&make_tetris(tetris);&&&&&&//制作俄罗斯方块
&for( i=tetris-&x-2; i&=tetris-&x+4; i+=2 )
&&for(j=tetris-&y-2;j&=tetris-&y+1;j++)
&&&if( a[i][j]==0 && j&FrameY )
&&&&gotoxy(hOut,i,j);
&&&&printf(&& &);&&&&&//清除方块
/******判断是否满行并删除满行的俄罗斯方块****************************************************/
void del_full(HANDLE hOut,struct Tetris *tetris)
{&&&&&&&//当某行有Frame_width-2个方块时,则满行
&int k,del_count=0;&&//分别用于记录某行方块的个数和删除方块的行数的变量
&for(j=FrameY+Frame_height-1;j&=FrameY+1;j--)
&&for(i=FrameX+2;i&FrameX+2*Frame_width-2;i+=2)
&&&if(a[i][j]==1)&//竖坐标依次从下往上,横坐标依次由左至右判断是否满行
&&&&k++;&&//记录此行方块的个数
&&&&if(k==Frame_width-2)
&&&&&for(k=FrameX+2;k&FrameX+2*Frame_width-2;k+=2)
&&&&&{&&//删除满行的方块
&&&&&&a[k][j]=0;
&&&&&&gotoxy(hOut,k,j);
&&&&&&printf(&& &);
&&&&&&Sleep(1);
&&&&&for(k=j-1;k&FrameY;k--)
&&&&&{&&//如果删除行以上的位置有方块,则先清除,再将方块下移一个位置
&&&&&&for(i=FrameX+2;i&FrameX+2*Frame_width-2;i+=2)
&&&&&&&if(a[i][k]==1)
&&&&&&&&a[i][k]=0;
&&&&&&&&gotoxy(hOut,i,k);
&&&&&&&&printf(&& &);
&&&&&&&&a[i][k+1]=1;
&&&&&&&&gotoxy(hOut,i,k+1);
&&&&&&&&printf(&□&);
&&&&&j++;&&&//方块下移后,重新判断删除行是否满行
&&&&&del_count++;&//记录删除方块的行数
&tetris-&score+=100*del_&//每删除一行,得100分
&if( del_count&0 && ( tetris-&score%1000==0 || tetris-&score/1000&tetris-&level-1 ) )
&{&&&&&&&&//如果得1000分即累计删除10行,速度加快20ms并升一级
&&tetris-&speed-=20;
&&tetris-&level++;
/******开始游戏******************************************************************************/
void start_game()
&HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);&&//定义显示器句柄变量
&struct Tetris t,*tetris=&t;&&&&&&&//定义结构体的指针并指向结构体变量
&&&&&&&&&&//定义接收键盘输入的变量
&tetris-&count=0;&&&&&&//初始化俄罗斯方块数为0个
&tetris-&speed=300;&&&&&&//初始移动速度为300ms
&tetris-&score=0;&&&&&&//初始游戏的分数为0分
&tetris-&level=1;&&&&&&//初始游戏为第1关
&{//循环产生方块,直至游戏结束
&&get_flag(tetris);&&&&&//得到产生俄罗斯方块类型的序号
&&temp=tetris-&&&&&&//记住当前俄罗斯方块序号
&&//打印下一个俄罗斯方块的图形(右边窗口)
&&tetris-&x=FrameX+2*Frame_width+6;
&&tetris-&y=FrameY+10;
&&tetris-&flag = tetris-&
&&print_tetris(hOut,tetris);
&&tetris-&x=FrameX+Frame_&&//初始中心方块x坐标
&&tetris-&y=FrameY-1;&&&&&//初始中心方块y坐标
&&tetris-&flag=&&&&&//取出当前的俄罗斯方块序号
&&while(1)
&&{//控制方块方向,直至方块不再下移
&&&label:print_tetris(hOut,tetris);//打印俄罗斯方块
&&&Sleep(tetris-&speed);&&&//延缓时间
&&&clear_tetris(hOut,tetris);&&//清除痕迹
&&&temp1=tetris-&x;&&&&//记住中心方块横坐标的值
&&&temp2=tetris-&&&&&//记住当前俄罗斯方块序号
&&&if(kbhit())&&&
&&&{&&&&&&&&//判断是否有键盘输入,有则用ch↓接收
&&&&ch=getch();&
&&&&if(ch==75)&&&&&//按←键则向左动,中心横坐标减2
&&&&{&&&&&&
&&&&&tetris-&x-=2;
&&&&if(ch==77)&&&&&//按→键则向右动,中心横坐标加2
&&&&{&&&&&&
&&&&&tetris-&x+=2;&&&&
&&&&if(ch==72)&&&&&//按↑键则变体即当前方块顺时针转90度
&&&&{&&&&&&
&&&&&if( tetris-&flag&=2 && tetris-&flag&=3 )
&&&&&&tetris-&flag++;&
&&&&&&tetris-&flag%=2;
&&&&&&tetris-&flag+=2;
&&&&&if( tetris-&flag&=4 && tetris-&flag&=7 )
&&&&&&tetris-&flag++;
&&&&&&tetris-&flag%=4;
&&&&&&tetris-&flag+=4;
&&&&&}&&&&
&&&&&if( tetris-&flag&=8 && tetris-&flag&=11 )
&&&&&&tetris-&flag++;
&&&&&&tetris-&flag%=4;
&&&&&&tetris-&flag+=8;
&&&&&}&&&&
&&&&&if( tetris-&flag&=12 && tetris-&flag&=15 )
&&&&&&tetris-&flag++;
&&&&&&tetris-&flag%=4;
&&&&&&tetris-&flag+=12;
&&&&&}&&&&
&&&&&if( tetris-&flag&=16 && tetris-&flag&=19 )
&&&&&&tetris-&flag++;
&&&&&&tetris-&flag%=4;
&&&&&&tetris-&flag+=16;
&&&&if(ch==32)&&&&&//按空格键,暂停
&&&&&print_tetris(hOut,tetris);
&&&&&while(1)
&&&&&&if(kbhit())&&&//再按空格键,继续游戏
&&&&&&&ch=getch();
&&&&&&&if(ch==32)
&&&&if(if_moveable(tetris)==0)&//如果不可动,上面操作无效
&&&&&tetris-&x=temp1;
&&&&&tetris-&flag=temp2;
&&&&else&&&&&&//如果可动,执行操作
&&&tetris-&y++;&&&&&//如果没有操作指令,方块向下移动
&&&if(if_moveable(tetris)==0)&&//如果向下移动且不可动,方块放在此处
&&&&tetris-&y--;
&&&&print_tetris(hOut,tetris);
&&&&del_full(hOut,tetris);
&&for(i=tetris-&y-2;i&tetris-&y+2;i++)
&&{//游戏结束条件:方块触到框顶位置
&&&if(i==FrameY)
&&&&j=0;&&&&&&//如果游戏结束,j=0
&&if(j==0)&&&&&&&
&&&system(&cls&);
&&&getch();
&&//清除下一个俄罗斯方块的图形(右边窗口)
&&tetris-&flag = tetris-&
&&tetris-&x=FrameX+2*Frame_width+6;
&&tetris-&y=FrameY+10;
&&clear_tetris(hOut,tetris);&&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:399609次
积分:6280
积分:6280
排名:第3957名
原创:68篇
评论:448条
(1)(1)(4)(2)(1)(8)(4)(6)(4)(42)

我要回帖

更多关于 俄罗斯方块下落算法 的文章

 

随机推荐