c语言 编写俄罗斯方块的程序 要求有详细的中文注释

作者&投稿:答玛 (若有异议请与网页底部的电邮联系)
用c语言编写俄罗斯方块程序 求详解~

1、用C语言绘制图形界面
EasyX图形库(http://www.easyx.cn)即TC的图形库在VC下的移植。
包含库#include
先初始化图形窗口
initgraph(WINDOW_WIDTH, WINDOW_HIGH) ;WINDOW_WIDTH为窗口的宽带,WINDOW_HIGH为窗口的高度。
清空绘图设备
cleardevice();
设置画笔颜色
setcolor(RED) ;
设置线条风格
setlinestyle(PS_SOLID, NULL, 0);
画矩形
rectangle
还有画线、显示文字等函数,可以参照其帮助文档。
注意:由于我们用的是EasyX图形库,故源文件后缀要为.cpp,但其中内容都是C的语法。
2、存储表示出俄罗斯方块的形状
一、我们可以用编号,不同的编号代表不同的俄罗斯方块,根据编号把不同方块的画法写在代码中,这样19种
方块就得有19种相应的代码来描绘。而且这样扩展性不好,若以后设计了新的方块,则需要更改大量源代码。
二、我们很自然的想到可用字模点阵的形式来表示,即设置一个4行4列的数组,元素置1即代表这个位置有小
方块,元素置0即代表这个位置无小方块,这个整个的4*4的数组组成俄罗斯方块的形状。
1000
1000
1100
0000

这个方法挺靠谱,但我们还可以优化一下:不用4*4的数组,而是用16个bit位来表示这个点阵。这样存储起来比较方便,故我们用unsigned int 的低16位来表示方块的点阵。
我们可以用掩码与表示俄罗斯方块的位进行操作,来识别并在屏幕上画出方块。

我们把俄罗斯方块点阵的数位存在rockArray中,我们可以事先把这19种方块的字模点阵自己转化成十六进制,然后在rockArray数组的初始化时赋值进去。
但这样做未免有点太费力,且扩展性也不太好,若以后设计的新方块种类加入,要改变数组rockArray中的值。
我们可以考虑把所有俄罗斯方块的点阵存储在配置文件中,在程序初始化时读取文件,把这些点阵转换成unsigned int的变量存储在rockArray中。
这样,以后我们增添新的方块形状只需要在配置文件中增加新的点阵即可。
@###
@###
@@##
#### (为使得看起来更醒目,我们用@表示1,用#表示0)
3、让图形动起来
在某位置处用函数DrawRock在屏幕上画出俄罗斯方块,然后再擦除掉(即用背景色在原位置处重绘一次方块),最后在下落的下一个位置处用函数DrawRock在屏幕上画出俄罗斯方块,如此循环,中间用计时器间隔一段时间以控制下落的速度。
同理,按下屏幕的左右键也是如此,只是在按下键盘时把方块的位置重新计算了。
那么按下上方向键时,如何让方块翻转呢?
我们在配置文件中就把方块的顺时针翻转形态放在了一起:
@###
@###
@@##
####
@@@#
@###
####
####
@@##
#@##
#@##
####
##@#
@@@#
####
####
我们每按一次上方向键改变一次方块的形状即可。若一直按上键,形状应该是循环地翻滚。
我们想到了循环链表的数据结构可实现这个效果。
可是我们若把这些一种类的方块的各种形态串成循环链表形式,那么每次重新生成方块时我们就难以随机地生成方块了。
故还是得用数组来存储,但又要有循环链表的功能,于是我们想到了静态循环链表。
我们用结构体来作为一个方块在rockArray中的元素
typedef struct ROCK
{ //用来表示方块的形状(每一个字节是8位,用每4位表示方块中的一行)
unsigned int rockShapeBits ;
int nextRockIndex ; //下一个方块,在数组中的下标
} RockType ;
这样,当我们按下上方向键时,把传入函数DrawRock中的rockIndex变为当前方块结构体中的nextRockIndex即可。
参考资料:C语言图形界面篇

需要在tc下

/*------------- Compile ------------------------------ */
/* [in os mode:] */
/* bgiobj egavga */
/* tlib lib\graphics.lib+egavga */
/* [in TC: ] */
/* make exe */
/*-------------------------------------------------------*/
#include
#include
#include
#define mDRAW 5
#define mLINE 6
#define mADOWN 7
#define mGEN 8
#define mLEFT 75
#define mRIGHT 77
#define mSPACE 57
#define mDOWN 80
#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)
#define BOXW 15

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}
},{
{1,1,1,0},
{0,0,1,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}
},{
{1,1,0,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}
}
};


void init();
void draw();
int genBox();
int getKey();
void lineFull();
int moveLeft();
int moveRight();
int moveDown();
int rotate();
int getW();
int getH();
void clearOldBox();
void putNewBox();
int collisionRotate(int box[][4]);
void getMessage();
void dispatchMessage();
int timeCome();
void fallDown();
int gameOver();

main()
{
int i;
init();
do
{
getMessage();
dispatchMessage();
}
while(!gameOver());

getch();
closegraph();
}

void getMessage()
{
if(MESSAGE) return;
if(timeCome())
{
MESSAGE=mADOWN;
return;
}
if(bioskey(1))
{
MESSAGE=bioskey(0)>>8;
return;
}
}

void dispatchMessage()
{
switch(MESSAGE)
{
case mLEFT: moveLeft();break;
case mRIGHT: moveRight();break;
case mADOWN: moveDown();break;
case mSPACE: rotate();break;
case mDOWN: fallDown(); break;
case mDRAW: draw();break;
case mLINE: lineFull();break;
case mGEN: genBox();break;
case mESC: closegraph(); exit(0);
default: MESSAGE=0;
}
}

void fallDown()
{
while(active)
{
moveDown(); draw();
}

MESSAGE=mLINE;
}

int timeCome()
{

static long tm, old;
tm=biostime(0,tm);
if(tm-old<TIMEINT) return 0;
else
{
old=tm; return 1;
}
}

