| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4183 人关注过本帖
标题:[原创]250行代码的俄罗斯方块游戏
只看楼主 加入收藏
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
继续

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-06-18 09:05
静夜思
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:济南的冬天
等 级:管理员
威 望:11
帖 子:8913
专家分:2567
注 册:2004-3-25
收藏
得分:0 

/*以下程序在Tc2.0下编译运行*/ #include <stdio.h> #include <stdlib.h> #include <bios.h> #include <graphics.h> /*定义键盘扫描码*/ #define k_down 20480 #define k_left 19200 #define k_right 19712 #define k_space 14624 #define k_esc 283 #define k_p 6512 /*以下定义常用的常数*/ #define M_Max 20 /*游戏框大小为20*10*/ #define N_Max 10 #define Pc_Delay 10 /*延时的基准数*/ #define Down_Sp 18000 /*方块的下落速度默认分频数(对delay(Pc_Delay)函数分频)*/

typedef enum {D_Zero,D_Russ}Ar_Type; /*将矩阵内数据枚举*/ Ar_Type Gm_Array[M_Max][N_Max]; /*游戏矩阵*/ struct { int x; int y; /*当前处理方块的位置*/ int score; int speed; /*玩家分数和速度分频数(每升一级:减15层,speed减少2000)*/ int type; int dict; /*type:当前方块的形状类型(用于查表),dict:当前控制的方向*/ int nextt; /*下一个方块的形状类型*/ }S_Status; /*游戏状态*/ enum {M_Conti,M_Pause,M_Exit,M_Gover}Mess; /*定义消息:M_Conti:游戏进行中,M_Pause:暂停,M_Exit:退出游戏,M_Gover:游戏结束*/ int Ru_Sp[7][4][4]={{{4,5,6,9},{0,4,5,8},{5,8,9,10},{1,4,5,9}},{{4,5,6,8},{0,4,8,9},{6,8,9,10},{0,1,5,9}}, {{4,5,6,10},{0,1,4,8},{4,8,9,10},{1,5,8,9}},{{5,6,8,9},{0,4,5,9},{0,0,0,0},{0,0,0,0}}, {{4,5,9,10},{1,4,5,8},{0,0,0,0},{0,0,0,0}},{{1,5,9,13},{4,5,6,7},{0,0,0,0},{0,0,0,0}}, {{0,1,4,5},{0,0,0,0},{0,0,0,0},{0,0,0,0}}};/*定义静态表,表中存储方块形状数据*/ char format_GO[10]; /*用于在屏幕上格式化输出数字*/

void opengraph(void); /*打开图形模式并注册图形驱动*/ void Draw_Node(int,int,Ar_Type); /*在屏幕上画一个小方块,游戏中的方块由四个这样的小方块组成*/ void Init_Gm(void); /*初始化游戏数据*/ void Draw_Shape(int,int,int,int,Ar_Type); /*查表画出游戏中不同种类和形状的方块*/ int Rand_New(void); /*当一个方块下落完成后,随机产生新的方块*/ int Check_Move_Ok(int,int,int); /*当用左,下,右键控制游戏方块的时候检查是否可以控制*/ void Russ_Move(int); /*用于控制方块左,下,右的移动,该函数有键盘扫描调用*/ void Russ_Rot(void); /*对方块旋转*/ void Dec_Level(void); /*减层函数*/ void Gm_Over(void); /*方块到顶的时候游戏结束,这个函数处理游戏结束事件*/

void main() { int keyid,d_sp=Down_Sp; randomize(); /*初始化随机数发生器*/ opengraph(); /*打开图形模式并注册图形驱动*/ setcolor(WHITE); /*以下画游戏图形框架*/ rectangle(180,70,380,470); setcolor(YELLOW); settextstyle(0,0,1); outtextxy(50,40,"Esc:Quit ||| Left,Down,Right:Move ||| p:Pause ||| Space:Rotate"); settextstyle(0,0,2); outtextxy(130,10,"Russia FK (By STN_LCD!)"); outtextxy(400,200,"Score:"); outtextxy(400,250,"Speed:"); Init_Gm(); /*初始化游戏数据*/ Rand_New(); /*产生第一个方块*/ while(Mess!=M_Exit) { /*以下进行键盘扫描和消息的循环*/ if(bioskey(1)) { keyid=bioskey(0); switch(keyid) { case k_left: if(Mess==M_Conti) Russ_Move(-1); /*-1表示向左移动方块*/ break; case k_down: if(Mess==M_Conti) Russ_Move(0); /*0表示向下移动方块*/ break; case k_right: if(Mess==M_Conti) Russ_Move(1); /*1表示向右移动方块*/ break; case k_p: if(Mess==M_Conti) /*暂停!(再按一下p游戏将继续)*/ Mess=M_Pause,setfillstyle(0,BLACK),bar(400,300,600,450),outtextxy(410,320,"Pause!"), settextstyle(0,0,1),outtextxy(410,350,"Press 'p' to continue..."),settextstyle(0,0,2); else Mess=M_Conti,setfillstyle(0,BLACK),bar(400,300,600,450); break; case k_space: /*旋转方块*/ if(Mess==M_Conti) Russ_Rot(); break; case k_esc: /*退出游戏*/ if(Mess==M_Conti) Mess=M_Exit,outtextxy(100,150,"Press anykey to quit!"),getch(); break; } } delay(Pc_Delay); /*方块延时基时间*/ if(Mess==M_Conti&&!--d_sp) Russ_Move(0), d_sp=S_Status.speed;/*d_sp用于分频控制*/ if(Mess==M_Gover) Gm_Over(); /*如果为“游戏结束”消息,转去执行游戏结束函数*/ } closegraph(); }

