如何用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);
} ?//用于设置颜色的函数