void init()
{
int i,j,x1,y1,x2,y2;
int driver=DETECT, mode=0;
randomize();
registerbgidriver(EGAVGA_driver);
initgraph(&driver,&mode,"");
cleardevice();
setfillstyle(SOLID_FILL,BLUE);
bar(0,0,639,479);
x1=AREAX;
y1=AREAY-BOXW*MAXY;
x2=AREAX+MAXX*BOXW;
y2=AREAY;
rectangle(--x1,--y1,++x2,++y2);
setfillstyle(SOLID_FILL,BLACK);
bar(++x1,++y1,--x2,--y2);
y1=AREAY-MAXY*BOXW; y2=AREAY;
setcolor(DARKGRAY);
for(i=0;i<MAXX;i++)
{
x1=AREAX+i*BOXW;
line(x1,y1,x1,y2);
}

x1=AREAX; x2=x1+MAXX*BOXW;
for(j=0;j<MAXY;j++)
{
y1=AREAY-j*BOXW;
line(x1,y1,x2,y1);
}
for(j=0;j<MAXY;j++)
for(i=0;i<MAXX;i++)
area[j][i]=oldarea[j][i]=0;
actX=0; actY=0; actW=MAXX-1; actH=MAXY-1;
draw();
MESSAGE=mGEN;
}

int genBox()
{
int i,j,boxidx;
boxidx=random(7); FORCOLOR=random(7)+1;
for(j=0;j<4;j++)
for(i=0;i<4;i++)
box[j][i]=BOX[boxidx][j][i];
curW=getW(); curH=getH();
curX=(MAXX+curW)/2;
if(curX+curW>=MAXX)curX=MAXX-1-curW;
curY=MAXY-1-curH;
newX=curX; newY=curY; actX=curX;actY=curY;
actW=newW=curW; actH=newH=curH;
active=1;
if(collision(box)) return 0;
putNewBox();
draw(); MESSAGE=0;
return 1;
}

void lineFull()
{
int row,col, rowEnd,full,i,j;
rowEnd=newY+newH;
if(rowEnd>=MAXY-1) rowEnd=MAXY-2;
for(row=newY; row<=rowEnd;)
{
full=1;
for(col=0;col<MAXX;col++)
if(!area[row][col]){full=0; break;}
if(!full){++row; continue;}
for(j=row; j<MAXY-1;j++)
for(i=0;i<MAXX;i++)
area[j][i]=area[j+1][i];
actX=0;actY=row; actW=MAXX-1; actH=MAXY-1-row;
draw(); rowEnd--;
}
MESSAGE=mGEN;
}

void draw()
{
int row,col,x1,y1,x2,y2;
for(row=actY;row<=actY+actH;row++)
for(col=actX;col<=actX+actW;col++)
if(area[row][col]!=oldarea[row][col])
{
if(area[row][col]==0)
setfillstyle(SOLID_FILL,BACKCOLOR);
else
setfillstyle(SOLID_FILL,FORCOLOR);

x1=AREAX+col*BOXW; x2=x1+BOXW;
y1=AREAY-(row+1)*BOXW; y2=y1+BOXW;
bar(++x1,++y1,--x2,--y2);
oldarea[row][col]=area[row][col];
}

MESSAGE=0;
}

int moveLeft()
{
newX=curX-1; clearOldBox();
if(collision(box))
{
newX=curX;
putNewBox();
MESSAGE=0;
return 0;
}
putNewBox();
actW=curW+1; actX=curX=newX;
MESSAGE=mDRAW;
return 1;
}

int moveRight()
{
newX=curX+1; clearOldBox();
if(collision(box))
{
newX=curX;
putNewBox();
MESSAGE=0;
return 0;
}
putNewBox();
actW=curW+1; actX=curX; curX=newX;
MESSAGE=mDRAW;
return 1;
}

int moveDown()
{
int i,j;
newY=curY-1;
clearOldBox();
if(collision(box))
{
newY=curY;
putNewBox();
active=0;
MESSAGE=mLINE;
return 0;
}
putNewBox();
actH=curH+1; actY=newY; curY=newY;
MESSAGE=mDRAW;
return 1;
}

int rotate()
{
int newBox[4][4];
int i,j;
clearOldBox();

for(j=0;j<4;j++)
for(i=0;i<4;i++)
newBox[j][i]=0;

for(j=0;j<4;j++)
for(i=0;i<4;i++)
newBox[curW-i][j]=box[j][i];
newW=curH; newH=curW;
if(collisionRotate(newBox))
{
newW=curW; newH=curH; newX=curX; newY=curY;
putNewBox();
MESSAGE=0;
return 0;
}

for(j=0;j<4;j++)
for(i=0;i<4;i++)
box[j][i]=newBox[j][i];
putNewBox();
actH=newH>curH? newH:curH;
actW=curX+actH-newX;
actX=newX; actY=newY; curX=newX;
curY=newY; curW=newW; curH=newH;
MESSAGE=mDRAW;
return 1;
}

int getW()
{
int i,j;
for(i=3;i>0;i--)
for(j=0;j<4;j++)
if(box[j][i]) return i;
return 0;
}

int getH()
{
int i,j;
for(j=3;j>0;j--)
for(i=0;i<4;i++)
if(box[j][i]) return j;
return 0;
}


void clearOldBox()
{
int i,j;
for(j=0;j<=curH; j++)
for(i=0;i<=curW; i++)
if(box[j][i])
area[curY+j][curX+i]=0;
}

void putNewBox()
{
int i,j;
for(j=0;j<=newH;j++)
for(i=0;i<=newW;i++)
if(box[j][i])
area[newY+j][newX+i]=FORCOLOR;
}

int collision(int cbox[][4])
{
int i,j;
if(newX<0) return 1;
if(newX+newW>=MAXX) return 1;
if(newY<0) return 1;
for(j=0;j<=newH;j++)
for(i=0;i<=newW;i++)
if(area[newY+j][newX+i]&&cbox[j][i]) return 1;
return 0;
}

int collisionRotate(int cbox[][4])
{
int i,j;
if(newX+newW>=MAXX) newX=MAXX-1-newW;
if(newY+newH>=MAXY) newY=MAXY-1-newH;
if(collision(cbox)) return 1;
for(i=0;i<=newW;i++)
for(j=0;j<=newH;j++)
if(area[newY+j][newX+i])
{
newX-=newW-i+1; goto L;
}
L: return collision(cbox);
}

int gameOver()
{
if(!active &&(curY+curH>MAXY-3)) return 1;
else return 0;
}

/* the end */

