#include <graphics.h>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
#define SNAKE_NUM 500//蛇的最大节数
#define WINDOW_HEIGHT 480 //高度
#define WINDOW_WIDTH 640 //宽度
struct Snake{
POINT coor[SNAKE_NUM]; //坐标
int size; //节数
int direction; //方向
int speed;
}snake;
struct Food
{
int x;
int y;
int r;
bool flag;
DWORD color;
}food;
//初识化方向(枚举)
enum DIR
{
UP,
DOWN,
LEFT,
RIGHT,
};
//死亡提示框
HWND hwnd = NULL;
//数据初始化
void GameInit()
{
//初始化graph 窗口
initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
//初始化蛇
snake.size = 3;
snake.speed = 10;
snake.direction = RIGHT;
for (int i =0; i<snake.size; ++i){
snake.coor[i].x = 40-10*i;
snake.coor[i].y = 10;
}
//初始化食物
srand(GetTickCount()); //设置随机数种子 GetTickCount()是用来获取系统开机,到现在缩经过的毫秒数
food.x = rand() % WINDOW_WIDTH;
food.y = rand() % WINDOW_HEIGHT;
food.color = RGB(200, 10, 0);
food.flag = true;
food.r = 6;
}
//绘制窗口
void GameDraw()
{
BeginBatchDraw(); //双缓冲绘图
setbkcolor(RGB(65, 130, 160));
cleardevice(); //使用当前背景色清空绘图设备
//绘制蛇
//半径为5的实心圆
for (int i=0;i<snake.size;++i){
setfillcolor(GREEN);
solidcircle(snake.coor[i].x, snake.coor[i].y, 5);
}
if(food.flag){
setfillcolor(food.color);
solidcircle(food.x,food.y,5);
}
EndBatchDraw();
}
void snakeMove()
{
//让第2个蛇身跟着第一个移动
for(int i=snake.size-1; i>0; --i){
snake.coor[i] = snake.coor[i-1];
}
switch (snake.direction)
{
case UP:
snake.coor[0].y -= snake.speed;
snake.coor[0].y = (WINDOW_HEIGHT + snake.coor[0].y) % WINDOW_HEIGHT;
break;
case DOWN:
snake.coor[0].y += snake.speed;
snake.coor[0].y = snake.coor[0].y % WINDOW_HEIGHT;
break;
case LEFT:
snake.coor[0].x -= snake.speed;
snake.coor[0].x = (WINDOW_WIDTH + snake.coor[0].x) % WINDOW_WIDTH;
break;
case RIGHT:
snake.coor[0].x += snake.speed;
snake.coor[0].x = snake.coor[0].x % WINDOW_WIDTH;
break;
}
}
//通过按键改变蛇的方向
void keyControl(){
if(_kbhit()!=0) //有按键被按下
{
switch (_getch()) //从控制台中获取输入的字符
{
case'w':
case'W':
case 72:
if(snake.direction != DOWN){
snake.direction = UP;
}
break;
case's':
case'S':
case 80:
if(snake.direction != UP){
snake.direction = DOWN;
}
break;
case'a':
case'A':
case 75:
if(snake.direction != RIGHT){
snake.direction = LEFT;
}
break;
case'd':
case'D':
case 77:
if(snake.direction != LEFT){
snake.direction = RIGHT;
}
break;
case ' ':
//阻塞函数,直到有字符输入时才会返回
while (_getch() != ' '){ }
break;
}
}
}
void EatFood(){
if(food.flag && snake.coor[0].x >= food.x -food.r && snake.coor[0].x <= food.x +food.r //接触到食物就算被吃
&& snake.coor[0].y >= food.y -food.r && snake.coor[0].y <= food.y +food.r)
{
food.flag = false;
snake.size++;
}
if(! food.flag) //食物被吃完立刻再随机生成一个
{
food.x = rand() % WINDOW_WIDTH;
food.y = rand() % WINDOW_HEIGHT;
food.color = RGB(200, 10, 0);
food.flag = true;
food.r = 6;
}
}
//蛇死亡
int snakeDie()
{
/*用时取消即可
//玩法2,撞墙死
if (snake.coor[0].x > 640 || snake.coor[0].x < 0 ||
snake.coor[0].y>480 || snake.coor[0].y < 0)
{
outtextxy(200, 200,"你撞墙啦!");
MessageBox(hwnd, "Game Over!","撞墙警告", MB_OK);
return 1;
}
*/
//通用代码:自己吃自己
for (int i = 4; i < snake.size; i++)
{
if (snake.coor[0].x == snake.coor[i].x &&
snake.coor[0].y == snake.coor[i].y )
{
outtextxy(200, 200, "你撞到自己啦!");
MessageBox(hwnd, "Game Over!", "自杀警告", MB_OK);
return 1;
}
}
return 0;
}
int main()
{
GameInit();
while (1)
{
GameDraw();
if (snakeDie()){
break;
}
snakeMove();
keyControl();
EatFood();
Sleep(80);
}
getchar();
return 0;
}
贪吃蛇(C语言小游戏)
最新推荐文章于 2024-03-23 21:04:25 发布