如何用C语言写一个小游戏?

“蛇”的C代码:

# include & ltstdio.h & gt

# include & ltstdlib.h & gt

# include & ltconio.h & gt

# include & lttime.h & gt

# include & ltWindows.h & gt

#定义W 78?//游戏框的宽度,x轴

#定义H 26?//游戏框的高度,y轴

int dir = 3;?//方向变量,初始值为3表示“左”

int Flag = 0;//吃菜的标志(1为0,否)

int得分= 0;?//玩家得分

结构食品{ int x;?//食物的x坐标

int y;?//食物的Y坐标

} fod?//结构fod有两个成员。

struct snake { int len?//长度

?int速度;?//速度

?int x[100];

?int y[100];

} snk?//结构snk有四个成员。

void gtxy( int x,int y)?//控制光标移动的函数

{ COORD coord

坐标。X = x

坐标。Y = y

SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE),coord);

}

void gtxy( int x,int y);?//以下语句是关于几个要使用的自制函数。

void csh();?//初始化接口

void key move();//按键移动蛇。

void put fod();?//放入食物

int?over();//游戏结束(1是0,否)

void setColor(无符号短p,无符号短q);//设置显示颜色

int main()??//主函数

{ csh();

?while(1)

{ Sleep(snk . speed);

?key move();

?put fod();

?if(Over())

?{ system(" cls ");

?gtxy(W/2+1,H/2);Printf("游戏结束!T _ _ T”);

?gtxy(W/2+1,H/2+2);Printf("总玩家分数:%d ",分数);

?getch();

?打破;

?}

}

返回0;

}

void csh()?//初始化接口

{ int I;

gtxy(0,0);

CONSOLE _ CURSOR _ INFO CURSOR _ INFO = { 1,0 };?//下面两行是隐藏光标的设置。

SetConsoleCursorInfo(GetStdHandle(STD _ OUTPUT _ HANDLE),& ampcursor _ info);

for(I = 0;我& lt= W;i=i+2)?//横坐标应该是偶数,因为这个要打印的字符占了2个位置。

{ setColor(2,0);?//将打印颜色设置为绿色和黑色。

gtxy(i,0);?printf("■");?//打印上边框

gtxy(i,H);printf("■");?//打印下边框

}

for(I = 1;我& lth;i++)

{ gtxy(0,I);printf("■");?//打印左边框

gtxy(W,I);printf("■");?//打印右边框

}

while(1)

{ srand((无符号)时间(空));?//初始化随机数生成器srand()

fod . x = rand()%(W-4)+2;?//随机函数rand()生成一个从0到1小于“(W-4)”加2的数。

fod . y = rand()%(H-2)+1;?//随机函数rand()生成一个从0到1小于“(H-2)”加1的数。

if(fod . x % 2 = = 0)break;?//fod.x是食物的横坐标,如果是2的倍数(偶数)

}

setColor(12,0);?//将打印颜色设置为浅红色,黑色背景。

gtxy(fod.x,fod . y);printf("●");?//打印食物坐标处的初步食物。

snk . len = 3;?//蛇形长度

snk.speed = 350?//刷新蛇的时间就是移动速度。

snk . x[0]= W/2+1;?//蛇头的横轴应该是偶数(因为W/2=39)

snk . y[0]= H/2;?//蛇头纵坐标

setColor(9,0);?//将打印颜色设置为浅蓝色,黑色背景。

gtxy(snk.x[0],snk . y[0]);?printf("■");?//打印黑鱼

for(I = 1;我& ltsnk.leni++)

?{ snk . x[I]= snk . x[I-1]+2;?snk . y[I]= snk . y[I-1];

gtxy(snk.x[i],snk . y[I]);?printf("■");?//打印蛇体

}

setColor(7,0);?//恢复默认的白色字符和黑色背景。

返回;

}

void keymove()?//按键移动蛇。

{ int key

if( kbhit())?//如果有按键输入,执行以下操作。

{ key = getch();

if (key==224)?//值224表示已经按下了方向键,应该重新获取键值。

?{ key = getch();

if(key = = 72 & amp;& ampdir!= 2)dir = 1;?//72表示向上箭头键已被按下。

if(key = = 80 & amp;& ampdir!= 1)dir = 2;?//80向下。

if(key = = 75 & amp;& ampdir!= 4)dir = 3;?//75在左边。

if(key = = 77 & amp;& ampdir!= 3)dir = 4;?//77在右边。

?}

if (key==32)

{ while(1)if((key = getch())= = 32)break;}?//32是空格键,这里用来暂停。

}

if (Flag==0)?//如果你不吃食物,就做下面的事情把蛇的尾巴擦掉。

{ gtxy(snk.x[snk.len-1],snk . y[snk . len-1]);?printf("?);}

int I;

for(I = snk . len-1;我& gt0;我-)?//来自蛇头的每一段都存储上一段的坐标值(蛇头除外)。

{ snk . x[I]= snk . x[I-1];?snk . y[I]= snk . y[I-1];}

开关(dir)?//判断蛇头应该往哪个方向移动,得到最新的坐标值。

{ case 1:snk . y[0]-;打破;//dir=1向上移动。

?案例二:snk . y[0]++;打破;?//dir=2向下移动。

?情况三:snk . x[0]-= 2;打破;?//dir=3向左移动

?情况四:snk . x[0]+= 2;打破;?//dir=4向右移动

}

setColor(9,0);

gtxy(snk.x[0],snk . y[0]);printf("■");?//打印黑鱼

if(snk . x[0]= = fod . x & amp;& ampsnk.y[0] == fod.y)?//如果你吃食物,请执行以下操作。

{ printf(" \ 007 ");snk . len++;分数+= 100;snk . speed-= 5;flag = 1;} //007是铃铛。

else标志= 0;?//缺失食物标志的值为0。

if(snk . speed & lt;150)snk . speed = snk . speed+5;?//作弊代码,不是为了无限提速。

}

void putFod()?//放入食物

{ if (Flag == 1)?//如果食物被吃掉,执行以下操作生成另一个食物。

{ while (1)

{ int i,n = 1;

?srand((无符号)时间(空));?//初始化随机数生成器srand()

fod . x = rand()%(W-4)+2;?//在游戏框内生成一个X坐标值。

fod . y = rand()%(H-2)+1;?//在游戏框内生成一个Y坐标值。

for(I = 0;我& ltsnk.lenI++) //随机食物不能在蛇的身上。

{ if(fod . x = = snk . x[I]& amp;& ampfod . y = = snk . y[I]){ n = 0;打破;} }

?如果(n & amp& ampfod . x % 2 = = 0)break;?//n不为0,横坐标为偶数,则食物坐标值成功。

}

?setColor(12,0);

gtxy(fod.x,fod . y);?printf("●");?//光标移动到获得的坐标来打印食物。

}

返回;

}

int Over()?//判断游戏是否结束的函数

{ int?我;

setColor(7,0);

gtxy(2,H+1);Printf("暂停键:空格。");?//在下面打印一些其他信息。

gtxy(2,H+2);Printf("游戏分数:% d ",分数);

if (snk.x[0] == 0 || snk.x[0] == W)返回1;?//蛇头触及左右边界。

if (snk.y[0] == 0 || snk.y[0] == H)返回1;?//蛇头触及上下边界

for(I = 1;我& ltsnk.leni++)

{ if(snk . x[0]= = snk . x[I]& amp;& ampsnk.y[0] == snk.y[i])返回1;}?//黑鱼摸自己。

返回0;?//未触及边界及其本身时返回0。

}

void set color(unsigned short ForeColor = 7,unsigned short BackGroundColor = 0)

{?手柄?HANDLE = GetStdHandle(STD _ OUTPUT _ HANDLE);

SetConsoleTextAttribute( handle,ForeColor+background color * 0x 10);

} ?//用于设置颜色的函数