刚学c的时候编的,所以程序规范性以及代码的执行效率都不高,而且程序超长。但应该没有太难的语句。
#include<stdio.h>
#include<string.h>
#include<bios.h>
#include<stdlib.h>
#include<time.h>
#include<dos.h>
int dx[4],dy[4]; /*定义全局变量*/
int zt1,zt2,str[15][19];
/*str[15][19]是把整个屏幕分为15*19个方格,每一个方格用一个数组单元表示,
如果=15,则这个方格已被占用,=0,则还是空的*/
int cx[8][5][4],cy[8][5][4]; /*该变量表示每种状态下,旋转时坐标的改变*/
int x,y,j,ji,c;
int maxzt[8]={0,2,1,4,2,2,4,4}; /*各个种类的方块分别有几种状态*/
cir() /*旋转的处理函数*/
{ dx[0]=dx[0]+cx[zt1][zt2][0];dy[0]=dy[0]+cy[zt1][zt2][0];
dx[2]=dx[2]+cx[zt1][zt2][2];dy[2]=dy[2]+cy[zt1][zt2][2];
dx[3]=dx[3]+cx[zt1][zt2][3];dy[3]=dy[3]+cy[zt1][zt2][3];
}
jiance() /*检测旋转或移动能否进行的函数,能则j=1,不能j=0*/
{ j=1;
for(ji=0;ji<4;ji++)
{ x=dx[ji];y=dy[ji];
if(str[x][y]!=' ') j=0;
}
c=bioskey(1);
if(c!=0) c=bioskey(0);
}
main()
{ int dotx[4],doty[4],score; /*dotx[]doty[]表示一个方块个点的坐标*/
int ddx,ddy;
int rzt1,rzt2,i,u,t=1;
int a[5],b[11],o,p,an,bn;
int rotx[4],roty[4],spd=0;
begin: system("cls"); /*游戏初始化阶段*/
printf("londing...");
for(i=0;i<12;i++) /*变量初始阶段*/
{ for(u=0;u<19;u++)
str[i][u]=' ';
}
for(i=0;i<12;i++)
{ str[i][0]='-';str[i][18]='-'; }
for(u=0;u<19;u++)
{ str[0][u]='|';str[11][u]='|'; }
cx[1][1][0]=1;cx[1][1][2]=-1;cx[1][1][3]=-2; /*对旋转变量进行赋值*/
cy[1][1][0]=1;cy[1][1][2]=-1;cy[1][1][3]=-2;
cx[1][2][0]=-1;cx[1][2][2]=1;cx[1][2][3]=2;
cy[1][2][0]=-1;cy[1][2][2]=1;cy[1][2][3]=2;

cx[2][1][0]=0;cx[2][1][2]=0;cx[2][1][3]=0;
cy[2][1][0]=0;cy[2][1][2]=0;cy[2][1][3]=0;

cx[3][1][0]=1;cx[3][1][2]=-1;cx[3][1][3]=1;
cy[3][1][0]=-1;cy[3][1][2]=1;cy[3][1][3]=1;
cx[3][2][0]=1;cx[3][2][2]=-1;cx[3][2][3]=-1;
cy[3][2][0]=1;cy[3][2][2]=-1;cy[3][2][3]=1;
cx[3][3][0]=-1;cx[3][3][2]=1;cx[3][3][3]=-1;
cy[3][3][0]=1;cy[3][3][2]=-1;cy[3][3][3]=-1;
cx[3][4][0]=-1;cx[3][4][2]=1;cx[3][4][3]=1;
cy[3][4][0]=-1;cy[3][4][2]=1;cy[3][4][3]=-1;

cx[4][1][0]=-1;cx[4][1][2]=1;cx[4][1][3]=2;
cy[4][1][0]=1;cy[4][1][2]=1;cy[4][1][3]=0;
cx[4][2][0]=1;cx[4][2][2]=-1;cx[4][2][3]=-2;
cy[4][2][0]=-1;cy[4][2][2]=-1;cy[4][2][3]=0;

cx[5][1][0]=1;cx[5][1][2]=1;cx[5][1][3]=0;
cy[5][1][0]=-1;cy[5][1][2]=1;cy[5][1][3]=2;
cx[5][2][0]=-1;cx[5][2][2]=-1;cx[5][2][3]=0;
cy[5][2][0]=1;cy[5][2][2]=-1;cy[5][2][3]=-2;

cx[6][1][0]=1;cx[6][1][2]=-1;cx[6][1][3]=0;
cy[6][1][0]=-1;cy[6][1][2]=1;cy[6][1][3]=2;
cx[6][2][0]=1;cx[6][2][2]=-1;cx[6][2][3]=-2;
cy[6][2][0]=1;cy[6][2][2]=-1;cy[6][2][3]=0;
cx[6][3][0]=-1;cx[6][3][2]=1;cx[6][3][3]=0;
cy[6][3][0]=1;cy[6][3][2]=-1;cy[6][3][3]=-2;
cx[6][4][0]=-1;cx[6][4][2]=1;cx[6][4][3]=2;
cy[6][4][0]=-1;cy[6][4][2]=1;cy[6][4][3]=0;

cx[7][1][0]=-1;cx[7][1][2]=1;cx[7][1][3]=2;
cy[7][1][0]=1;cy[7][1][2]=-1;cy[7][1][3]=0;
cx[7][2][0]=-1;cx[7][2][2]=1;cx[7][2][3]=0;
cy[7][2][0]=-1;cy[7][2][2]=1;cy[7][2][3]=2;
cx[7][3][0]=1;cx[7][3][2]=-1;cx[7][3][3]=-2;
cy[7][3][0]=-1;cy[7][3][2]=1;cy[7][3][3]=0;
cx[7][4][0]=1;cx[7][4][2]=-1;cx[7][4][3]=0;
cy[7][4][0]=1;cy[7][4][2]=-1;cy[7][4][3]=-2;

srand(time(0)); /*对随机数函数rand()进行初始化*/
zt1=rand()%7+1; /*生成第一、二个方块*/
if(zt1==2) zt2=1;
if(zt1==1||zt1==4||zt1==5) zt2=rand()%2+1;
if(zt1==3||zt1==6||zt1==7) zt2=rand()%4+1;
rzt1=rand()%7+1;
if(rzt1==2) rzt2=1;
if(rzt1==1||rzt1==4||rzt1==5) rzt2=rand()%2+1;
if(rzt1==3||rzt1==6||rzt1==7) rzt2=rand()%4+1;
score=0;
for(o=1;o<11;o++) b[o]=0;
switch(zt1*10+zt2)
/*zt1和zt2分别代表方块的种类和状态,这步是根据这两个变量确定方块的四个点的坐标*/
{ case 11: dotx[0]=4;dotx[1]=5;dotx[2]=6;dotx[3]=7;
doty[0]=2;doty[1]=2;doty[2]=2;doty[3]=2;
break;
case 12: dotx[0]=5;dotx[1]=5;dotx[2]=5;dotx[3]=5;
doty[0]=4;doty[1]=3;doty[2]=2;doty[3]=1;
break;
case 21: dotx[0]=5;dotx[1]=6;dotx[2]=5;dotx[3]=6;
doty[0]=1;doty[1]=1;doty[2]=2;doty[3]=2;
break;
case 31: dotx[0]=4;dotx[1]=5;dotx[2]=6;dotx[3]=5;
doty[0]=2;doty[1]=2;doty[2]=2;doty[3]=1;
break;
case 32: dotx[0]=5;dotx[1]=5;dotx[2]=5;dotx[3]=6;
doty[0]=1;doty[1]=2;doty[2]=3;doty[3]=2;
break;
case 33: dotx[0]=6;dotx[1]=5;dotx[2]=4;dotx[3]=5;
doty[0]=1;doty[1]=1;doty[2]=1;doty[3]=2;
break;
case 34: dotx[0]=6;dotx[1]=6;dotx[2]=6;dotx[3]=5;
doty[0]=3;doty[1]=2;doty[2]=1;doty[3]=2;
break;
case 41: dotx[0]=6;dotx[1]=5;dotx[2]=5;dotx[3]=4;
doty[0]=2;doty[1]=2;doty[2]=1;doty[3]=1;
break;
case 42: dotx[0]=5;dotx[1]=5;dotx[2]=6;dotx[3]=6;
doty[0]=3;doty[1]=2;doty[2]=2;doty[3]=1;
break;
case 51: dotx[0]=4;dotx[1]=5;dotx[2]=5;dotx[3]=6;
doty[0]=2;doty[1]=2;doty[2]=1;doty[3]=1;
break;
case 52: dotx[0]=5;dotx[1]=5;dotx[2]=6;dotx[3]=6;
doty[0]=1;doty[1]=2;doty[2]=2;doty[3]=3;
break;
case 61: dotx[0]=4;dotx[1]=5;dotx[2]=6;dotx[3]=6;
doty[0]=2;doty[1]=2;doty[2]=2;doty[3]=1;
break;
case 62: dotx[0]=5;dotx[1]=5;dotx[2]=5;dotx[3]=6;
doty[0]=1;doty[1]=2;doty[2]=3;doty[3]=3;
break;
case 63: dotx[0]=6;dotx[1]=5;dotx[2]=4;dotx[3]=4;
doty[0]=1;doty[1]=1;doty[2]=1;doty[3]=2;
break;
case 64: dotx[0]=6;dotx[1]=6;dotx[2]=6;dotx[3]=5;
doty[0]=3;doty[1]=2;doty[2]=1;doty[3]=1;
break;
case 71: dotx[0]=6;dotx[1]=5;dotx[2]=4;dotx[3]=4;
doty[0]=2;doty[1]=2;doty[2]=2;doty[3]=1;
break;
case 72: dotx[0]=5;dotx[1]=5;dotx[2]=5;dotx[3]=6;
doty[0]=3;doty[1]=2;doty[2]=1;doty[3]=1;
break;
case 73: dotx[0]=4;dotx[1]=5;dotx[2]=6;dotx[3]=6;
doty[0]=1;doty[1]=1;doty[2]=1;doty[3]=2;
break;
case 74: dotx[0]=6;dotx[1]=6;dotx[2]=6;dotx[3]=5;
doty[0]=1;doty[1]=2;doty[2]=3;doty[3]=3;
break;
}
switch(rzt1*10+rzt2) /*确定第二个方块各个点的坐标*/
{ case 11: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=7;
roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=2;
break;
case 12: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=5;
roty[0]=4;roty[1]=3;roty[2]=2;roty[3]=1;
break;
case 21: rotx[0]=5;rotx[1]=6;rotx[2]=5;rotx[3]=6;
roty[0]=1;roty[1]=1;roty[2]=2;roty[3]=2;
break;
case 31: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=5;
roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;
break;
case 32: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;
roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=2;
break;
case 33: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=5;
roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;
break;
case 34: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;
roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=2;
break;
case 41: rotx[0]=6;rotx[1]=5;rotx[2]=5;rotx[3]=4;
roty[0]=2;roty[1]=2;roty[2]=1;roty[3]=1;
break;
case 42: rotx[0]=5;rotx[1]=5;rotx[2]=6;rotx[3]=6;
roty[0]=3;roty[1]=2;roty[2]=2;roty[3]=1;
break;
case 51: rotx[0]=4;rotx[1]=5;rotx[2]=5;rotx[3]=6;
roty[0]=2;roty[1]=2;roty[2]=1;roty[3]=1;
break;
case 52: rotx[0]=5;rotx[1]=5;rotx[2]=6;rotx[3]=6;
roty[0]=1;roty[1]=2;roty[2]=2;roty[3]=3;
break;
case 61: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=6;
roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;
break;
case 62: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;
roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=3;
break;
case 63: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=4;
roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;
break;
case 64: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;
roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=1;
break;
case 71: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=4;
roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;
break;
case 72: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;
roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=1;
break;
case 73: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=6;
roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;
break;
case 74: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;
roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=3;
break;
}
system("cls"); /*显示初始阶段*/
printf("\n\n\n"); /*游戏区域下移3*/
for(u=0;u<19;u++)
{ for(i=0;i<12;i++)
printf("%c",str[i][u]);
printf("\n");
}
gotoxy(16,5);printf("--------");
gotoxy(16,12);printf("--------");
for(i=6;i<12;i++)
{ gotoxy(16,i);printf("|");gotoxy(23,i);printf("|"); }
for(i=6;i<12;i++)
{ gotoxy(16,i);printf("|");gotoxy(23,i);printf("|"); }
for(i=0;i<4;i++)
{ gotoxy(rotx[i]+14,roty[i]+6);printf("%c",15);
}
begin2: delay(26000); /*游戏开始,延迟1*/
speed: delay(10000); /*加速,延迟2*/
gotoxy(16,14);printf("Score:%d",score);
for(i=0;i<4;i++)
{ gotoxy(dotx[i]+1,doty[i]+4);printf(" ");
ddx=dotx[i];ddy=doty[i];
str[ddx][ddy]=' ';
}
an=an-0.4; /*表示按键是否一直按着,用于方块落地后的移动*/
c=bioskey(1); /*按键处理部分*/
/*bioskey(1)是用来检测是否按下案件的函数*/
if(c!=0)
{ c=bioskey(0);
if(c==8292||c==19712)
{ for(i=0;i<4;i++)
{ dx[i]=dotx[i]+1;dy[i]=doty[i]; }
jiance();
for(i=0;i<4;i++)
dotx[i]=(j)? dx[i] : dotx[i];
an=(j||bn);
}
if(c==7777||c==19200)
{ for(i=0;i<4;i++)
{ dx[i]=dotx[i]-1;dy[i]=doty[i]; }
jiance();
for(i=0;i<4;i++)
dotx[i]=(j)? dx[i] : dotx[i];
an=(j||bn);
}
if(c==6512) /*暂停的处理*/
{ while(1)
{ c=bioskey(0);
if(c==6512) break;
}
goto begin3;
}
if(c==8051||c==20480) spd=1; /*加速(spd==1表示加速状态)*/
if(c==4471||c==18432) /*旋转的处理*/
{ for(i=0;i<4;i++)
{ dx[i]=dotx[i];dy[i]=doty[i]; }
/*dx[]与dy[]是临时变量,这样一旦判断为不能旋转,就可方便的回复旋转前的坐标*/
cir(); /*旋转*/
jiance(); /*判断旋转是否能进行*/
for(i=0;i<4;i++)
{ dotx[i]=(j)? dx[i] : dotx[i]; doty[i]=(j)?dy[i] : doty[i]; }
/*根据jiance()得到的j值,判断是对dotx[]与doty[]赋旋转后的还是旋转前的值*/
if(j==1) /*如果旋转可已经行,就对原方块的状态进行改变*/
{ an=(j||bn);zt2=zt2+1;
if(zt2>maxzt[zt1]) zt2=1;
goto overif; /*结束旋转的处理*/
}
for(i=0;i<4;i++)
{ dx[i]=dotx[i]+1;dy[i]=doty[i]; }
/*如果不能旋转,再判断坐标右移一个后能否旋转*/
cir();
jiance();
for(i=0;i<4;i++)
{ dotx[i]=(j)? dx[i] : dotx[i]; doty[i]=(j)?dy[i] : doty[i]; }
if(j==1)
{ an=(j||bn);zt2=zt2+1;
if(zt2>maxzt[zt1]) zt2=1;
goto overif;
}
if(dotx[2]==1) goto overif;
for(i=0;i<4;i++)
{ dx[i]=dotx[i]-1;dy[i]=doty[i]; }
/*判断坐标左移一个后能否旋转*/
cir();
jiance();
for(i=0;i<4;i++)
{ dotx[i]=(j)? dx[i] : dotx[i]; doty[i]=(j)?dy[i] : doty[i]; }
if(j==1)
{ an=(j||bn);zt2=zt2+1;
if(zt2>maxzt[zt1]) zt2=1;
goto overif;
}
overif: ;
}
}
begin3: for(i=0;i<4;i++) /*方块下移的处理*/
{ dx[i]=dotx[i];dy[i]=doty[i]+1; }
jiance();
bn=j;
for(i=0;i<4;i++)
doty[i]=(j)? dy[i] : doty[i];
for(i=0;i<4;i++)
{ gotoxy(dotx[i]+1,doty[i]+4);printf("%c",15);
ddx=dotx[i];ddy=doty[i];
str[ddx][ddy]=15;
}
if(j==1&&spd==1) { spd=0;goto speed; }
if(j==1||an>0) goto begin2;
for(u=17;u>0;u--) /*方块停止下移(方块移动到底了)的处理*/
{ for(i=1;i<11;i++) /*判断每一行是否排满*/
if(str[i][u]==15) b[i]=1;
if (b[1]+b[2]+b[3]+b[4]+b[5]+b[6]+b[7]+b[8]+b[9]+b[10]<10)
{ for(o=1;o<11;o++) b[o]=0;
continue;
}
for(o=1;o<11;o++) b[o]=0;
a[t]=u;t++;
}
score+=(t)*(t-1)/2;
for(i=1;i<11;i++)
if(str[i][1]==15) b[i]=1;
if (b[1]+b[2]+b[3]+b[4]+b[5]+b[6]+b[7]+b[8]+b[9]+b[10]>0 &&t==1) goto over;
for(o=1;o<11;o++) b[o]=0;
if(t==1) goto ran;
switch(t) /*消除方块的处理,t=要消除的函数+1*/
{ case 5: for(u=a[4];u>1;u--) { for(i=1;i<11;i++) str[i][u]=str[i][u-1]; }
/*将要消除的行中,最上面一行,上面的方格整体下移,下面的case 4,3,2类似*/
case 4: for(u=a[3];u>1;u--) { for(i=1;i<11;i++) str[i][u]=str[i][u-1]; }
case 3: for(u=a[2];u>1;u--) { for(i=1;i<11;i++) str[i][u]=str[i][u-1]; }
case 2: for(u=a[1];u>1;u--) { for(i=1;i<11;i++) str[i][u]=str[i][u-1]; }
}
t=1;
for(u=1;u<18;u++)
{ for(i=1;i<11;i++)
{ gotoxy(i+1,u+4);
printf("%c",str[i][u]);
}
}
ran: zt1=rzt1;zt2=rzt2;rzt1=rand()%7+1; /*生成下两个方块*/
if(rzt1==2) rzt2=1;
if(rzt1==1||rzt1==4||rzt1==5) rzt2=rand()%2+1;
if(rzt1==3||rzt1==6||rzt1==7) rzt2=rand()%4+1;
for(i=0;i<4;i++)
{ dotx[i]=rotx[i];doty[i]=roty[i];
gotoxy(dotx[i]+1,doty[i]+4);printf("%c",15);
}
switch(rzt1*10+rzt2)
{ case 11: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=7;
roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=2;
break;
case 12: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=5;
roty[0]=4;roty[1]=3;roty[2]=2;roty[3]=1;
break;
case 21: rotx[0]=5;rotx[1]=6;rotx[2]=5;rotx[3]=6;
roty[0]=1;roty[1]=1;roty[2]=2;roty[3]=2;
break;
case 31: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=5;
roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;
break;
case 32: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;
roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=2;
break;
case 33: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=5;
roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;
break;
case 34: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;
roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=2;
break;
case 41: rotx[0]=6;rotx[1]=5;rotx[2]=5;rotx[3]=4;
roty[0]=2;roty[1]=2;roty[2]=1;roty[3]=1;
break;
case 42: rotx[0]=5;rotx[1]=5;rotx[2]=6;rotx[3]=6;
roty[0]=3;roty[1]=2;roty[2]=2;roty[3]=1;
break;
case 51: rotx[0]=4;rotx[1]=5;rotx[2]=5;rotx[3]=6;
roty[0]=2;roty[1]=2;roty[2]=1;roty[3]=1;
break;
case 52: rotx[0]=5;rotx[1]=5;rotx[2]=6;rotx[3]=6;
roty[0]=1;roty[1]=2;roty[2]=2;roty[3]=3;
break;
case 61: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=6;
roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;
break;
case 62: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;
roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=3;
break;
case 63: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=4;
roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;
break;
case 64: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;
roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=1;
break;
case 71: rotx[0]=6;rotx[1]=5;rotx[2]=4;rotx[3]=4;
roty[0]=2;roty[1]=2;roty[2]=2;roty[3]=1;
break;
case 72: rotx[0]=5;rotx[1]=5;rotx[2]=5;rotx[3]=6;
roty[0]=3;roty[1]=2;roty[2]=1;roty[3]=1;
break;
case 73: rotx[0]=4;rotx[1]=5;rotx[2]=6;rotx[3]=6;
roty[0]=1;roty[1]=1;roty[2]=1;roty[3]=2;
break;
case 74: rotx[0]=6;rotx[1]=6;rotx[2]=6;rotx[3]=5;
roty[0]=1;roty[1]=2;roty[2]=3;roty[3]=3;
break;
}
for(i=6;i<12;i++) /*刷新一下用来显示下一个方块的那个区域*/
{ gotoxy(16,i);printf("|");gotoxy(23,i);printf("|"); }
for(i=6;i<12;i++)
for(u=17;u<23;u++) { gotoxy(u,i);printf("%c",32); }
for(i=0;i<4;i++)
{ gotoxy(rotx[i]+14,roty[i]+6);printf("%c",15); }
c=bioskey(1);an=0;
if(c!=0) c=bioskey(0);
if(spd==1) { spd=0;goto speed; }
goto begin2;
over: system("cls");
gotoxy(36,11);printf("GAME OVER");
bioskey(0);
system("cls");
printf("Your score is %d\n\n",score);
printf("Press 'Q' to exit\nIf you want to play again,please press other keys.");
score=0;
c=bioskey(0);
if(c!=4209) goto begin;
}