void opengraph(void) {/*打开图形模式,并注册图形驱动*/ int gdriver=VGA,gmode=VGAHI; registerbgidriver(EGAVGA_driver); initgraph(&gdriver,&gmode,""); }

void Draw_Node(int x,int y,Ar_Type type) { /*在屏幕上画一个小方块*/ int x_x=x*20+70; int y_y=y*20+180; if(type==D_Zero) setfillstyle(SOLID_FILL,BLACK); else if(type==D_Russ) setfillstyle(SOLID_FILL,YELLOW); bar(y_y+2,x_x+2,y_y+18,x_x+18); }

void Draw_Shape(int x,int y,int type,int d,Ar_Type hd) {/*查表画出游戏中不同种类和形状的方块*/ int i,xt,yt,temp; for(i=0;i<4;i++) { temp=Ru_Sp[type][d][i]; xt=x+temp/4; yt=y+temp%4; Draw_Node(xt,yt,hd); } }

int Rand_New(void) { int i,temp; for(i=0;i<4;i++) { temp=Ru_Sp[S_Status.nextt][0][i]; if(Gm_Array[temp/4][4+temp%4]) return 0;/*gameover*/ } setfillstyle(SOLID_FILL,BLACK); bar(385,70,480,170); S_Status.type=S_Status.nextt; S_Status.nextt=rand()%7; S_Status.x=0; S_Status.y=4; S_Status.dict=0; Draw_Shape(0,4,S_Status.type,0,D_Russ); Draw_Shape(0,11,S_Status.nextt,0,D_Russ); return 1; }

void Init_Gm(void) { int i,j; S_Status.nextt=rand()%7; setfillstyle(0,BLACK); bar(500,190,630,270); S_Status.score=0; S_Status.speed=Down_Sp; outtextxy(500,200,itoa(S_Status.score,format_GO,10)); outtextxy(500,250,itoa((int)((Down_Sp-S_Status.speed)/100),format_GO,10)); for(i=0;i<M_Max;i++) for(j=0;j<N_Max;j++) Gm_Array[i][j]=D_Zero; }

int Check_Move_Ok(int x,int y,int dict) {/*dict = -1(left),0(down),1(right)*/ int i,temp,xt,yt,flag=0; if(!dict) ++x; else y=y+dict; for(i=0;i<4;i++) { temp=Ru_Sp[S_Status.type][S_Status.dict][i]; xt=x+temp/4; yt=y+temp%4; if(xt<0||xt>=M_Max||yt<0||yt>=N_Max||Gm_Array[xt][yt]==D_Russ) { if(dict) { ++xt; yt=yt-dict; if(xt<0||xt>=M_Max||yt<0||yt>=N_Max||Gm_Array[xt][yt]==D_Russ) return 2; } flag=1; } } return flag; /*return 2:在左右的时候都不行,return 1:在左右的时候向下可以,return 0:OK*/ }

void Russ_Move(int dict) { int i,temp,ok; ok=Check_Move_Ok(S_Status.x,S_Status.y,dict); if(!ok) { Draw_Shape(S_Status.x,S_Status.y,S_Status.type,S_Status.dict,D_Zero); if(!dict) ++S_Status.x; else S_Status.y=S_Status.y+dict; Draw_Shape(S_Status.x,S_Status.y,S_Status.type,S_Status.dict,D_Russ); } else if((dict&&ok==2)||(!dict&&ok==1)) { for(i=0;i<4;i++) { temp=Ru_Sp[S_Status.type][S_Status.dict][i]; Gm_Array[S_Status.x+temp/4][S_Status.y+temp%4]=D_Russ; } Dec_Level(); if(!Rand_New()) Mess=M_Gover; } }

void Russ_Rot(void) { int i,flag=1,temp,xt,yt,tmp1; if(S_Status.type<=2) tmp1=(S_Status.dict+1)%4; else if(S_Status.type<=5) tmp1=(S_Status.dict+1)%2; else tmp1=S_Status.dict; for(i=0;i<4&&flag;i++) { temp=Ru_Sp[S_Status.type][tmp1][i]; xt=S_Status.x+temp/4; yt=S_Status.y+temp%4; if(xt<0||xt>=M_Max||yt<0||yt>=N_Max||Gm_Array[xt][yt]==D_Russ) flag=0; } if(flag) { Draw_Shape(S_Status.x,S_Status.y,S_Status.type,S_Status.dict,D_Zero); S_Status.dict=tmp1; Draw_Shape(S_Status.x,S_Status.y,S_Status.type,S_Status.dict,D_Russ); } }

