Fork me on GitHub

c语言 贪食蛇小游戏

---恢复内容开始---

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>

//描述蛇的节点信息
typedef struct SnakeNode
{
int x;
int y;
} Snode;

//箱子:放置蛇的所有节点
Snode snakes[100];
//保存用户选择的方向
char dir='l'; // u d l r
//保存食物
Snode food;
//蛇身有效长度
int size=5;
//速度
int speed=300;

/**
自定义一个功能函数:给我一个坐标,我就能够把你定位
*/
void setPosition(int x,int y)
{
COORD point;
point.X=x;
point.Y=y;
//重置坐标
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),point);
}

/**
显示友好的游戏界面
*/
void wellcome()
{
setPosition(30,10);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),9);
printf("欢迎来到贪吃蛇的世界!");
setPosition(30,15);
//暂停
system("pause");
//清屏createFood
system("cls");
//输出操作提示
setPosition(30,10);
printf("使用向上、向下、向左、向右的方向键控制蛇的方向");
setPosition(30,11);
system("pause");
system("cls");
}

/*
功能模块:绘制围墙 1B=8bit A:1B 中文:2B
*/
void paintWall()
{
int index=0;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),11);
//上边。下边
for(index=0; index<58; index=index+2)
{
setPosition(index,0);
printf("■");
setPosition(index,26);
printf("■");
}
//左边、右边akes[0].x=oldX+2;
for(index=1; index<=26; index++)
{
setPosition(0,index);
printf("■");
setPosition(56,index);
printf("■");
}
}

/*检查新生成的食物的坐标是否和蛇身重合
*/
int isTogether(int x,int y)
{
int index=0;
for(index=0; index<size; index++)
{
if(snakes[index].x==x && snakes[index].y==y)
{
//重合
return 1;
}
}
//没有重合
return 0;
}

/*
创建食物
*/
void createFood()
{
//随机数字
//随机种子
int randX=0;
int randY=0;
srand(time(0));
//食物坐标随机
randY=rand()%24+1;
do
{
//只是能偶数
randX=rand()%54+2;
//检查是否和蛇身重合
}
while(!(randX%2==0 && isTogether(randX,randY)==0)) ;

food.x=randX;
food.y=randY;
setPosition(food.x,food.y);
printf("■");
}

/*
显示蛇:节点 蛇头 5节点
*/
void initSnake()
{
//蛇的节点起点位置
int x=24;
int y=5;
int index=0;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),8);
//输出5个节点
for(index=0; index<size; index++, x=x+2)
{
//设置节点的坐标
snakes[index].x=x;
snakes[index].y=y;
setPosition(snakes[index].x,snakes[index].y);
printf("■");
}
}

/*
清除蛇身图形
*/
void clearSnake()
{
int index=0;
for(index=0; index<size; index++)
{
setPosition(snakes[index].x,snakes[index].y);
printf(" ");
}
}

/*
解析用户的按键,改变方向值
*/
void selDir()
{

if(GetAsyncKeyState(VK_UP) && dir!='d' )
{
dir='u';
}
else if(GetAsyncKeyState(VK_DOWN) && dir!='u' )
{
dir='d';
}
else if(GetAsyncKeyState(VK_LEFT) && dir!='r')
{
dir='l';
}
else if(GetAsyncKeyState(VK_RIGHT) && dir!='l')
{
dir='r';
}
}

/*
移动蛇
*/
void moveSnake()
{

//蛇头的原来坐标
int oldX=snakes[0].x;
int oldY=snakes[0].y;
//两个临时变量
int tempX=0;
int tempY=0;
int index=0;
//重置一个新坐标
switch(dir)
{
case 'u':
snakes[0].x=oldX;
snakes[0].y=oldY-1;
break;
case 'd':
snakes[0].x=oldX;
snakes[0].y=oldY+1;
break;
case 'l':
snakes[0].x=oldX-2;
snakes[0].y=oldY;
break;
case 'r':
snakes[0].x=oldX+2;
snakes[0].y=oldY;
break;
}

//检查蛇头是否和食物重合
if(snakes[0].x==food.x && snakes[0].y==food.y)
{
size++;
createFood();
speed-=50;
if(speed<=0){
speed=10;
}
}
//检查蛇头是否碰到墙
if( snakes[0].x<=2 || snakes[0].x>54 || snakes[0].y<1 || snakes[0].y>26 )
{
//碰到墙
system("cls");
printf("gameover");
system("pause");
exit(0);
}
//自己吃自己
for(index=1; index<size; index++)
{
if(snakes[0].x==snakes[index].x && snakes[0].y==snakes[index].y)
{
//碰到墙
system("cls");
printf("gameover");
system("pause");
exit(0);
}
}

setPosition(snakes[0].x,snakes[0].y);
printf("■");
//移动除了蛇头之外的节点
for(index=1; index<size; index++)
{
//在移动节点之前保存节点的坐标
tempX=snakes[index].x;
tempY=snakes[index].y;
//重新指定新坐标,前一个节点留下的空白
snakes[index].x=oldX;
snakes[index].y=oldY;
//指定光标点
setPosition(snakes[index].x,snakes[index].y);
printf("■");
//重置原坐标
oldX=tempX;
oldY=tempY;
}
}

//主函数:语法结构(固定)运行时候,起点
int main()
{
wellcome();
//绘制围墙
paintWall();
initSnake();
createFood();
//清除蛇原来的图形
while(1)
{
selDir();
clearSnake();
moveSnake();
Sleep(speed);
}
return 0;
}

---恢复内容结束---

posted @ 2018-07-12 21:14  雪人奥特曼  阅读(354)  评论(0编辑  收藏  举报