自己倒是写过一个.400多行.不过注释都是写的英文,而且是很早以前写的.不好看,比前面那位兄台的好处在于是图形界面的,(* ̄▽ ̄*).......
/***************************************
TETRIS
by chichujn
version 1.1
start at 2008.01.18
finish at 2008.01.24
modify at 2008.02.27
***************************************/

/* Head Files */
#include <stdio.h>
#include <bios.h>
#include <stdlib.h>
#include <graphics.h>

/*Struct of block*/
/**************************************
Shape of block:
The block is put in 4x4 area
First row, bit 31-28;
Second row, bit 27-24...

Postion of block:
bit 15-8, bottom
bit 7-4, wide
bit 3-0, left
**************************************/
long all[19];
/***************************************
□□□□ □□□□ □□□□ □□□□ □□□□ □□□□ □□□□ □□□□ □□□□
□□□□ □□□□ □■□□ □□□□ ■□□□ □□□□ ■■□□ □□□□ □■□□
■■□□ ■■□□ ■■□□ □■■□ ■■□□ ■□□□ ■□□□ ■■■□ □■□□
■■□□ □■■□ ■□□□ ■■□□ □■□□ ■■■□ ■□□□ □□■□ ■■□□

□□□□ □□□□ □□□□ □□□□ □□□□ □□□□ □□□□ □□□□ □□□□ ■□□□
□□□□ ■□□□ □□□□ ■■□□ □□□□ ■□□□ □□□□ □■□□ □□□□ ■□□□
□□■□ ■□□□ ■■■□ □■□□ □■□□ ■■□□ ■■■□ ■■□□ □□□□ ■□□□
■■■□ ■■□□ ■□□□ □■□□ ■■■□ ■□□□ □■□□ □■□□ ■■■■ ■□□□
***************************************/

