有一些bug没有解决,后续跟新
背景图片和全局变量放在头文件里
#pragma once
#define DEF_SNAKE_LONG 20
char g_strGameBack[20][48] = {"▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇ ▇\n",
"▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇\n" };
// 蛇的方向
enum {to_east = 2, to_west = -2, to_north = -1, to_south = 1};
// 蛇数组
int g_arrSnake[DEF_SNAKE_LONG][3] = { 0 };
// 蛇的方向
int g_nSnakeDir = 1;
// 食物标记
bool g_bIsProFood = true;
// 蛇的长度
int g_nSnakeLen = 2;
// 食物的随机坐标
int g_nrow = 0;
int g_ncol = 0;
int g_nScore = 0;
#include "head.h"
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<Windows.h>
#include<mmstream.h>
#pragma comment(lib,"winmm.lib")
// 显示首页
void FirstPage();
// 播放音乐
void MyPlaySound();
// 停止播放音乐
void MyStopSound();
// 画背景图片
void ShowBackground();
// 为蛇产生一个随机的位置
void SetSnakeRandPos();
// 画蛇
void DrawSnake();
// 蛇移动
void SnakeMove();
// 销毁蛇
void DropSnake();
// 改变蛇方向
void ChangeDir();
// 蛇的死亡判断
bool IsSnakeDie();
// 产生新的食物
void ProduceFood();
// 蛇变长
void SnakeGrowUp();
// 计分
void Score();
int main()
{
char chInput;
// 播放音乐
MyPlaySound();
// 显示首页
FirstPage();
// 为蛇产生一个随机的位置
SetSnakeRandPos();
while (1)
{
chInput = _getch();
if (chInput == ' ')
{
break;
}
}
// 停止播放
MyStopSound();
// 清理屏幕
system("cls");
// 为蛇产生一个随机位置
SetSnakeRandPos();
ShowBackground();
// 游戏界面
while (1)
{
system("cls");
// 产生食物
ProduceFood();
// 判断蛇与食物关系
SnakeGrowUp();
// 监听键盘状态
ChangeDir();
// 检测蛇与背景的碰撞
if (!IsSnakeDie())
{
printf("snake die\n");
break;
}
// 蛇动
SnakeMove();
// 显示背景
ShowBackground();
Score();
Sleep(1000);
}
return 0;
}
// 显示首页
void FirstPage()
{
printf("\n\n\n\n");
printf("\t\t\t 《欢迎进入贪吃蛇世界》\n\n");
printf("\t\t\t 《按空格键开始游戏》\n");
printf("\t\t\t《w a s d 控制蛇的方向》\n");
}
// 播放音乐
void MyPlaySound()
{
PlaySound(L"1.wav", NULL, SND_FILENAME | SND_ASYNC);
}
// 停止播放音乐
void MyStopSound()
{
PlaySound(NULL, 0, 0);
}
// 显示背景
void ShowBackground()
{
system("cls");
for (int i = 0; i < 20; i++)
printf(g_strGameBack[i]);
}
// 随机产生蛇的初始位置
void SetSnakeRandPos()
{
int nX = -1;
int nY = -1;
// 产生随机数
srand((unsigned int)time(NULL)); //种种子
nX = rand() % 19 + 1;
nY = rand() % 18 + 1;
g_arrSnake[0][0] = nY;
g_arrSnake[0][1] = nX*2;
g_arrSnake[0][2] = to_east;
g_arrSnake[1][0] = nY;
g_arrSnake[1][1] = nX*2+ 2;
g_arrSnake[1][2] = to_east;
g_arrSnake[2][0] = nY;
g_arrSnake[2][1] = nX*2 + 4;
g_arrSnake[2][2] = to_east;
}
// 画蛇
void DrawSnake()
{
for (int i = 0; g_arrSnake[i][0] != 0; i++)
{
// 只复制两个字符(去掉结尾\0)
strncpy(&g_strGameBack[g_arrSnake[i][0]][g_arrSnake[i][1]],"▇", 2);
}
}
// 蛇移动
void SnakeMove()
{
// 销毁原来蛇背景
DropSnake();
for (int i = DEF_SNAKE_LONG - 1; i >= 1; i--)
{
// 过滤掉没有的蛇身
if (g_arrSnake[i][1] == 0)
continue;
g_arrSnake[i][0] = g_arrSnake[i - 1][0];
g_arrSnake[i][1] = g_arrSnake[i - 1][1];
g_arrSnake[i][2] = g_arrSnake[i - 1][2];
}
// 处理蛇头
g_arrSnake[0][2] = g_nSnakeDir;
// 东西移动
if (to_west == g_arrSnake[0][2] || to_east == g_arrSnake[0][2])
g_arrSnake[0][1] += g_arrSnake[0][2];
// 南北移动
else
g_arrSnake[0][0] += g_arrSnake[0][2];
// 画蛇
DrawSnake();
}
// 销毁蛇
void DropSnake()
{
for (int i = 0; g_arrSnake[i][0] != 0; i++)
{
// 只复制两个字符(去掉结尾\0)
strncpy(&g_strGameBack[g_arrSnake[i][0]][g_arrSnake[i][1]], " ", 2);
}
}
void ChangeDir()
{
// 监听键盘输入
if (GetAsyncKeyState('W') && g_arrSnake[0][2]!=to_south)
{
g_nSnakeDir = to_north;
}
else if (GetAsyncKeyState('S') && g_arrSnake[0][2]!= to_north)
{
g_nSnakeDir = to_south;
}
else if (GetAsyncKeyState('A') && g_arrSnake[0][2]!=to_east)
{
g_nSnakeDir = to_west;
}
else if (GetAsyncKeyState('D') && g_arrSnake[0][2]!=to_west)
{
g_nSnakeDir = to_east;
}
}
bool IsSnakeDie()
{
// 判断蛇头下一个位置是否为方块
if (to_west == g_arrSnake[0][2] || to_east == g_arrSnake[0][2])
{
if (strncmp(&g_strGameBack[g_arrSnake[0][0]][g_arrSnake[0][1] + g_arrSnake[0][2]], "▇", 2) == 0)
return false;
}
else
{
if (strncmp(&g_strGameBack[g_arrSnake[0][0] + g_arrSnake[0][2]][g_arrSnake[0][1]], "▇", 2) == 0)
return false;
}
return true;
}
// 产生新的食物
void ProduceFood()
{
srand((unsigned)time(NULL));
if (!g_bIsProFood)
return;
while (1)
{
g_nrow = rand() % 18 + 1;
g_ncol = rand() % 20 + 1;
bool flag = true;
for (int i = 0; g_arrSnake[i][0] != 0; i++)
{
if (g_nrow == g_arrSnake[i][0] && g_ncol == g_arrSnake[i][1])
{
flag = false;
}
}
if (flag)
break;
}
strncpy(&g_strGameBack[g_nrow][g_ncol], "★", 2);
g_bIsProFood = false;
}
void SnakeGrowUp()
{
// 蛇头坐标跟食物坐标是否相等
if (g_nrow == g_arrSnake[0][0] && g_ncol*2 == g_arrSnake[0][1])
{
// 判断尾巴的方向
if (to_east == g_arrSnake[g_nSnakeLen][2])
{
g_arrSnake[g_nSnakeLen + 1][0] = g_arrSnake[g_nSnakeLen][0];
g_arrSnake[g_nSnakeLen + 1][1] = g_arrSnake[g_nSnakeLen][1] - 2;
g_arrSnake[g_nSnakeLen + 1][2] = g_arrSnake[g_nSnakeLen][2];
}
if (to_west == g_arrSnake[g_nSnakeLen][2])
{
g_arrSnake[g_nSnakeLen + 1][0] = g_arrSnake[g_nSnakeLen][0];
g_arrSnake[g_nSnakeLen + 1][1] = g_arrSnake[g_nSnakeLen][1] + 2;
g_arrSnake[g_nSnakeLen + 1][2] = g_arrSnake[g_nSnakeLen][2];
}
if (to_north == g_arrSnake[g_nSnakeLen][2])
{
g_arrSnake[g_nSnakeLen + 1][0] = g_arrSnake[g_nSnakeLen][0] + 1;
g_arrSnake[g_nSnakeLen + 1][1] = g_arrSnake[g_nSnakeLen][1];
g_arrSnake[g_nSnakeLen + 1][2] = g_arrSnake[g_nSnakeLen][2];
}
if (to_south == g_arrSnake[g_nSnakeLen][2])
{
g_arrSnake[g_nSnakeLen + 1][0] = g_arrSnake[g_nSnakeLen][0] - 1;
g_arrSnake[g_nSnakeLen + 1][1] = g_arrSnake[g_nSnakeLen][1];
g_arrSnake[g_nSnakeLen + 1][2] = g_arrSnake[g_nSnakeLen][2];
}
g_bIsProFood = true;
g_nSnakeLen++;
g_nScore++;
}
}
void Score()
{
COORD rd;
rd.X = 55;
rd.Y = 8;
// 设置光标位置
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), rd);
// 打印
printf("分数");
rd.X = 55;
rd.Y = 9;
// 设置光标位置
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), rd);
printf("%d", g_nScore);
}