#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<time.h>
struct COOR
{
int x;
int y;
};
struct SNAKE
{
int length;//蛇长
COOR body[500];//蛇的身体
char dir;//蛇的方向 上72 左75 右77 下80
};
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);//获取标准输出句柄
int food_x, food_y;//食物坐标
int score = 0;
int interval = 250;
int level = 1;
int count = 0;
char KEY = 77;
int eat = 0;
int gameover = 0;
SNAKE snake = {3, {6, 0}, 77};
void InitConsole()
{
srand((long)time(NULL));
system ("mode con: cols=60 lines=30");//可以在命令提示符中输入mode /?查询此用法
system ("title 贪吃蛇");
SetConsoleTextAttribute(hConsole, 0xe);
}
void gotoxy(int x, int y)//设置光标坐标
{
COORD coord;
coord.X = x;
coord.Y = y;
SetConsoleCursorPosition (hConsole, coord);
}
void Print()
{
gotoxy(0, 28);
printf("Score:%d\t\tLevel:%d",score, level) ;
}
void SetLevel()//设置游戏难度
{
if (count == 10)
{
count = 0;
level++;
interval -= 50;
}
Print();
}
void Wall()//初始化边界
{
int x, y;
for (x = 0; x <= 58; x+= 2)
{
gotoxy(x, 0);
printf("■");
gotoxy(x, 26);
printf("■");
}
for (y = 0; y <= 26; y++)
{
gotoxy(0, y);
printf("■");
gotoxy(58, y);
printf("■");
}
}
void InitFood()
{
eat = 0;
while (1)
{
food_x = (rand() % 28 + 1) * 2;
food_y = rand() % 24 +1;
int i;
for (i = 0; i < snake.length; i++)
{
if (food_x == snake.body[i].x && food_y == snake.body[i].y)
break;
}
if (i == snake.length)
break;
}
gotoxy(food_x, food_y);
printf("●");
SetLevel();
}
void InitSnake()
{
for (int i = 0; i <= snake.length; i++)
{
snake.body[i].x = 6 - i * 2;
snake.body[i].y = 1;
gotoxy(snake.body[i].x, snake.body[i].y);
printf("■");
}
}
int InSnake(int x, int y)//判断蛇是否吃到自己
{
int flag = 0;
for (int i = 1; i < snake.length; i++)
{
if (x == snake.body[i].x && y == snake.body[i].y)
{
flag = 1;
break;
}
}
return flag;
}
int Over()//判断游戏是否结束
{
int x = snake.body[0].x;
int y = snake.body[0].y;
if (InSnake (x, y) || x == 0 || x == 60 || y == 0 || y == 27)
return 1;
else
return 0;
}
void MoveSnake(char key)
{
int snake_x = snake.body[0].x;
int snake_y = snake.body[0].y;
switch (key)
{
case 72:
snake_y--;
break;
case 75:
snake_x -= 2;
break;
case 77:
snake_x += 2;
break;
case 80:
snake_y++;
break;
default:
break;
}
if (Over())
{
gameover = 1;
}
else
{
if (snake_x == food_x && snake_y == food_y)
{
score += 100;
++snake.length;
count++;
eat = 1;
}
else
{
gotoxy (snake.body[snake.length - 1].x, snake.body[snake.length - 1].y);
printf(" ");
}
gotoxy (snake_x, snake_y);
printf("■");
for (int i = snake.length - 1; i > 0; i--)
{
snake.body[i] = snake.body[i - 1];
}
snake.body[0].x = snake_x;
snake.body[0].y = snake_y;
KEY = key;
}
}
void Play()//游戏控制
{
char key1 = 0, key2 = 0;
while (key1 != 27 && (!gameover))
{
Sleep(interval);
if ( kbhit() )//如果有按键按下,kbhit返回1,否则返回0
{
key1 = getch();//接收键码
if (key1 <= 0)
key2 = getch();//继续接收键码
if (key2 == 72 || key2 == 75 || key2 == 77 || key2 == 80)//说明是方向键
{
if (key2 != KEY && key2 + KEY != 152)//说明是使蛇转向的方向键
MoveSnake(key2);
else
MoveSnake(KEY);
}
else
MoveSnake(KEY);
}
else
MoveSnake(KEY);
if (eat == 1)
InitFood();
}
}
int main(void)
{
InitConsole();
Wall();
InitFood();
InitSnake();
Play();
return 0;
}
C_贪吃蛇
最新推荐文章于 2013-05-17 17:16:14 发布