int screen[25];
/*Record the fixed blocks*/
/********************************
screen[n]
bit 9-0
********************************/

/* Function Welcome */
void Welcome(void)
{
gotoxy(37,10);
printf("TETRIS");
gotoxy(1,19);
printf("Version :1.1\nProgramBy:chichujn\n\nKEY: q-Quit; w-Rotate ; a-Left; d-Right; s-Speedup.\n\n");
printf("Press any key to start...");
getch();
}

/* Function Data_Init */
void Data_Init(void)
{
int i;

all[0]=0x00CC0014;
all[1]=0x00C60024;
all[2]=0x04C80014;
all[3]=0x006C0024;
all[4]=0x08C40014;
all[5]=0x008E0024;
all[6]=0x0C880014;
all[7]=0x00E20024;
all[8]=0x044C0014;
all[9]=0x002E0024;
all[10]=0x088C0014;
all[11]=0x00E80024;
all[12]=0x0C440014;
all[13]=0x004E0024;
all[14]=0x08C80014;
all[15]=0x00E40024;
all[16]=0x04C40014;
all[17]=0x000F0034;
all[18]=0x88880004;

for(i=0;i<25;++i)
screen[i]=0;
}

/* Function Block_Init */
long Block_Init()
{
randomize();
return(all[random(19)]);
}

