linux c++贪吃蛇代码,贪食蛇源码c++

这是一个使用C++编写的贪吃蛇游戏程序,包含游戏初始化、地图设置、蛇的移动、食物生成、碰撞检测等功能。玩家通过键盘控制蛇移动,吃到食物会增长,碰到边界或自身会游戏结束。程序还实现了隐藏光标和实时显示分数的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[c++]代码库#include

#include

#include

#include

#include

#define Map_long 20

#define Map_high 15

typedef struct snake{

int goods_class;

int direction;

}SNAKE;

/*-------------------------------------------------------*/

/* 全局变量声明区 */

/* 二维结构体数组里goods_class的值,0代表活动区域(空格),

* 1代表■(地图砖头),2代表★(食物),3代表●(蛇头)

* 3之后的数字代表◎(蛇身),3+蛇长度-1表示◎(蛇尾)*/

/*direction表示蛇移动的方向,↑8,↓2,←4,→6*/

SNAKE Snake[Map_high][Map_long] = { { 0 } };

unsigned die = 0; //1表示游戏结束

unsigned snake_move = 0; //移动成功,用来跳出三重循环

unsigned eat_food = 0; //1表示碰到食物,2表示用来跳出循环

unsigned snake_long = 3; //记录蛇的长度

void Move(int ch); //蛇移动的函数

void HideCursor(); //隐藏光标函数

int main(void)

{

system("mode con:cols=43 lines=20"); //将控制台设置成长41,高18

HideCursor();

/*定义局部变量区域*/

unsigned i, j;

unsigned food = 0; //食物存在的标志,1代表食物存在

unsigned food_x, food_y; //产生食物的临时坐标

unsigned score = 0; //统计分数

char ch = '\0'; //用来获取↑↓←→

/*播种子*/

srand((unsigned)time(NULL));

/*初始化地图*/

for (i = 0; i < Map_long; i++)

{

Snake[0][i].goods_class = 1;

Snake[Map_high - 1][i].goods_class = 1;

}

for (i = 0; i < Map_high; i++)

{

Snake[i][0].goods_class = 1;

Snake[i][Map_long - 1].goods_class = 1;

}

/*初始化蛇的位置*/

for (i = 0; i < snake_long; i++)

Snake[Map_high / 2][Map_long / 2 + i].goods_class = snake_long + i;

while (1)

{

while (!_kbhit())

{

switch (ch)

{

case 72:Move(8); break;

case 75:Move(4); break;

case 77:Move(6); break;

case 80:Move(2); break;

default:break;

}

if (eat_food == 2) //2表示吃到食物,开始重置状态

{

food = 0; //食物没有了

eat_food = 0; //重新判定是否吃到食物

snake_long++; //蛇的长度加1

score++; //增加分数

}

/*产生食物*/

do{

if (food == 1)

break;

food_x = rand() % Map_long;

food_y = rand() % Map_high;

if (Snake[food_y][food_x].goods_class == 0)

{

Snake[food_y][food_x].goods_class = 2;

food++;

break;

}

} while (1);

printf("Grade:%u\n", score);

for (i = 0; i < Map_high; i++)

{

if (die == 1)

break;

for (j = 0; j < Map_long; j++)

{

switch (Snake[i][j].goods_class)

{

case 0:printf(" "); break;

case 1:printf("■"); break;

case 2:printf("★"); break;

case 3:printf("●"); break;

default:printf("◎"); break;

}

}

putchar('\n');

}

printf("Up↑ Down↓ Left← Right→ Other Pause.");

Sleep(50);

system("cls");

if (die == 1)

break;

}

if (die == 1)

break;

do{

ch = _getch();

} while (ch != -32 && ch != 80 && ch != 72 && ch != 77 && ch != 75);

ch = _getch();

}

system("cls");

printf("Game Over,your grade is %u.\n", score);

getchar();

return 0;

}

void Move(int ch)

