会c语言写贪吃蛇,C语言写贪吃蛇

#include

#include

#include

#include

#include

/* 地图长和宽 */

#define MAPHEIGHT 25

#define MAPWIDTH 60

#define SNAKSIZE 50

// 数据结构设计

int changeFlag = 0; // 蛇变化标记

int key = 'w';

// 食物位置

struct _food_

{

int x;

int y;

}food;

// 贪吃蛇数据结构

struct snake

{

int x[SNAKSIZE]; // 蛇坐标

int y[SNAKSIZE];

int len; // 当前长度

int speed; // 移动速度

}mysnake;

// cmd移动辅助函数

void gotoxy(int x, int y)

{

// 获取cmd窗口句柄

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);

// 光标位置

COORD coord;

coord.X = x;

coord.Y = y;

SetConsoleCursorPosition(handle, coord);

}

// 绘制地图

void drawMap()

{

srand((unsigned int)time(NULL));

// 食物

// 1.食物属性

food.x = rand() % (MAPWIDTH - 4) + 2;

food.y = rand() % (MAPHEIGHT - 2) + 1;

// 2.画食物

gotoxy(food.x, food.y);

printf("⊙");

// 蛇

// 1.蛇属性

mysnake.x[0] = MAPWIDTH / 2; // 定位在中间

mysnake.y[0] = MAPHEIGHT / 2;

// 2.画蛇

gotoxy(mysnake.x[0], mysnake.y[0]);

printf("■");

mysnake.len = 3;

mysnake.speed = 100;

for (int i = 1; i < mysnake.len; ++i) {

mysnake.x[i] = mysnake.x[i - 1] + 2;

mysnake.y[i] = mysnake.y[i - 1];

gotoxy(mysnake.x[i], mysnake.y[i]);

printf("■");

}

// 边框

// 1.左右

for (int i = 0; i < MAPHEIGHT; ++i) {

gotoxy(0, i);

printf("■");

gotoxy(MAPWIDTH, i);

printf("■");

}

// 2.上下

for (int i = 0; i < MAPWIDTH; ++i) {

gotoxy(i, 0);

printf("■");

gotoxy(i, MAPHEIGHT);

printf("■");

}

}

// 按键检测

void keyDown()

{

key = _getch();

switch (key)

{

case 'w':

case 'W':

case 72:

mysnake.y[0]--;

break;

case 's':

case 'S':

case 80:

mysnake.y[0]++;

break;

case 'a':

case 'A':

case 75:

mysnake.x[0] -= 2;

break;

case 'd':

case 'D':

case 77:

mysnake.x[0] += 2;

break;

default:

return;

}

gotoxy(mysnake.x[0], mysnake.y[0]);

printf("■");

changeFlag = 0;

gotoxy(MAPHEIGHT + 2, 0);

}

// 产生食物

void createFood()

{

if (mysnake.x[0] == food.x && mysnake.y[0] == food.y)

{

srand((unsigned int)time(NULL));

while (1)

{

int flag = 1;

food.x = rand() % (MAPWIDTH - 4) + 2;

food.y = rand() % (MAPHEIGHT - 2) + 1;

for (int i = 0; i < mysnake.len; ++i) {

if (mysnake.x[i] == food.x && mysnake.y[i] == food.y) {

flag = 0;

break;

}

}

// 食物坐标要为偶数且不能在蛇的身上

if (flag && food.x % 2 == 0)

break;

}

gotoxy(food.x, food.y);

printf("⊙");

mysnake.len++;

changeFlag = 1;

}

}

// 蛇状态

int snakeStatus()

{

if (mysnake.x[0] == 0 || mysnake.x[0] == MAPHEIGHT - 2

|| mysnake.y[0] == MAPWIDTH - 2 || mysnake.y[0] == 0)

{

return 0;

}

for (int i = 1; i < mysnake.len; ++i) {

if (mysnake.x[i] == mysnake.x[0] && mysnake.y[i] == mysnake.y[0])

return 0;

}

return 1;

}

int main()

{

drawMap();

while (1)

{

createFood();

Sleep(mysnake.speed);

keyDown();

if (!snakeStatus())

break;

}

MessageBox(NULL, TEXT("GameOver"), TEXT("提示"), MB_OK | MB_ICONWARNING);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值