/* Function Block_Position */
/***********************************
Return position param of the block
n=0,bottom
n=1,left
n=2,right
************************************/
int Block_Position(long block,int n)
{
if(n==0)
return( (int)block>>8 );
if(n==1)
return( (int)block&0x000F );
if(n==2)
return( ((int)block&0x000F) + ( ((int)block>>4)&0x000F ) );
}

/* Function Diplay */
/**************************************
Display the blocks.
Postion:
16,16;32,16;48,16...
16,32;32,32;48,32...
Width of the blocks:
14 pixels
Color:
White
**************************************/
void Display(long block)
{
int i,j;
int bottom;
int left;

bottom=Block_Position(block,0);
left=Block_Position(block,1);

for(i=0;i<25;++i)
for(j=0;j<10;++j)
{
if(( (screen[i]>>(9-j))&0x0001 )==0)
setfillstyle(SOLID_FILL,BLACK);
else
setfillstyle(SOLID_FILL,WHITE);
bar( (j+1)*16, (i+1)*16, (j+1)*16+14, (i+1)*16+14 );
}

setfillstyle(SOLID_FILL,WHITE);
for(i=0;i<16;++i)
if( ( ((block>>(31-i))&0x0001)==1 ) && ((bottom-3+i/4)>=0) )
bar( (left+i%4+1)*16, (bottom+i/4-3+1)*16, (left+i%4+1)*16+14, (bottom+i/4-3+1)*16+14 );
}

/* Function delay */
void delay(int n)
{
long t1,t2;

t1=t2=biostime(0,0);
while(t2-t1<n)
t2=biostime(0,0);
}