{

int i, j, n;

int direction; //临时存储方向

for (n = 0; n < snake_long; n++)

for (i = 0; i < Map_high; i++)

{

if (snake_move == 1)

{

snake_move = 0;

break;

}

if (eat_food == 2)

break;

for (j = 0; j < Map_long; j++)

if (Snake[i][j].goods_class == 3 + n)

{

/*第一次获取按键,初始化蛇的运动状态*/

if (Snake[i][j].goods_class == 3 && Snake[i][j].direction == 0)

{

Snake[i][j].direction = ch;

Snake[i][j + 1].direction = 4;

Snake[i][j + 2].direction = 4;

}

else if (Snake[i][j].goods_class == 3) //重置蛇头的方向

Snake[i][j].direction = ch;

/*进行移动前,先判断蛇头是否碰到死亡因子*/

if (Snake[i][j].goods_class == 3)

{

if (Snake[i][j].direction == 8 && Snake[i - 1][j].goods_class != 0 && Snake[i - 1][j].goods_class != 2)

die++;

else if (Snake[i][j].direction == 2 && Snake[i + 1][j].goods_class != 0 && Snake[i + 1][j].goods_class != 2)

die++;

else if (Snake[i][j].direction == 4 && Snake[i][j - 1].goods_class != 0 && Snake[i][j - 1].goods_class != 2)

die++;

else if (Snake[i][j].direction == 6 && Snake[i][j + 1].goods_class != 0 && Snake[i][j + 1].goods_class != 2)

die++;

}

/*进行移动前,先判断蛇头是否碰到食物*/

if (Snake[i][j].goods_class == 3)

{

if (Snake[i][j].direction == 8 && Snake[i - 1][j].goods_class == 2)

eat_food++;

else if (Snake[i][j].direction == 2 && Snake[i + 1][j].goods_class == 2)

eat_food++;

else if (Snake[i][j].direction == 4 && Snake[i][j - 1].goods_class == 2)

eat_food++;

else if (Snake[i][j].direction == 6 && Snake[i][j + 1].goods_class == 2)

eat_food++;

}

if (die == 1)

break;

/*蛇尾的移动*/

if (Snake[i][j].goods_class == 3 + snake_long - 1)

{

if (eat_food == 1) //吃到食物就更新蛇尾

{

if (Snake[i][j].direction == 8)

{

direction = Snake[i - 1][j].direction;

Snake[i - 1][j] = Snake[i][j];

Snake[i - 1][j].direction = direction;

Snake[i][j].goods_class = 3 + snake_long;

}

else if (Snake[i][j].direction == 2)

{

direction = Snake[i + 1][j].direction;

Snake[i + 1][j] = Snake[i][j];

Snake[i + 1][j].direction = direction;

Snake[i][j].goods_class = 3 + snake_long;

}

else if (Snake[i][j].direction == 4)

{

direction = Snake[i][j - 1].direction;

Snake[i][j - 1] = Snake[i][j];

Snake[i][j - 1].direction = direction;

Snake[i][j].goods_class = 3 + snake_long;

}

else if (Snake[i][j].direction == 6)

{

direction = Snake[i][j + 1].direction;

Snake[i][j + 1] = Snake[i][j];

Snake[i][j + 1].direction = direction;

Snake[i][j].goods_class = 3 + snake_long;

}

snake_move++;

eat_food++;

break;

}

else{

if (Snake[i][j].direction == 8)

{

Snake[i][j].direction = Snake[i - 1][j].direction;

Snake[i - 1][j] = Snake[i][j];

Snake[i][j].goods_class = 0;

}

else if (Snake[i][j].direction == 2)

{

Snake[i][j].direction = Snake[i + 1][j].direction;

Snake[i + 1][j] = Snake[i][j];

Snake[i][j].goods_class = 0;

}

else if (Snake[i][j].direction == 4)

{

Snake[i][j].direction = Snake[i][j - 1].direction;

Snake[i][j - 1] = Snake[i][j];

Snake[i][j].goods_class = 0;

}

else if (Snake[i][j].direction == 6)

{

Snake[i][j].direction = Snake[i][j + 1].direction;

Snake[i][j + 1] = Snake[i][j];

Snake[i][j].goods_class = 0;

}

snake_move++;

break;

}

}

/*蛇头的移动*/

if (Snake[i][j].goods_class == 3)

{

if (Snake[i][j].direction == 8)

Snake[i - 1][j] = Snake[i][j];

else if (Snake[i][j].direction == 2)

Snake[i + 1][j] = Snake[i][j];

else if (Snake[i][j].direction == 4)

Snake[i][j - 1] = Snake[i][j];

else if (Snake[i][j].direction == 6)

Snake[i][j + 1] = Snake[i][j];

snake_move++;

break;

}

/*蛇身的移动*/

if (Snake[i][j].direction == 8)

{

direction = Snake[i - 1][j].direction;

Snake[i - 1][j] = Snake[i][j];

Snake[i - 1][j].direction = direction;

}

else if (Snake[i][j].direction == 2)

{

direction = Snake[i + 1][j].direction;

Snake[i + 1][j] = Snake[i][j];

Snake[i + 1][j].direction = direction;

}

else if (Snake[i][j].direction == 4)

{

direction = Snake[i][j - 1].direction;

Snake[i][j - 1] = Snake[i][j];

Snake[i][j - 1].direction = direction;

}

else if (Snake[i][j].direction == 6)

{

direction = Snake[i][j + 1].direction;

Snake[i][j + 1] = Snake[i][j];

Snake[i][j + 1].direction = direction;

}

snake_move++;

break;

}

}

}

void HideCursor()//隐藏光标函数

{

CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);

}

694748ed64b9390909c0d88230893790.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值