俄罗斯方块C源代码.
*俄罗斯方块源程序
*/
#include
#include
#include
#include
/*定义按键码*/
#define VK_LEFT 0x4b00
#define VK_RIGHT 0x4d00
#define VK_DOWN 0x5000
#define VK_UP 0x4800
#define VK_ESC 0x011b
#define TIMER 0x1c /*设置中断号*/
/*定义常量*/
#define MAX_BOX 19 /*总共有19种各形态的方块*/
#define BSIZE 20 /*方块的边长是20个象素*/
#define Sys_x 160 /*显示方块界面的左上角x座标*/
#define Sys_y 25 /*显示方块界面的左上角y座标*/
#define Horizontal_boxs 10 /*水平的方向以方块为单位的长度*/
#define Vertical_boxs 15 /*垂直的方向以方块为单位的长度,也就说长是15个方块*/ #define Begin_boxs_x Horizontal_boxs/2 /*产生第一个方块时出现的起始位置*/
#define FgColor 3 /*前景颜色,如文字.2-green*/
#define BgColor 0 /*背景颜色.0-blac*/
#define LeftWin_x Sys_x+Horizontal_boxs*BSIZE+46 /*右边状态栏的x座标*/
#define false 0
#define true 1
/*移动的方向*/
#define MoveLeft 1
#define MoveRight 2
#define MoveDown 3
#define MoveRoll 4
/*以后坐标的每个方块可以看作是像素点是BSIZE*BSIZE的正方形*/
/*定义全局变量*/
int current_box_numb; /*保存当前方块编号*/
int Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y;/*x,y是保存方块的当前坐标的*/
int flag_newbox=false; /*是否要产生新方块的标记0*/
int speed=0; /*下落速度*/
int score=0; /*总分*/
int speed_step=30; /*每等级所需要分数*/
void interrupt (*oldtimer)(void);/* 指向原来时钟中断处理过程入口的中断处理函数指针 */
struct BOARD /*游戏底板结构,表示每个点所具有的属性*/
{
int var; /*当前状态只有0和1,1表示此点已被占用*/
int color; /*颜色,游戏底板的每个点可以拥有不同的颜色.增强美观*/
}Table_board[Vertical_boxs][Horizontal_boxs];
/*方块结构*/
struct SHAPE
{
char box[2]; /*一个字节等于8位,每4位来表示一个方块的一行
如:box[0]="0x88",box[1]="0xc0"表示的是:
1000
1000
1100
0000*/
int color; /*每个方块的颜色*/
int next; /*下个方块的编号*/
};
/*初始化方块内容.即定义MAX_BOX个SHAPE类型的结构数组,并初始化*/
struct SHAPE shapes[MAX_BOX]=
{
/*
* 口口口口口口口
* 口口口口口口
* 口口口
*/
{0x88, 0xc0, CYAN, 1},
{0xe8, 0x0, CYAN, 2},
{0xc4, 0x40, CYAN, 3},
{0x2e, 0x0, CYAN, 0},
/*
* 口口口口口口
* 口口口口
* 口口口口口口
*/
{0x44, 0xc0, MAGENTA, 5}, {0x8e, 0x0, MAGENTA, 6}, {0xc8, 0x80, MAGENTA, 7}, {0xe2, 0x0, MAGENTA, 4},
/*
* 口
* 口口口口
* 口口口
*/
{0x8c, 0x40, YELLOW, 9}, {0x6c, 0x0, YELLOW, 8},
/*
* 口口口
* 口口口口
* 口
*/
{0x4c, 0x80, BROWN, 11}, {0xc6, 0x0, BROWN, 10},
/*
* 口口口
* 口口口口口口口口口口* 口口口
*/
{0x4e, 0x0, WHITE, 13}, {0x8c, 0x80, WHITE, 14}, {0xe4, 0x0, WHITE, 15}, {0x4c, 0x40, WHITE, 12},
/* 口
* 口
* 口口口口口
* 口
*/
{0x88, 0x88, RED, 17}, {0xf0, 0x0, RED, 16},
/*
* 口口
* 口口
*/
{0xcc, 0x0, BLUE, 18}
};
unsigned int TimerCounter=0; /*定时计数器变量*/
/* 新的时钟中断处理函数 */
void interrupt newtimer(void)
{
(*oldtimer)(); /* call the old routine */
TimerCounter++;/* increase the global counter */
}
/* 设置新的时钟中断处理过程 */
void SetTimer(void interrupt(*IntProc)(void))
{
oldtimer=getvect(TIMER); /*获取中断号为TIMER的中断处理函数的入口地址*/ disable(); /* 设置新的时钟中断处理过程时,禁止所有中断 */
setvect(TIMER,IntProc);
/*将中断号为TIMER的中断处理函数的入口地址改为IntProc()函数的入口地址
即中断发生时,将调用IntProc()函数。*/
enable(); /* 开启中断 */
}
/* 恢复原有的时钟中断处理过程 */
void KillTimer()
{
disable();
setvect(TIMER,oldtimer);
enable();
}
void show_intro(int xs,int ys)
{
char stemp[50];
setcolor (15);
rectangle(xs,ys,xs+239,ys+100);
sprintf(stemp," -Roll -Downwards");
stemp[0]=24;
stemp[8]=25;
setcolor(14);
outtextxy(xs+40,ys+30,stemp);
sprintf(stemp," -Turn Left -Turn Right");
stemp[0]=27;
stemp[13]=26;
outtextxy(xs+40,ys+45,stemp);
outtextxy(xs+40,ys+60,"Esc-Exit ");
setcolor(FgColor);
}
/*显示分数*/
void ShowScore(int score)
{
int x,y;
char score_str[5];/*保存游戏得分*/
setfillstyle(SOLID_FILL,BgColor);
x=LeftWin_x;
y=100;
bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3);
sprintf(score_str,"%3d",score);
outtextxy(x,y,"SCORE");
outtextxy(x,y+10,score_str);
}
/*显示速度*/
void ShowSpeed(int speed)
{
int x,y;
char speed_str[5];/*保存速度值*/
setfillstyle(SOLID_FILL,BgColor);
x=LeftWin_x;
y=150;
bar(x-BSIZE,y,x+BSIZE*3,y+BSIZE*3);
/*确定一个以(x1,y1)为左上角,(x2,y2)为右下角的矩形窗口, 再按规定图模和颜色填充。*/ sprintf(speed_str,"%3d",speed+1);
outtextxy(x,y,"Level");
outtextxy(x,y+10,speed_str);
/*输出字符串指针speed_str所指的文本在规定的(x, y)位置*/
outtextxy(x,y+50,"Nextbox");
}
/**********初始化界面*******
*参数说明:
* x,y为左上角坐标
* m,n对应于Vertical_boxs,Horizontal_boxs
* 分别表示纵横方向上方块的个数(以方块为单位)
* BSIZE Sys_x Sys_y
**********************************/
void initialize(int x,int y,int m,int n)
{
int i,j,oldx;
oldx=x;
for(j=0;j { for(i=0;i { Table_board[j][i].var=0; Table_board[j][i].color=BgColor; line(x,y,x+BSIZE,y); line(x,y,x,y+BSIZE); line(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE); x+=BSIZE; } y+=BSIZE; x=oldx; } Curbox_x=x; Curbox_y=y;/*x,y是保存方块的当前坐标的*/ flag_newbox=false; /*是否要产生新方块的标记0*/ speed=0; /*下落速度*/ score=0; /*总分*/ ShowScore(score); ShowSpeed(speed); } /* 删除一行满的情况 * 这里的y为具体哪一行为满 */ int DelFullRow(int y) { /*该行游戏板往下移一行*/ int n,top=0; /*top保存的是当前最高点,出现一行全空就表示为最点了,移动是到最高点结 束*/ register m,totoal; for(n=y;n>=0;n--)/*从当前行往上看*/ { totoal=0; for(m=0;m { if(!Table_board[n][m].var)totoal++; /*没占有方格+1*/ if(Table_board[n][m].var!=Table_board[n-1][m].var) /*上行不等于下行就把上行传给下行 xor关系*/ { Table_board[n][m].var=Table_board[n-1][m].var; Table_board[n][m].color=Table_board[n-1][m].color; } } if(totoal==Horizontal_boxs) /*发现上面有连续的空行提前结束*/ { top=n; break; } } return(top); /*返回最高点*/ } /*找到一行满的情况*/ void setFullRow(int t_boardy) { int n,full_numb=0,top=0; /*top保存的是当前方块的最高点*/ register m; /* t_boardy 口 5 口 6 口口口口口口 7 n 口口口口口口 8 */ for(n=t_boardy+3;n>=t_boardy;n--) { if(n<0 || n>=Vertical_boxs ){continue;} /*超过低线了*/ for(m=0;m { if(!Table_board[n+full_numb][m].var)break; /*发现有一个是空就跳过该行*/ } if(m==Horizontal_boxs) /*找到满行了*/ if(n==t_boardy+3) /*第一次献给了n,最高的*/ top=DelFullRow(n+full_numb); /*清除游戏板里的该行,并下移数据*/ else DelFullRow(n+full_numb); full_numb++; /*统计找到的行数*/ } } if(full_numb) { int oldx,x=Sys_x,y=BSIZE*top+Sys_y; oldx=x; score=score+full_numb*10; /*加分数*/ /*这里相当于重显调色板*/ for(n=top;n { if(n>=Vertical_boxs)continue; /*超过低线了*/ for(m=0;m { if(Table_board[n][m].var) setfillstyle(SOLID_FILL,Table_board[n][m].color);/*Table_board[n][m].color*/ else setfillstyle(SOLID_FILL,BgColor); bar(x,y,x+BSIZE,y+BSIZE); line(x,y,x+BSIZE,y); line(x,y,x,y+BSIZE); line(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE); x+=BSIZE; } y+=BSIZE; x=oldx; } ShowScore(score); if(speed!=score/speed_step) {speed=score/speed_step; ShowSpeed(speed);} else {ShowSpeed(speed);} } } * 将新形状的方块放置在游戏板上,并返回此方块号 */ int MkNextBox(int box_numb) { int mask=128,t_boardx,t_boardy,n,m; t_boardx=(Curbox_x-Sys_x)/BSIZE; t_boardy=(Curbox_y-Sys_y)/BSIZE; for(n=0;n<4;n++) { for(m=0;m<4;m++) { if( ((shapes[current_box_numb].box[n/2]) & mask) ) { Table_board[t_boardy+n][t_boardx+m].var=1;/*这里设置游戏板*/ Table_board[t_boardy+n][t_boardx+m].color=shapes[current_box_numb].color;/*这里设置游戏板*/ } mask=mask/(2); if(mask==0)mask=128; } } setFullRow(t_boardy); Curbox_x=Sys_x+Begin_boxs_x*BSIZE,Curbox_y=Sys_y;/*再次初始化座标*/ if(box_numb==-1) box_numb=rand()%MAX_BOX; current_box_numb=box_numb; flag_newbox=false; return(rand()%MAX_BOX); } /* * 擦除(x,y)位置开始的编号为box_numb的box. */ void EraseBox(int x,int y,int box_numb) { int mask=128,t_boardx,t_boardy,n,m; setfillstyle(SOLID_FILL,BgColor); for(n=0;n<4;n++) { for(m=0;m<4;m++) /*看最左边四个单元*/ { if( ((shapes[box_numb].box[n/2]) & mask) )/*最左边有方块并且当前游戏板也有方块*/ { bar(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE); line(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE); line(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE,y+n*BSIZE+BSIZE); line(x+m*BSIZE,y+n*BSIZE+BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE); line(x+m*BSIZE+BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE); } mask=mask/(2); if(mask==0)mask=128; } } } void ErasePreBox(int x,int y,int box_numb) { int mask=128,t_boardx,t_boardy,n,m; setfillstyle(SOLID_FILL,BgColor); for(n=0;n<4;n++) { for(m=0;m<4;m++) /*看最左边四个单元*/ { if( ((shapes[box_numb].box[n/2]) & mask) )/*最左边有方块并且当前游戏板也有方块*/ { bar(x+m*BSIZE,y+n*BSIZE,x+m*BSIZE+BSIZE,y+n*BSIZE+BSIZE); } mask=mask/(2); if(mask==0)mask=128; } } } /* 判断是否可以移动 * x,y为当前方块位置 * box_numb为方块号 * direction 方向标志 * 返回true 和false #define MoveLeft -1 #define MoveRight 1 #define MoveDown 0 */ int MoveAble(int x,int y,int box_numb,int direction) { int n,m,t_boardx,t_boardy; /*t_boardx 当前方块最左边在游戏板的位置*/ int mask; if(direction==MoveLeft) /*如果向左移*/ { mask=128; x-=BSIZE; t_boardx=(x-Sys_x)/BSIZE; t_boardy=(y-Sys_y)/BSIZE; for(n=0;n<4;n++) { for(m=0;m<4;m++) /*看最左边四个单元*/ { if((shapes[box_numb].box[n/2]) & mask)/*最左边有方块并且当前游戏板也有方块*/ { if((x+BSIZE*m) else if(Table_board[t_boardy+n][t_boardx+m].var) /*左移一个方块后,此4*4的区域与游戏板有冲突*/ { return(false); } } mask=mask/(2); if(mask==0)mask=128; } } return(true); } else if(direction==MoveRight) /*如果向右移*/ { x+=BSIZE; t_boardx=(x-Sys_x)/BSIZE; t_boardy=(y-Sys_y)/BSIZE; mask=128; for(n=0;n<4;n++) { for(m=0;m<4;m++) /*看最右边四个单元*/ { if((shapes[box_numb].box[n/2]) & mask)/*最右边有方块并且当前游戏板也有方块*/ { if((x+BSIZE*m)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false);/*碰到最右边了*/ else if( Table_board[t_boardy+n][t_boardx+m].var) { return(false); } } mask=mask/(2); if(mask==0)mask=128; } } return(true); } else if(direction==MoveDown) /*如果向下移*/ { y+=BSIZE; t_boardx=(x-Sys_x)/BSIZE; t_boardy=(y-Sys_y)/BSIZE; mask=128; for(n=0;n<4;n++) { for(m=0;m<4;m++) /*看最下边四个单元*/ { if((shapes[box_numb].box[n/2]) & mask)/*最下边有方块并且当前游戏板也有方块*/ { if((y+BSIZE*n)>=(Sys_y+BSIZE*Vertical_boxs) || Table_board[t_boardy+n][t_boardx+m].var) { flag_newbox=true; break; } } mask=mask/(2); /*mask依次为:10000000,01000000,00100000,00010000 00001000,00000100,00000010/00000001 */ if(mask==0)mask=128; } } if(flag_newbox) { return(false); } else return(true); } else if(direction==MoveRoll) /*转动*/ { t_boardx=(x-Sys_x)/BSIZE; t_boardy=(y-Sys_y)/BSIZE; mask=128; for(n=0;n<4;n++) { for(m=0;m<4;m++) /*看最下边四个单元*/ { if((shapes[box_numb].box[n/2]) & mask)/*最下边有方块并且当前游戏板也有方块*/ { if((y+BSIZE*n)>=(Sys_y+BSIZE*Vertical_boxs) )return(false);/*碰到最下边了*/ if((x+BSIZE*n)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false);/*碰到最左边了*/ if((x+BSIZE*m)>=(Sys_x+BSIZE*Horizontal_boxs) )return(false);/*碰到最右边了*/ else if( Table_board[t_boardy+n][t_boardx+m].var) { return(false); } } mask=mask/(2); if(mask==0)mask=128; } } return(true); } else { return(false); } } /* *显示指定的方块 */ void show_box(int x,int y,int box_numb,int color) { int i,ii,ls_x=x; if(box_numb<0 || box_numb>=MAX_BOX)/*指定的方块不存在*/ box_numb=MAX_BOX/2; setfillstyle(SOLID_FILL,color); /********************************* * 移位来判断第哪一位是1 * 方块是每1行用半个字节来表示 * 128d=1000 0000b *********************************/ for(ii=0;ii<2;ii++) { int mask=128; for(i=0;i<8;i++) { if(i%4==0 && i!=0) /*表示转到方块的下一行了*/ { y+=BSIZE; x=ls_x; } if((shapes[box_numb].box[ii])&mask) { bar(x,y,x+BSIZE,y+BSIZE); line(x,y,x+BSIZE,y); line(x,y,x,y+BSIZE); line(x,y+BSIZE,x+BSIZE,y+BSIZE); line(x+BSIZE,y,x+BSIZE,y+BSIZE); } x+=BSIZE; mask/=2; } y+=BSIZE; x=ls_x; } } void main() { int GameOver=0; int key,nextbox; int Currentaction=0;/*标记当前动作状态*/ int gd=VGA,gm=VGAHI,errorcode; initgraph(&gd,&gm,""); errorcode = graphresult(); if (errorcode != grOk) { printf("\nNotice:Graphics error: %s\n", grapherrormsg(errorcode)); printf("Press any key to quit!"); getch(); exit(1); } setbkcolor(BgColor); setcolor(FgColor); randomize(); SetTimer(newtimer); initialize(Sys_x,Sys_y,Horizontal_boxs,Vertical_boxs);/*初始化*/ nextbox=MkNextBox(-1); show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); show_box(LeftWin_x,Curbox_y+200,nextbox,shapes[nextbox].color); show_intro(Sys_x,Curbox_y+320); getch(); while(1) { /* Currentaction=0; flag_newbox=false; 检测是否有按键*/ if (bioskey(1)){key=bioskey(0); } else { key=0; } switch(key) { case VK_LEFT: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveLeft)) {EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x-=BSIZE;Currentaction=Move Left;} break; case VK_RIGHT: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveRight)) {EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_x+=BSIZE;Currentaction=Move Right;} break; case VK_DOWN: if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)) {EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE;Currentaction=Move Down;} else flag_newbox=true; break; case VK_UP:/*旋转方块*/ if(MoveAble(Curbox_x,Curbox_y,shapes[current_box_numb].next,MoveRoll)) {EraseBox(Curbox_x,Curbox_y,current_box_numb);current_box_numb=shapes[current_bo x_numb].next; Currentaction=MoveRoll; } break; case VK_ESC: GameOver=1; break; default: break; } if(Currentaction) { /*表示当前有动作,移动或转动*/ show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); Currentaction=0; } /*按了往下键,但不能下移,就产生新方块*/ if(flag_newbox) { /*这时相当于方块到底部了,把其中出现点满一行的清去,置0*/ ErasePreBox(LeftWin_x,Sys_y+200,nextbox); nextbox=MkNextBox(nextbox); show_box(LeftWin_x,Curbox_y+200,nextbox,shapes[nextbox].color); if(!MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown))/*刚一开始,游戏结束*/ { show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); GameOver=1; } else { flag_newbox=false; } Currentaction=0; } else /*自由下落*/ { if (Currentaction==MoveDown || TimerCounter> (20-speed*2)) { if(MoveAble(Curbox_x,Curbox_y,current_box_numb,MoveDown)) { EraseBox(Curbox_x,Curbox_y,current_box_numb);Curbox_y+=BSIZE; show_box(Curbox_x,Curbox_y,current_box_numb,shapes[current_box_numb].color); } TimerCounter=0; } } if(GameOver )/*|| flag_newbox==-1*/ { printf("game over,thank you! your score is %d",score); getch(); break; } } getch(); KillTimer(); closegraph(); } /*学无止境*/ #include void Init(); void Down(); void GoOn(); void ksdown(); void Display(int color); void Give(); int Touch(int x,int y,int dx,int dy); int GeyKey(); void Select(); void DetectFill(); void GetScores(); void Fail(); void Help(); void Quit(); void DrawBox(int x,int y,int Color); void OutTextXY(int x,int y,char *String); void DispScore(int x,int y,char Ch); void DrawNext(int Color); int Heng=12,Shu=20; /*横竖*/ int Position[MAX][MAX]; int middle[MAX][MAX]; int ActH,ActS; 课程设计 俄罗斯方块改进 2016年4月20 日 设计题目 学号 专业班级 学生姓名 指导教师 目录 1. 课程设计目的错误!未定义书签。 2. 功能分析错误!未定义书签。 3. 程序设计实现过程错误!未定义书签。 程序总体设计结构错误!未定义书签。 界面设计错误!未定义书签。 重要数据的数据结构设计错误!未定义书签。函数设计错误!未定义书签。 4. 运行效果错误!未定义书签。 5. 源代码详解错误!未定义书签。 6. 参考文献错误!未定义书签。 俄罗斯方块改进 1. 课程设计问题 据百度百科,俄罗斯方块(Tetris)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。游戏的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。 要求支持键盘操作和7种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,消去一行所得到的分数越高,为玩家提供了不同的选择。 2. 功能分析 俄罗斯方块游戏需要解决的问题包括: ⑴按任意键开始游戏,随机产生方块并自动下移 ⑵用Esc键退出游戏。 ⑶用键变换方块 ⑷用键和键左右移动方块 ⑸用键使方块加速下移 ⑹用空格键使方块暂停 ⑺能正确判断满行并消行、计分、定级别 ⑻设定游戏方块为不同形状重点: *游戏面包的数据结构:二维数组 *7种形状方块的数据结构:结构体保存每种形状方块的坐标 3. 程序设计实现过程 程序总体设计结构 首先初始化进入图形模式,进入欢迎界面,玩家按任意进入主菜单界面,按键进入游戏界面,键然后设置新的时钟中断。开始游戏后,进入该程序最核心的部分——处理和实现进行过程中的各种事件和函数。在处理中判断游戏是否结束,如果没有结束,则重新开始游戏,否则结束游戏。 详解如下: (1)游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。 【转载】88行代码实现俄罗斯方块游戏(含讲解) 来源:https://www.doczj.com/doc/f98306297.html,/p/8 在正式阅读本文之前,请你记得你应该用娱乐的心态来看, 本代码所使用到的技巧,在工作了的人眼里会觉得很纠结,很蛋疼,很不可理喻,很丑, 注意,是你蛋疼,不关我的事 通常,写一个俄罗斯方块,往往动不动就几百行,甚至上千行,而这里只有88行 正所谓头脑风暴,打破常规。这里将使用很多不平常的手段来减少代码 以下是Win-TC可以成功编译并执行的代码(代码保证单行长度不超过80字符,如果你是Win7系统,那请看后文): 程序代码: #include"graphics.h" #include 1、新建“.h”头文件,将“头文件” 代码粘贴至其中, 2、新建“.c”源文件,将“源代码” 代码粘贴到其中。 3、新建空白工程,将头文件和源代码 添加进去,调试使用。 //头文件 //1.自定义枚举类型,定义7种形态的游戏方块 typedef enum tetris_shape { ZShape=0, SShape, LineShape, TShape, SquareShape, LShape, MirroredLShape }shape; //2.函数声明 //(1)操作方块函数 int maxX();//取得当前方块的最大x坐标 int minX();//取得当前方块的最小x坐标 void turn_left();//当前方块逆时针旋转90度 void turn_right(); int out_of_table(); void transform(); int leftable(); int rightable(); int downable(); void move_left(); void move_right(); //(2)操作游戏桌面的函数 int add_to_table(); void remove_full(); //(3)控制游戏函数 void new_game(); void run_game(); void next_shape(); int random(int seed); //(4)绘图函数 void paint(); void draw_table(); //(5)其他功能函数 void key_down(WPARAM wParam); void resize(); void initialize(); void finalize(); //(6)回调函数,用来处理Windows消息 LRESULT CALLBACK WndProc (HWND,UINT,WPARAM,LPARAM); //源代码 //1.文件包含 #include C语言课程设计报告 俄罗斯方块程序设计报告 一、问题描述 俄罗斯方块(Tetris,俄文:Тетрис)是一款电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。 在本次设计中,要求支持键盘操作和若干种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,为玩家提供了不同的选择。 二、功能分析 I、俄罗斯方块游戏需要解决的问题包括: ⑴、随机产生方块并自动下移 ⑵、用Esc键退出游戏 ⑶、用键变体 ⑷、用键和键左右移动方块 ⑸、用空格键使游戏暂停 ⑹、能正确判断满行并消行、计分、定级别 ⑺、设定游戏为不同级别,级别越高难度越大 II、俄罗斯方块游戏需要设计的功能函数包括: ⑴、声明俄罗斯方块的结构体 ⑵、函数原型声明 ⑶、制作游戏窗口 ⑷、制作俄罗斯方块 ⑸、判断是否可动 ⑹、随机产生俄罗斯方块类型的序号 ⑺、打印俄罗斯方块 ⑻、清除俄罗斯方块的痕迹 ⑼、判断是否满行并删除满行的俄罗斯方块 三、程序设计 1、程序总体结构设计 (1)、游戏方块预览功能。在游戏过程中,游戏界面右侧会有预览区。由于在此游戏中存在多种不同的游戏方块,所以在游戏方块预览区域中显示随机生成的游戏方块有利于游戏玩家控制游戏的策略。 (2)、游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、自由下落、旋转功能,以及行满消除行的功能。 (3)、游戏数据显示功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。例如,消除一行加100分,游戏分数达到一定数量 来如鹏挺长时间了,受益很多希望更多的朋学加入进来 做俄罗斯方块是因为无意中在杨老师的帖子看到说最少也要能做出俄罗斯方块这样的东西出来,我想这个意思能做出俄罗斯方块就说明水平到了一个层次了吧。 刚才注意到音乐播放器居然下载超过400次!我反醒我上传的代码很少解释 而且做的都是没有趣味的东西。 俄罗斯方块如鹏已经有好几个同学做出来了,但是我想还有很多同学做不出来,我抛砖引玉,其实俄罗斯方块并不复杂 今天先告诉大家第一步, 在屏幕上把方块显示出来 cfree 新建一个工程选窗口程序显示helloworld的 win32的 api 图形函数都要用到 HDC 这是一个保存窗口图形的数据的句柄 比如我要画一个正方形可以用 Rectangle (hdc,标X,左上角坐标y,右下角坐标x,右下角坐标y); 为了方便我们直接在 switch (message) { case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // 这个下面添加代码 Rectangle (hdc,50,50,100,100); 然后编译运行 这是效果就是一个正方形没别的东西?别着急哈,慢慢来。 俄罗斯方块每块都是四部分的所以要画4个 这里面需要一小点数学知识 把这些复制到刚才的位置看一下效果 { int x,y; const int size=50;//方块大小 x=y=50;//从窗口的左上角位置开始画 //第一个方块 Rectangle (hdc,x,y,x+size,y+size); x+=size; //向右一块位置画第二个方块 Rectangle (hdc,x,y,x+size,y+size); x+=size; //向右一块位置画第三个方块 Rectangle (hdc,x,y,x+size,y+size); //最后一个方块 //相对于第三个方块左下角的位置 x-=50;y-=50; Rectangle (hdc,x,y,x+size,y+size); } 这个画好像很麻烦我们可以自定义一个函数huafangkuai 专门负责画这个正方形以后所有的其他函数也必须经过他才能画正方形 这个类似于win32 api的封装思想 void huafangkuai(int x,int y,int color); x y是方块的坐标color 就是color 函数原理是x y 是相对于游戏里的坐标而不是屏幕坐标 屏幕坐标要经过函数自己转换这样我们就可以把心关注在游戏的事情而不必分心了void huafangkuai(HDC hdc,int x,int y,int color) { const int BEGINX= 50;//游戏图形的开始位置 const int BEGINY= 50 ; const int FSIZE= 35 ; //方块大小 int screenx=BEGINX +x*FSIZE; //方块左上角的坐标是x乘方块大小再加上起始位置 int screeny=BEGINY +y*FSIZE; Rectangle (hdc,screenx,screeny,screenx+FSIZE,screeny+FSIZE); } 这样我们再画就四个就容易多了 color 先不管 int x,y; x=5;y=5; huafangkuai(hdc,x,y,0); huafangkuai(hdc,x+1,y,0); huafangkuai(hdc,x+2,y,0); ````````` 学院:数计学院 班级:13级数媒班 学号: 姓名: 摘要 …………………………………………………………………………………………………….. 关键字: 目录 第一部分设计总概........................................................................................................................... 摘要………………………………………………………………………………………………… 一、设计目的............................................................................................................................. 二、设计要求............................................................................................................................. 三、设计内容............................................................................................................................. 四、系统分析与设计................................................................................................................. 第二部分数据结构设计................................................................................................................... 第三部分功能实现与程序调试………………………………………………………………….第四部分完成设计........................................................................................................................... 一、实习日记............................................................................................................................. 二、实习总结............................................................................................................................. 三、教师评语............................................................................................................................. 四、程序使用说明书…………………………………………………………………………. 第一部分设计总概 一、设计目的 二、设计要求 三、设计内容 四、系统分析与设计 其中的主要逻辑有: (1)由于c的随机性函数不好,所以每次游戏开始根据bios时间设置种子。 (2)得分越高,方块下降速度越快(每200分为单位)。 (3)每下落一个方块加1分,每消除一行加10分,两行加30分,三行加70分,四行加150分。初试分数为100分。 游戏控制: up-旋转;空格-下落到底;左右下方向键-控制方向。P-开始或暂停游戏。ESC-退出。 特点: (1)由于tc不支持中文,所以基本都是英文注释。 (2)函数命名尽可能规范的表达其内部处理目的和过程。 (3)代码加上注释仅有577行。(我下载过的两个俄罗斯方块代码一个在1087行,一个在993行,我的比它们代码少)。 (4)除了消除空格时算法比较复杂,其他算法都比较简单易读。 (5)绘图效率和局部代码效率扔有待提高。 (6)FrameTime参数可能依据不同硬件环境进行具体设置,InitGame需要正确的TC路径。 俄罗斯方块源于大约9年前上大一时的一个梦,我们在学习c语言时,我的同寝室友邀请我合作一起完成俄罗斯方块(课外作业性质),但是当时限于我们的水平比较菜和学习状态比较懒散,我们没有完成。大一的时候我在机房里无意发现别人留下的俄罗斯方块程序,运行,老师发现后激动的问我是我写的吗,我惭愧的摇摇头。那时看到别人做c的大程序深感羡慕(自己只是写几十行的程序)。数年后我仍然看到有不同样式的实现,但是我一直没有实现它,知道今天忽然有这个想法去做,算是弥补多年前的遗憾和心愿吧。 --------------------------------------------- Q&A: ---------------------------------------------- Q:我编译时出现错误:fatal error C1083: Cannot open include file: 'bios.h': Nosuch file or directory,该如何解决? A:正文中的代码,是使用Borland公司的TC2.0编译的,编译结果运行在Windows的16位虚拟机上。bi os.h是属于TC的头文件,在VC或者其他编译器中可能没有这个头文件。因此会产生这个错误。 解决办法: (1)可以下载附件中的压缩包,是使用VC6.0进行编译的版本,编译结果是Windows程序,运行在wind ows 32系统上。两者之间的算法完全一致,区别仅仅是绘图时采用的接口不同,TC下采用BGI(进入图形模式),VC下采用的是GDI(使用DC进行绘图)。 (2)下载TC2.0进行编译。 Q:使用TC3.0进行编译时,提示未能初始化图形模式,请使用initgraph函数。 A:这是因为TC3.0的BGI文件的路径和TC2.0有所不同。TC2.0的BGI文件位于TC路径下。而TC3.0的BGI文件位于BGI文件夹中。请把initgame函数中的initgraph函数中的第三个参数设置为正确的路径。例如:initgraph(&..,&..,"C:\\TC\\BGI"); Q:编译后运行时,弹出错误对话框报告16位虚拟机遇到不可执行的指令,点击确定后退出。 A:该问题在某些环境中出现,可能是基于软件或者硬件环境造成,具体原因暂时未知。为避免该问题,请加载附件中的压缩包VC6.0版本。 /*学无止境*/ #include <> #include <> #include <> #define ESC 27 #define UP 328 #define DOWN 336 #define LEFT 331 #define RIGHT 333 #define BLANK 32 #define BOTTOM 2 #define CANNOT 1 #define CAN 0 #define MAX 30 #define F1 315 #define ADD 43 #define EQUAL 61 #define DEC 45 #define SOUNDs 115 #define SOUNDS 83 #define PAUSEP 80 #define PAUSEp 112 void Init(); void Down(); void GoOn(); void ksdown(); void Display(int color); void Give(); int Touch(int x,int y,int dx,int dy); int GeyKey(); void Select(); void DetectFill(); void GetScores(); void Fail(); void Help(); void Quit(); void DrawBox(int x,int y,int Color); void OutTextXY(int x,int y,char *String); void DispScore(int x,int y,char Ch); void DrawNext(int Color); int Heng=12,Shu=20; /*横竖*/ int Position[MAX][MAX]; int middle[MAX][MAX]; int ActH,ActS; #include #include C语言之游戏 俄罗斯方块课程设计报告 专业:[] 学生姓名:[] 指导教师:[] 完成时间: 目录 一、需求分析 ................................. 错误!未定义书签。 二、概要设计 ................................. 错误!未定义书签。 三、详细设计 ................................. 错误!未定义书签。 四、调试分析 (19) 五、用户手册 (20) 六、测试数据 ................................. 错误!未定义书签。 七、附录..................................... 错误!未定义书签。 一、需求分析 1.该程序是完成一个简易的俄罗斯方块的任务,其要完成几个重要的功能:界面,方块下落,旋转,判断是否还能下落,左右移动,分数,速度设置,清楚满的每行,下个方块的预览等; 2.可用#include 课程名称《数据结构》课程设计指导老师 所在学院 专业年级 提交日期 成绩 小组成员表 课程设计实验 一、需求分析 我们对俄罗斯方块这个游戏一点也不陌生,知道游戏的玩法和实现后,我们很快就着手开干。游戏要有出现场景、方块、消除方块得分、判断游戏结束等几个大功能。结构清晰简洁便于分工。 二、算法原理介绍 游戏主要使用了数组这个数据结构。不过与以往的程序不同,这个游戏有一个大数组包含很多个小数组,大数组不断的吸收小数组内的元素,达到条件得分。 三、概要设计 1、功能块各函数列表 2、场景的设置 int map[28][17]={ {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1}, {0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1}, {0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1}, {0,1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,1,1}, {0,1,1,0,0,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,0,0,1,1}, {0,1,1,0,0,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,0,0,1,1}, {0,1,1,0,0,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,0,0,1,1}, {0,1,1,0,0,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,0,0,1,1}, {0,1,1,0,0,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,0,0,1,1}, {0,1,1,0,0,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,0,0,1,1}, {0,1,1,0,0,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,0,0,1,1}, {0,1,1,0,0,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,0,0,1,1}, {0,1,1,0,0,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,0,0,1,1}, {0,1,1,0,0,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,0,0,1,1}, {0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}, {0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1} }; void showmap() { int i,j; for(i=5;i<28;i++) { for(j=1;j<17;j++) { gotoxy(2*j,i); if(j==1||j==2||j==15||j==16) {printf("┃");} else if(i==26||i==27) {printf("━");} else if(map[i][j]==1) printf("■"); else if(map[i][j]==0) printf("□"); } } } 一个c语言写的俄罗斯方块的代码#include <stdlib.h> #include <graphics.h> #include <bios.h> #define mDRAW 5 #define mLINE 6 #define mADOWN 7 #define mGEN 8 #define mLEFT 75 #define mRIGHT 77 #define mSPACE 57 #define mESC 1 #define TIMEINT 2 #define MAXX 9 #define MAXY 30 #define BACKCOLOR BLACK #define WINX 50 #define WINY 470 #define GAP 6 #define AREAX (WINX+GAP) #define AREAY (WINY-GAP) int oldarea[MAXY+1][MAXX]; int area[MAXY+1][MAXX]; int actW,actH,actX,actY; int curX,curY,curColor,curW,curH; int newX,newY,newColor,newW,newH; int active; int box[4][4]; int FORCOLOR; int MESSAGE; int BOX[7][4][4]={ { {1,1,1,1}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0} },{ {1,1,1,0}, {1,0,0,0}, {0,0,0,0}, {0,0,0,0} },{ > #include <> #include <> #include <> __cplusplus #define __CPPARGS ... #else #define __CPPARGS #define MINBOXSIZE 15 /* 最小方块的尺寸*/ #define BGCOLOR 7 /* 背景着色*/ #define GX 200 #define GY 10 #define SJNUM 10000 /* 每当玩家打到一万分等级加一级*/ /* 按键码*/ #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 /* 定义俄罗斯方块的方向(我定义他为4种)*/ #define F_DONG 0 #define F_NAN 1 #define F_XI 2 #define F_BEI 3 #define NEXTCOL 20 /* 要出的下一个方块的纵坐标*/ #define NEXTROW 12 /* 要出的下一个方块的横从标*/ #define MAXROW 14 /* 游戏屏幕大小*/ #define MAXCOL 20 #define SCCOL 100 /*游戏屏幕大显示器上的相对位置*/ #define SCROW 60 int gril[22][16]; /* 游戏屏幕坐标*/ int col=1,row=7; /* 当前方块的横纵坐标*/ int boxfx=0,boxgs=0; /* 当前寺块的形壮和方向*/ int nextboxfx=0,nextboxgs=0,maxcol=22;/*下一个方块的形壮和方向*/ int minboxcolor=6,nextminboxcolor=6; int num=0; /*游戏分*/ int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/* 游戏等级*/ /* 以下我用了一个3组来纪录方块的最初形状和方向*/ int boxstr[7][4][16]={{ C语言课程设计报告 主标题: C语言课程设计 副标题:俄罗斯方块游戏 ----界面设计 姓名:卢文俊 指导教师:刘慧 院系:信息工程学院 专业:计算机科学与技术 班级: 11计本(二)班 小组成员:卢文俊,齐伟,陈龙 提交日期: 2012-6-7 俄罗斯方块程序设计报告 一、问题描述: 要求支持键盘操作和7种不同类型方块的旋转变换,并且界面上显示下一个方块的提示以及当前的玩家的得分,随着游戏的进行,等级越高,游戏难度越大,即方块的下落速度越快,相应的等级,等级越高,消去一行所得到的分数越高,为玩家提供了不同的选择。 二、功能分析: 俄罗斯方块游戏需要解决的问题包括: ⑴按任意键开始游戏,随机产生方块并自动下移 ⑵用Esc键退出游戏。 ⑶用键变换方块 ⑷用键和键左右移动方块 ⑸用键使方块加速下移 ⑹用空格键使方块直接下移 ⑺能正确判断满行并消行、计分、定级别 ⑻能正确计时 ⑼设定游戏为不同级别,级别越高难度越大 重点: *游戏面包的数据结构:二维数组 *7种形状方块的数据结构:结构体保存每种形状方块的坐标、颜色 三、程序设计: 1、程序总体设计结构:首先初始化进入图形模式,进入欢迎界面,玩家按 任意进入主菜单界面,按键进入游戏界面,键然后设置新的时钟中断。开始游戏后,进入该程序最核心的部分——处理和实现进行过程中的各种事件和函数。在处理中判断游戏是否结束,如果没有结束,则重新开始游戏,否则结束游戏。详解如下: (1)、游戏方块预览功能。在游戏过程中,当在游戏底板中出现一个游戏方块时,必须在游戏方块预览区域中出现下一个游戏方块,这样有利于游戏玩家控制游戏的策略。由于在此游戏中存在19种不同的游戏方块,所以在游戏方块预览区域中需要显示随机生成的游戏方块。 (2)、游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、快速下移、自由下落、旋转功能,以及行满消除行的功能。 俄罗斯方块游戏 初始化图形模式 (欢迎界面) 进入菜单选项 开 始新游戏游 戏 帮 助 游 戏 说 明 退 出 游 戏 游 戏 排 名 开始游戏 C语言编写的《俄罗斯方块》详解.txt铁饭碗的真实含义不是在一个地方吃一辈子饭,而是一辈子到哪儿都有饭吃。就算是一坨屎,也有遇见屎壳郎的那天。所以你大可不必为今天的自己有太多担忧。335280641 Tc2.0 编写俄罗斯方块游戏 很多编程爱好者都编写过俄罗斯方块的游戏程序。很久以前,我用Tc2.0也做过一个;最近有好些朋友看见我以前的俄罗斯方块的程序后, 问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。正好现在放假了, 而且离回家还有几天。于是我就把这个程序重新写了一遍,尽量使程序的结构比较清晰好懂一些。同时写了下面的这份东西。 俄罗斯方块游戏的程序中用到了一些方法。为了比较容易理解这些方法,我在讲述的同时写了些专门针对这些方法的示例程序。 这些示例程序力求短小,目的是用最小的代码能够清楚的示例所用的方法。这些示例程序都经过tc2.0测试。 最后还附了完整的俄罗斯方块游戏的源代码,和最终的可执行程序。如果你看了这份东东,有什么意见和想法,请发电子邮件告诉我。 我将会继续更新这分东东,最新的版本可以在我的个人主页上下载。 下面的问题是有关俄罗斯方块程序的,其中有些是朋友问我的,有些是我认为可能会被问到的。我尽量按问题从易到难排列这些问题。 关于俄罗斯方块程序的一些问题: ****************************************************** Tc2.0中怎么样设置图形显示? Tc2.0中常用图形函数的用法? 怎样获取鍵盘输入? 怎样控制方块的移动? 怎样控制时间间隔(用于游戏中控制形状的下落)? 游戏中的各种形状及整个游戏空间怎么用数据表示? 游戏中怎么判断左右及向下移动的可能性? 游戏中怎么判断某一形状旋转的可能性? 按向下方向键时加速某一形状下落速度的处理? 怎么判断某一形状已经到底? 怎么判断某一已经被填满? 怎么消去已经被填满的一行? 怎么消去某一形状落到底后能够消去的所有的行?(如长条最多可以消去四行) 怎样修改游戏板的状态? 怎样统计分数? 怎样处理升级后的加速问题? 怎样判断游戏结束? 关于计分板设计的问题。 关于“下一个”形状取法的问题。 C语言课程设计报告 I、俄罗斯方块游戏需要解决的问题包括: ⑴、随机产生方块并自动下移 ⑵、用Esc键退出游戏 ⑶、用键变体 ⑷、用键和键左右移动方块 ⑸、用空格键使游戏暂停 ⑹、能正确判断满行并消行、计分、定级别 ⑺、设定游戏为不同级别,级别越高难度越大 II、俄罗斯方块游戏需要设计的功能函数包括: ⑴、声明俄罗斯方块的结构体 ⑵、函数原型声明 ⑶、制作游戏窗口 (2)、游戏方块控制功能。通过各种条件的判断,实现对游戏方块的左移、右移、自由下落、旋转功能,以及行满消除行的功能。 (3)、游戏数据显示功能。在游戏玩家进行游戏过程中,需要按照一定的游戏规则给玩家计算游戏分数。例如,消除一行加100分,游戏分数达到一定数量 之后,需要给游戏者进行等级的上升,每上升一个等级,游戏方块的下落速度将加快,游戏的难度将增加。以上游戏数据均会在游戏界面右侧显示以提示玩家。 (4)、游戏信息提示功能。玩家进入游戏后,将有对本游戏如何操作的友情提示。 (5)、游戏结束退出功能。判断游戏结束条件,通过Esc键进行退出。 游戏是否结束 是 关闭游戏界面返回程序 游戏执行主流程图 2、界面设计 分为左右两个部分: *左边为游戏面板 *右边有三部分:游戏数据提示框、下一个方块提示框和功能提示框 3、重要功能函数设计 1)、声明俄罗斯方块的结构体 struct Tetris { int x; //中心方块的x轴坐标 int y; //中心方块的y轴坐标 int flag; //标记方块类型的序号 int next; //下一个俄罗斯方块类型的序号 void del_full(HANDLE hOut,struct Tetris *); //开始游戏 void start_game(); 3)、制作游戏窗口 void make_frame() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); //定义显示器句柄变量gotoxy(hOut,FrameX+Frame_width-5,FrameY-2); //打印游戏名称C语言俄罗斯方块游戏源代码
C语言课程设计报告 俄罗斯方块改进版
俄罗斯方块C语言代码
C语言课程设计俄罗斯方块源代码
俄罗斯方块C语言程序设计报告
教你用c语言写俄罗斯方块
C语言编写俄罗斯方块实验报告
C语言程序设计-俄罗斯方块源程序
C语言俄罗斯方块游戏源代码
C语言俄罗斯方块(详解..)
c语言俄罗斯方块代码
c语言俄罗斯方块实验报告
c语言数据结构程序设计俄罗斯方块
一个c语言写的俄罗斯方块的代码
俄罗斯方块C语言代码
c语言俄罗斯方块游戏程序设计报告
C语言编写的《俄罗斯方块》详解
俄罗斯方块C语言程序设计报告