/* Function Block_Rotate */
long Block_Rotate(long block)
{
int n;
long tmp;

tmp=block;
switch( (int)(block>>16) )
{
case 0x00C6:tmp=0x04C80000+(tmp&0x0000FFFF);break;
case 0x04C8:tmp=0x00C60000+(tmp&0x0000FFFF);break;
case 0x006C:tmp=0x08C40000+(tmp&0x0000FFFF);break;
case 0x08C4:tmp=0x006C0000+(tmp&0x0000FFFF);break;
case 0x008E:tmp=0x0C880000+(tmp&0x0000FFFF);break;
case 0x0C88:tmp=0x00E20000+(tmp&0x0000FFFF);break;
case 0x00E2:tmp=0x044C0000+(tmp&0x0000FFFF);break;
case 0x044C:tmp=0x008E0000+(tmp&0x0000FFFF);break;
case 0x002E:tmp=0x088C0000+(tmp&0x0000FFFF);break;
case 0x088C:tmp=0x00E80000+(tmp&0x0000FFFF);break;
case 0x00E8:tmp=0x0C440000+(tmp&0x0000FFFF);break;
case 0x0C44:tmp=0x002E0000+(tmp&0x0000FFFF);break;
case 0x000F:tmp=0x88880000+(tmp&0x0000FFFF);break;
case 0x8888:tmp=0x000F0000+(tmp&0x0000FFFF);break;
case 0x004E:tmp=0x08C80000+(tmp&0x0000FFFF);break;
case 0x08C8:tmp=0x00E40000+(tmp&0x0000FFFF);break;
case 0x00E4:tmp=0x04C40000+(tmp&0x0000FFFF);break;
case 0x04C4:tmp=0x004E0000+(tmp&0x0000FFFF);break;
default:return(block);
}

n=(int)(block>>4)&0x000F;
if(n==0)
tmp+=0x0030;
if(n==1)
tmp+=0x0010;
if(n==2)
tmp-=0x0010;
if(n==3)
tmp-=0x0030;

if(Block_Check(tmp))
return(block);
return(tmp);
}

/* Function Block_Check */
/***********************************
Check the status of the block
return 0:Not out of edge and no crash
return 1:Out of edge
return 2:Crash with other blocks
***********************************/
int Block_Check(long block)
{
int i;
int bottom;
int left;
int right;

bottom=Block_Position(block,0);
left=Block_Position(block,1);
right=Block_Position(block,2);

if(left==0x000F||right>9||bottom>24)
return(1);
for(i=0;i<16;++i)
if( ((block>>(31-i))&1) && ( (screen[bottom-3+i/4]>>(9-left-i%4) ) &1 ) )
return(2);
return(0);
}

/* Function Block_Move */
/***********************************
Move the block
n=0:down
n=1:left
n=2:right
***********************************/
long Block_Move(long block,int n)
{
long tmp;

tmp=block;
if(n==0)
tmp+=0x0100;
if(n==1)
tmp-=0x0001;
if(n==2)
tmp+=0x0001;
if(Block_Check(tmp))
return(block);
return(tmp);
}

/* Function Screen_Refresh */
/***********************************
If the block touchs the bottom or crashes with other blocks.
Fresh the screen.
***********************************/
int Screen_Refresh(long block)
{
int i,j;
int score;
int left;
int bottom;
int tmp;

bottom=Block_Position(block,0);
left=Block_Position(block,1);
score=0;

for(i=0;i<16;++i)
if( ((block>>(31-i))&0x0001)==1 && ((((int)block>>8)&0x00FF)-i/4)<0 )
return(-1);

tmp=left>6?( ( (block>>28) &0x000F) >> (left-6) ):( ( (block>>28) &0x000F) << (6-left) );
screen[bottom-3]=screen[bottom-3]|tmp;
tmp=left>6?( ( (block>>24) &0x000F) >> (left-6) ):( ( (block>>24) &0x000F) << (6-left) );
screen[bottom-2]=screen[bottom-2]|tmp;
tmp=left>6?( ( (block>>20) &0x000F) >> (left-6) ):( ( (block>>20) &0x000F) << (6-left) );
screen[bottom-1]=screen[bottom-1]|tmp;
tmp=left>6?( ( (block>>16) &0x000F) >> (left-6) ):( ( (block>>16) &0x000F) << (6-left) );
screen[bottom]=screen[bottom]|tmp;

for(i=0;i<25;++i)
if(screen[i]==0x03FF)
{
score++;
for(j=i;j>0;--j)
screen[j]=screen[j-1];
}

return(score);
}

/* Function Block_Next */
/**********************************
Display the next block
**********************************/
void Block_Next(long next)
{
int i;
int bottom;

setfillstyle(SOLID_FILL,BLACK);
bar(306,98,328,120);

setfillstyle(SOLID_FILL,WHITE);
bottom=Block_Position(next,0);
for(i=0;i<16;++i)
if((next>>(31-i))&1)
bar( (i%4+1)*6+300, (bottom+i/4-3+1)*6+110, (i%4+1)*6+304, (bottom+i/4-3+1)*6+114 );
}

/* Function Graph_Text */
/*********************************
In graph mode,put a number on screen
position:left,bottom
number:n
*********************************/
void Graph_Text(int left,int bottom,int n,int color)
{
char *ch;

itoa(n,ch,10);
setcolor(color);
outtextxy(left,bottom,ch);
}

/* Function Game */
int Game()
{
long block;
long block_tmp;
long next;

int i;
int tmp;
int t;
int speed_tmp;
int Game_Speed;
int Game_Score;

char key;
char* score;
char* speed;

Game_Score=0;
Game_Speed=speed_tmp=1;
t=0;
block=Block_Init();
Display(block);
setcolor(WHITE);
settextstyle(4,0,3);
outtextxy(250,50,"Score:");
outtextxy(250,80,"SPeed:");
outtextxy(250,110,"Next :");
rectangle(14,14,176,416);
Graph_Text(300,50,Game_Score,WHITE);
Graph_Text(300,80,Game_Speed,WHITE);
next=Block_Init();
Block_Next(next);

while(1)
{
if(bioskey(1)!=0)
{
key=getch();
if(key=='q'||key=='Q')
break;
if(key=='s'||key=='S')
speed_tmp=10;
else
speed_tmp=Game_Speed;
}
delay(1);
++t;
if(t==30000)
t=0;
if(t%(11-speed_tmp)==0)
{
block_tmp=block;
block=Block_Move(block,0);
if(block_tmp==block)
{
tmp=Game_Score;
Graph_Text(300,50,Game_Score,BLACK);
Game_Score+=Screen_Refresh(block);
if(Game_Score<tmp)
return(tmp);
Graph_Text(300,50,Game_Score,WHITE);
if(Game_Score>tmp&&Game_Score%20==0&&Game_Speed<10&&Game_Score>0)
{
Graph_Text(300,80,Game_Speed,BLACK);
Game_Speed++;
Graph_Text(300,80,Game_Speed,WHITE);
}
block=next;
next=Block_Init();
Block_Next(next);
speed_tmp=Game_Speed;
}
Display(block);
}
if(key=='A'||key=='a'||key=='D'||key=='d'||key=='W'||key=='w')
{
if(key=='A'||key=='a')
block=Block_Move(block,1);
if(key=='D'||key=='d')
block=Block_Move(block,2);
if(key=='W'||key=='w')
block=Block_Rotate(block);
key='m';
Display(block);
}
}
return(Game_Score);
}

/* Function Main */
int main()
{
int gd=DETECT,gm;
int score;

Welcome();
Data_Init();
initgraph(&gd,&gm,"");
registerbgidriver(EGAVGA_driver);
score=Game();
closegraph();
gotoxy(35,12);
printf("Game Over");
gotoxy(1,23);
printf("Your score:%d\nPress any key to quit...",score);

getch();
}

http://down.cnzz.cn//Download.aspx?id=72336&llid=0
直接复制到迅雷下载。别忘了给分^_^

http://www.gougou.com/search?search=c%E8%AF%AD%E8%A8%80%E4%BF%84%E7%BD%97%E6%96%AF%E6%96%B9%E5%9D%97%E7%A8%8B%E5%BA%8F&restype=-1&id=10000001&ty=0&pattern=0试一试这个

别心急,知道么


凉山彝族自治州18670612008: c语言 编写俄罗斯方块的程序 要求有详细的中文注释 -
尉迟莉丽泽: 刚学c的时候编的,所以程序规范性以及代码的执行效率都不高,而且程序超长.但应该没有太难的语句. #include<stdio.h> #include<string.h> #include<bios.h> #include<stdlib.h> #include<time.h> #include<dos.h> int dx[4],dy[4]; /*定义全局变...

凉山彝族自治州18670612008: 用c语言写俄罗斯方块要学哪些东西 -
尉迟莉丽泽: 首先要学习C语言,这个是基础. 然后如果必须用C的话,还要学习C语言的图形界面编程. 网上资料做多,而且容易得到的就是Turbo C的,因为Turbo C可以写图形的程序. 如果你不想限制在Turbo C,想用其他编译器也可以编译的程序的话,你可以学习SDL.SDL的教程里,也可以找到俄罗斯方块.当然,你也可以学习OpenGL的俄罗斯方块.你百度 SDL 俄罗斯方块或者 OpenGL 俄罗斯方块都很容易找到例程. 总之, 第一,你必须先学好C语言; 然后,你要学习一种C语言的图形库; 最后,你要学习俄罗斯方块的程序设计方法. 这样,你就可以编写一个自己的,有声有色的俄罗斯方块了.

凉山彝族自治州18670612008: 学C语言要到啥时候能编个俄罗斯方块阿?要具备哪些知识才能啊 ? -
尉迟莉丽泽: 额、学习C语言 编俄罗斯方块是必然的!理论上 一个月 你就可以汇编俄罗斯方块的功能了但实际学习能力 要根据你个人及导师的教学了汇编俄罗斯方块 你会用画布就可以满足 最主要的是你逻辑思维的考验 逻辑考虑的不周到 很可能导致项目的失败 其他的我个人觉得没什么了 就像推箱子一样 实现它简单希望你能满意 帮助你解决问题是我们最大的快乐!

凉山彝族自治州18670612008: 用c语言编写俄罗斯方块的程序
尉迟莉丽泽: 这里把游戏的关键设计放在三个盒子和一个坐标上: 大盒子:一个两维数组,记录着方块点阵的开与关(把游戏的舞台想像 成一个点阵),在下面也把这个东西称为地图 ...

凉山彝族自治州18670612008: 求C语言编写俄罗斯方块的详细说明啊.... -
尉迟莉丽泽: 俄罗斯方块不就是一个二维数组吗,目的就是添充这张二维数组,再显示出来.就分几个模块,往下走得有定时器,左右下方块的移动,变型,消行和游戏结束判断.以前用公司的显示屏写过,不过代码我现在没有啊

凉山彝族自治州18670612008: C编写俄罗斯方块要涉及到哪些c语言知识(最起码需要了解的) -
尉迟莉丽泽: 首先看你要用什么工具了,如果只是单纯的学了C,那么可以尝试用win-tc去坐下,只需要了解一些画图函数就OK了,至于如何进入图形模式,win-tc提供有模板,我用win-tc写俄罗斯方块,核心代码也就300行左右,如果你想做的更加漂亮的话,可以尝试MFC,首先你要了解windows编程的基本思想“消息”.其次,需要对C++有一定的了解..如果是初学,就先考虑下用C在win-tc下画图,做游戏吧~~~

凉山彝族自治州18670612008: 怎么用c语言做俄罗斯方块游戏 要详解 -
尉迟莉丽泽: /*俄罗斯方块*/#include "Conio.h" #include "graphics.h" #include<stdio.h> #include<stdlib.h> #define closegr closegraph #define WALL 9 #define BACK 6 #define PTC 4 #define DELC 15 #define LEFT 0x4b00 #define RIGHT 0x4d00 #...

凉山彝族自治州18670612008: 学完c语言后要怎样才能编写俄罗斯方块. -
尉迟莉丽泽: 编程和学习数学是一样的,要多练习,练习多了,语法熟练了,就开始多看别人写的代码,比如看看一些开源代码,学习人家的思想,有了这些就可以尝试了.否则光学会语法没什么用.

凉山彝族自治州18670612008: 用C语言在VC++里编写俄罗斯方块,需要掌握哪些知识? -
尉迟莉丽泽: DIRECTdraw ,如果你不想用这个,用PAINTDC也能搞,但花样就不多了,满足功能不成问题,如果你真的会C的话,其实非常简单,就是几个图形的旋转算法,而且用PAINTDC 的话就是矩阵变化而已.然后就是搁住后判断消行,这个更简单了.

凉山彝族自治州18670612008: 如何用C语言编写俄罗斯方块 -
尉迟莉丽泽: 我在软件职业学校学习了1年 然后工作了一年才编写出了俄罗斯方块 代码千行左右 不说难吧,但也是很麻烦,C语言就更麻烦了,特别是调试(多数人承受不了) 难度系数,我觉得可能要因人而议,如果你是天才那么我就不多说了 但是有一点是确定的,对C要有一个全面的了解,并且指针及结构体要相当熟悉

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网