写一条贪吃蛇的c++代码
时间: 2023-08-31 07:24:02 浏览: 48
### 回答1:
#include <stdio.h>
int main()
{
int i, j, k;
int a[25][25], s[25][25];
int x=1, y=0;
int m, n, p;
int d, e;
int h=0;
int f=0;
int q=3;
int w=2; /* 设置游戏场地 */
m=20;
n=20;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
a[i][j]=0; /* 设置贪吃蛇 */
for(i=0;i<3;i++)
{
a[x][y]=1;
x++;
} /* 初始化蛇头 */
s[0][0]=2;
p=1;
d=0;
e=1; /* 开始游戏 */
while(1)
{
/* 清屏 */
system("cls"); /* 生成食物 */
if(h==0)
{
q=rand()%19+1;
w=rand()%19+1;
if(a[q][w]==0)
{
a[q][w]=3;
h=1;
}
} /* 打印场地 */
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]==0)
printf("□");
else if(a[i][j]==1)
printf("■");
else if(a[i][j]==2)
printf("★");
else if(a[i][j]==3)
printf("●");
}
printf("\n");
} /* 蛇走一步 */
x=x+d;
y=y+e; /* 蛇头坐标 */
s[p][0]=x;
s[p][1]=y; /* 吃到食物 */
if(a[x][y]==3)
{
h=0;
f=f+100;
a[q][w]=1;
a[x][y]=2;
p++;
} /* 撞墙 */
else if(a[x][y]==1)
{
printf("Game Over!\n");
break;
} /* 普通走一步 */
else
{
a[x][y]=2;
a[s[p-1][0]][s[p-1][1]]=0;
p++;
} /* 移动蛇头 */
for(k=0;k<p-1;k++)
{
s[k][0]=s[k+1][0];
s[k][1]=s[k+1][1];
} /* 方向控制 */
if(x==m||x==-1||y==n||y==-1)
break;
if(kbhit())
{
switch(getch())
{
case 'w':
d=-1;
e=0;
break;
case 's':
d=1;
e=0;
break;
case 'a':
d=0;
e=-1;
break;
case 'd':
d=0;
e=1;
break;
}
} /* 休眠 */
Sleep(100);
}
return 0;
}
### 回答2:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define WIDTH 20 // 定义游戏界面的宽度
#define HEIGHT 20 // 定义游戏界面的高度
int score = 0; // 分数
int gameover = 0; // 游戏结束标志
// 定义各个方向的键盘值
#define UP 72
#define DOWN 80
#define LEFT 75
#define RIGHT 77
// 定义蛇的结构体
struct Snake {
int x, y; // 蛇头所在的位置
struct Snake* next; // 指向下一个节点的指针
}*head, *tail, *food;
// 初始化游戏
void initGame() {
score = 0;
gameover = 0;
head = (struct Snake*)malloc(sizeof(struct Snake));
head->x = WIDTH / 2;
head->y = HEIGHT / 2;
head->next = NULL;
tail = head;
// 随机生成食物的位置
food = (struct Snake*)malloc(sizeof(struct Snake));
srand((unsigned)time(NULL));
food->x = rand() % (WIDTH - 2) + 1;
food->y = rand() % (HEIGHT - 2) + 1;
}
// 绘制游戏界面
void drawGame() {
system("cls");
for (int i = 0; i < WIDTH + 2; i++) {
printf("#");
}
printf("\n");
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (j == 0 || j == WIDTH - 1) {
printf("#");
}
else if (i == head->y && j == head->x) {
printf("@");
}
else if (i == food->y && j == food->x) {
printf("$");
}
else {
struct Snake* temp = head->next;
int isBody = 0;
while (temp != NULL) {
if (temp->x == j && temp->y == i) {
printf("*");
isBody = 1;
break;
}
temp = temp->next;
}
if (!isBody) {
printf(" ");
}
}
}
printf("\n");
}
for (int i = 0; i < WIDTH + 2; i++) {
printf("#");
}
printf("\n");
printf("Score: %d\n", score);
}
// 游戏循环
void gameLoop() {
int direction = RIGHT; // 初始方向设为向右
while (!gameover) {
if (_kbhit()) {
int key = _getch(); // 获取键盘输入
switch (key) {
case UP:
direction = UP;
break;
case DOWN:
direction = DOWN;
break;
case LEFT:
direction = LEFT;
break;
case RIGHT:
direction = RIGHT;
break;
}
}
// 移动蛇头
switch (direction) {
case UP:
head->y--;
break;
case DOWN:
head->y++;
break;
case LEFT:
head->x--;
break;
case RIGHT:
head->x++;
break;
}
// 判断是否吃到食物
if (head->x == food->x && head->y == food->y) {
score++;
struct Snake* body = (struct Snake*)malloc(sizeof(struct Snake));
body->x = tail->x;
body->y = tail->y;
body->next = NULL;
tail->next = body;
tail = body;
// 重新生成食物
food->x = rand() % (WIDTH - 2) + 1;
food->y = rand() % (HEIGHT - 2) + 1;
}
// 判断是否撞墙或者撞到自身
if (head->x <= 0 || head->x >= WIDTH - 1 || head->y <= 0 || head->y >= HEIGHT - 1) {
gameover = 1;
break;
}
struct Snake* temp = head->next;
while (temp != NULL) {
if (head->x == temp->x && head->y == temp->y) {
gameover = 1;
break;
}
temp = temp->next;
}
// 重绘游戏界面
drawGame();
// 暂停一些时间,控制游戏速度
Sleep(100);
}
}
// 游戏结束,释放内存
void gameoverFunc() {
struct Snake* temp = head;
while (temp != NULL) {
struct Snake* next = temp->next;
free(temp);
temp = next;
}
free(food);
}
int main() {
initGame();
drawGame();
gameLoop();
gameoverFunc();
printf("Game Over!\n");
system("pause");
return 0;
}