求一个用C语言写的小游戏代码。
# 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();
}