void Dec_Level(void) { int i,j,k,num,up,down; up=S_Status.x; if(S_Status.type<=4) down=up+2; else if(S_Status.type<=5) down=up+3; else down=up+1; for(i=up;i<=down;i++) { num=0; for(j=0;j<N_Max;j++) {num+=Gm_Array[i][j];} if(num==N_Max) { for(j=0;j<N_Max;++j) { for(k=i-1;k>=0;--k) { Draw_Node(k+1,j,Gm_Array[k][j]); Gm_Array[k+1][j]=Gm_Array[k][j]; } Gm_Array[0][j]=D_Zero; Draw_Node(0,j,D_Zero); } setfillstyle(0,BLACK); bar(500,190,630,220); ++S_Status.score; outtextxy(500,200,itoa(S_Status.score,format_GO,10)); if(S_Status.speed>4000&&(S_Status.score%15==0)) { bar(500,240,630,270); S_Status.speed-=2000; outtextxy(500,250,itoa((int)((Down_Sp-S_Status.speed)/2000),format_GO,10)); } } } }

void Gm_Over(void) { char ch; int i,j; outtextxy(410,320,"Game Over!"); settextstyle(0,0,1); outtextxy(410,350,"Press Y/y to restart!"); outtextxy(470,360,"N/n to Quit!"); settextstyle(0,0,2); do {ch=getch(); }while(ch!='y'&&ch!='Y'&&ch!='n'&&ch!='N'); if(ch=='n'||ch=='N') { Mess=M_Exit; outtextxy(100,150,"Press anykey to quit!"); getch(); } else { Mess=M_Conti; setfillstyle(0,BLACK); bar(181,71,379,469); bar(400,300,600,450); Init_Gm(); Rand_New(); } }


畅所欲言
2005-06-18 10:46
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 
今天又对游戏里面的一个小隐患进行了修改,并增加许多注释,所以又上传了一遍源码和exe文件:
[attach]2392[/attach]
偶学的专业是农业工程,跟计算机没一点关系,这里不都是学计算机的专业人士吗?如果这些真正的高手不给评价我老以为自己的程序写的不错,所以玩玩,并把感受写下来吧!

要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2005-06-18 18:04
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
得分:0 
偶对楼主的个人签名感兴趣,为什么这么说呢?

相信勤能补拙! 喜欢用好用的就永远学不到有用的。
2005-06-19 06:48
盖茨他爹
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:5255
专家分:0
注 册:2005-5-3
收藏
得分:0 
相机和望远镜是用来偷拍和偷窥女人的
2005-06-19 10:12
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
得分:0 
俺觉得没那么低级吧?偷窥了又怎样,还会为了这个破产?

相信勤能补拙! 喜欢用好用的就永远学不到有用的。
2005-06-19 11:20
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 
以下是引用盖茨他爹在2005-6-19 10:12:16的发言: 相机和望远镜是用来偷拍和偷窥女人的
No No No,我最喜欢天文了,所以很想拥有几台高质量的天文望远镜,所以这样写应该不过分吧?

要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2005-06-19 11:23
tempnetbar
Rank: 2
等 级:新手上路
威 望:4
帖 子:582
专家分:4
注 册:2004-5-5
收藏
得分:0 
看看,还是我理解的对吧~哦~stnlcd偶是你知己吧?就知道不会是这么低级趣味的,呵呵。天文望远镜确实是天文数字啊,买不起。

相信勤能补拙! 喜欢用好用的就永远学不到有用的。
2005-06-19 22:07
stnlcd
Rank: 1
等 级:新手上路
帖 子:177
专家分:1
注 册:2004-11-21
收藏
得分:0 
看了你的网站(http://sonofreedom.net),挺不错的,以后希望继续放一些好的作品。 我也学过java ,觉得java的确是一个很优美的语言,应该也是目前最有前途的语言了,今后的发展前途应该比c++光明一些。但java实在是不适合我,所以现在又放弃了。希望java能在我们这一代人中发扬光大,因为它比VC++不知道要好玩多少倍。 不知道我的程序在你们看来怎么样?我现在最想学好的就是编译原理了,我把:算法与数据结构,编译原理,操作系统和面向对象设计(UML那些东东等)称为计算机的“四大金刚”,我觉得要想在计算机科学上有所造诣,这四门课非学好不可。你们觉得呢?

要让一个男人破产,请给他一架相机,要让一个男人倾家荡产,请给他一架望远镜。
2005-06-19 22:29
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 
唉,TNND,JAVA!


还有个是谁?C#?你俩懂吗?

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2005-06-21 00:25
快速回复:[原创]250行代码的俄罗斯方块游戏
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024495 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved