求一个用C语言写的小游戏代码。

# include & ltgraphics.h & gt

# include & ltconio.h & gt

# include & lttime.h & gt

/////////////////////////////////////////////

//定义常量、枚举器、结构和全局变量。

/////////////////////////////////////////////

# # define width 10////游戏区宽度

# define height 22//游戏区的高度

# define size 20//每个游戏区域单元的实际像素

//定义操作类型

枚举命令

{

Cmd _ rotate,//框旋转

Cmd _ left,cmd _ right,cmd _ down,//框左右下移动。

Cmd _ sink,//box sinks。

cmd _ Quit//退出游戏

};

//定义如何绘制方框。

枚举绘制

{

Show,//显示框

隐藏,//隐藏框

固定//固定框

};

//定义七种俄罗斯方块。

结构块

{

WORD dir[4];//正方形的四个旋转状态

COLORREF颜色;//框的颜色

} g _ Blocks[7]= { { 0x0F00,0x4444,0x0f 00,0x4444,RED},// I

{0x0060,0x0060,0x0060,0x0060,蓝色},//端口

{0x4460,0x02E0,0x0622,0x0740,洋红色},// L

{0x2260,0x0e20,0x0644,0x0470,黄色},//anti-l

{0x0C60,0x2640,0x0C60,0x2640,青色},// Z

{0x0360,0x4620,0x0360,0x4620,绿色},//反z

{0x4E00,0x4C40,0x0E40,0x4640,棕色} };// T

//定义当前框和下一个框的信息。

结构块信息

{

字节id;//框ID

char x,y;//游戏区域中方块的坐标

字节目录:2;//方向

} g _ CurBlock,g _ NextBlock

//定义游戏区域

BYTE g _ World[宽度][高度]= { 0 };

/////////////////////////////////////////////

//函数声明

/////////////////////////////////////////////

void Init();//初始化游戏

void Quit();//退出游戏

void new game();//开始新游戏

void game over();//结束游戏

CMD get CMD();//获取控制命令

void dispatch CMD(CMD _ CMD);//分发控制命令

void new block();//生成新的块

bool check block(block info _ block);//检测指定的盒子是否可以放下。

void DrawBlock(BLOCKINFO _block,DRAW _ DRAW = SHOW);//画一个方框

void on rotate();//旋转盒子

void on left();//将框向左移动

void on right();//将框向右移动

void on down();//向下移动框

void OnSink();//接收框

/////////////////////////////////////////////

//函数定义

/////////////////////////////////////////////

//主函数

void main()

{

init();

CMD c;

while(真)

{

c = get cmd();

dispatch cmd(c);

//当按Exit时,会显示一个对话框,询问用户是否退出。

if (c == CMD_QUIT)

{

HWND wnd = GetHWnd();

If (MessageBox(wnd,_T("你要退出游戏吗?"),_T("提醒"),MB _ ok cancel | MB _ icon question)= = idok)

quit();

}

}

}

//初始化游戏

void初始化()

{

initgraph(640,480);

srand((无符号)时间(空));

//显示操作说明

Setfont(14,0,_T("宋体"));

Outtextxy(20,330,_T(“操作说明”));

Outtextxy(20,350,_ T(" Top:Rotation "));

Outtextxy(20,370,_T ("left:左移"));

Outtextxy(20,390,_ T(" right:right shift "));

Outtextxy (20,465,438+00,_ t(" Down:Down "));

Outtextxy(20,430,_ T(" space:sink "));

Outtextxy(20,450,_ T(" ESC:Exit "));

//设置坐标原点

setorigin(220,20);

//绘制游戏区域的边界

矩形(-1,-1,宽度*尺寸,高度*尺寸);

矩形((宽度+ 1) *大小- 1,-1,(宽度+ 5) *大小,4 *大小);

//开始新游戏

new game();

}

//退出游戏

void退出()

{

closegraph();

退出(0);

}

//开始新游戏

void NewGame()

{

//清空游戏区

setfillstyle(黑色);

bar(0,0,宽度*大小- 1,高度*大小-1);

ZeroMemory(g_World,WIDTH * HEIGHT);

//生成下一个块

g _ next block . id = rand()% 7;

g _ next block . dir = rand()% 4;

g _ next block . x = WIDTH+1;

g _ next block . y = HEIGHT-1;

//获取一个新的正方形

new block();

}

//结束游戏

void GameOver()

{

HWND wnd = GetHWnd();

If (MessageBox(wnd,_T("游戏结束。\ n您想再玩一次吗?),_T("游戏结束"),MB _ yes no | MB _ icon question)= = id yes)

new game();

其他

quit();

}

//获取控制命令

DWORD m _ oldtime

CMD GetCmd()

{

//获取控制值

while(真)

{

//超时的话会自动掉一格。

DWORD new time = GetTickCount();

if(new time-m _ old time & gt;= 500)

{

m _ oldtime = newtime

返回CMD _ DOWN

}

//如果有键,返回该键对应的函数。

if (kbhit())

{

开关(getch())

{

案例“w”:

case“W”:返回CMD _ ROTATE

案例“a”:

事例“A”:返回CMD _ LEFT

案例“d”:

事例“D”:返回CMD _ RIGHT

案例:

case:返回CMD _ DOWN

案例27:返回CMD _ QUIT

案例“”:返回CMD _ SINK

案例0:

案例0xE0:

开关(getch())

{

案例72:返回CMD _ ROTATE

案例75:返回CMD _ LEFT

案例77:返回CMD _ RIGHT

案例80:返回CMD _ DOWN

}

}

}

//延迟(降低CPU利用率)

睡眠(20);

}

}

//分发控制命令

void DispatchCmd(CMD _cmd)

{

开关(_cmd)

{

case CMD _ ROTATE:on ROTATE();打破;

case CMD _ LEFT:on LEFT();打破;

case CMD _ RIGHT:on RIGHT();打破;

case CMD _ DOWN:on DOWN();打破;

case CMD _ SINK:on SINK();打破;

case CMD _ QUIT:break;

}

}

//生成新的块

void NewBlock()

{

g_CurBlock.id = g_NextBlock.id,g _ next block . id = rand()% 7;

g_CurBlock.dir = g_NextBlock.dir,g _ next block . dir = rand()% 4;

g _ curb lock . x =(WIDTH-4)/2;

g _ curb lock . y = HEIGHT+2;

//向下移动新框,直到出现部分显示。

WORD c = g_Blocks[g_CurBlock.id]。dir[g _ curb lock . dir];

而((c & amp0xF) == 0)

{

g _ curb lock . y-;

c & gt& gt= 4;

}

//绘制一个新框

draw block(g _ curb lock);

//绘制下一个框

setfillstyle(黑色);

bar((宽度+ 1) *大小,0,(宽度+ 5) *大小- 1,4 *大小-1);

draw block(g _ next block);

//设置判断自动跌落的定时器。

m _ old time = GetTickCount();

}

//画一个方框

void DrawBlock(BLOCKINFO _block,DRAW _draw)

{

WORD b = g_Blocks[_block.id]。dir[_ block . dir];

int x,y;

int color =黑色;

开关(_draw)

{

案例展示:color = g_Blocks[_block.id]。颜色;打破;

案例隐藏:颜色=黑色;打破;

case FIX:color = g _ Blocks[_ block . id]。颜色/3;打破;

}

setfillstyle(颜色);

for(int I = 0;我& lt16;i++)

{

如果(b & amp0x8000)

{

x = _ block . x+I % 4;

y = _ block . y-I/4;

if(y & lt;高度)

{

如果(_画!=隐藏)

bar3d(x * SIZE + 2,(HEIGHT - y - 1) * SIZE + 2,(x + 1) * SIZE - 4,(HEIGHT - y) * SIZE - 4,3,true);

其他

bar(x * SIZE,(HEIGHT - y - 1) * SIZE,(x + 1) * SIZE - 1,(HEIGHT-y)* SIZE-1);

}

}

b & lt& lt= 1;

}

}

//检测指定的盒子是否可以放下。

布尔校验块(块信息_块)

{

WORD b = g_Blocks[_block.id]。dir[_ block . dir];

int x,y;

for(int I = 0;我& lt16;i++)

{

如果(b & amp0x8000)

{

x = _ block . x+I % 4;

y = _ block . y-I/4;

如果((x & lt0)| |(x & gt;= WIDTH)| |(y & lt;0))

返回false

如果((y & lt身高);& amp(g_World[x][y]))

返回false

}

b & lt& lt= 1;

}

返回true

}

//旋转盒子

void OnRotate()

{

//获取可以旋转的x偏移量。

int dx

BLOCKINFO tmp = g _ CurBlock

tmp . dir++;if(check block(tmp)){ dx = 0;转到旋转;}

tmp . x = g _ curb lock . x-1;if(check block(tmp)){ dx =-1;转到旋转;}

tmp . x = g _ curb lock . x+1;if(check block(tmp)){ dx = 1;转到旋转;}

tmp . x = g _ curb lock . x-2;if(check block(tmp)){ dx =-2;转到旋转;}

tmp . x = g _ curb lock . x+2;if(check block(tmp)){ dx = 2;转到旋转;}

返回;

旋转:

//旋转

DrawBlock(g_CurBlock,HIDE);

g _ curb lock . dir++;

g _ curb lock . x+= dx;

draw block(g _ curb lock);

}

//将框向左移动

void OnLeft()

{

BLOCKINFO tmp = g _ CurBlock

tmp . x-;

if(检查块(tmp))

{

DrawBlock(g_CurBlock,HIDE);

g _ curb lock . x-;

draw block(g _ curb lock);

}

}

//将框向右移动

void OnRight()

{

BLOCKINFO tmp = g _ CurBlock

tmp . x++;

if(检查块(tmp))

{

DrawBlock(g_CurBlock,HIDE);

g _ curb lock . x++;

draw block(g _ curb lock);

}

}

//向下移动框

void OnDown()

{

BLOCKINFO tmp = g _ CurBlock

tmp . y-;

if(检查块(tmp))

{

DrawBlock(g_CurBlock,HIDE);

g _ curb lock . y-;

draw block(g _ curb lock);

}

其他

OnSink();//如果不能下移,则执行“沉盒”操作。

}

//接收框

void OnSink()

{

int i,x,y;

//连续向下移动框

DrawBlock(g_CurBlock,HIDE);

BLOCKINFO tmp = g _ CurBlock

tmp . y-;

while(检查块(tmp))

{

g _ curb lock . y-;

tmp . y-;

}

DrawBlock(g_CurBlock,FIX);

//修复游戏区域中的框

WORD b = g_Blocks[g_CurBlock.id]。dir[g _ curb lock . dir];

for(I = 0;我& lt16;i++)

{

如果(b & amp0x8000)

{

if(g _ curb lock . y-I/4 & gt;=高度)

{//如果箱子的固定位置超过高度,结束游戏。

game over();

返回;

}

其他

g _ World[g _ curb lock . x+I % 4][g _ curb lock . y-I/4]= 1;

}

b & lt& lt= 1;

}

//检查是否需要消除线条并进行标记。

int row[4]= { 0 };

bool bRow = false

for(y = g _ curb lock . y;y & gt= max(g_CurBlock.y - 3,0);y -)

{

I = 0;

for(x = 0;x & lt宽度;x++)

if (g_World[x][y] == 1)

i++;

如果(i ==宽度)

{

bRow = true

row[g _ curb lock . y-y]= 1;

setfillstyle(WHITE,diag cross 2 _ FILL);

bar(0,(高度- y - 1) *大小+大小/ 2 - 2,宽度*大小- 1,(高度- y - 1) *大小+大小/2+2);

}

}

如果(浏览器)

{

//延迟200毫秒

睡眠(200);

//擦除刚刚标记的行。

图像img

for(I = 0;我& lt4;i++)

{

if(第[i]行)

{

for(y = g _ curb lock . y-I+1;y & lt身高;y++)

for(x = 0;x & lt宽度;x++)

{

g _ World[x][y-1]= g _ World[x][y];

g _ World[x][y]= 0;

}

getimage(& amp;img,0,0,WIDTH * SIZE,(HEIGHT-(g _ curb lock . y-I+1))* SIZE);

putimage(0,SIZE & amp;img);

}

}

}

//生成一个新框

new block();

}