软件:VS2019
比较简陋,不要见怪。
自定义snake.h头文件:
#ifndef __SNAKE_H__ //头文件名字
#define __SNAKE_H__
#include <stdio.h> //printf;scanf
#include <stdlib.h> //system;srand
#include <time.h> //time
#include <Windows.h> //Sleep
#include <conio.h> //COORD:控制台光标位置;
#define WIDE 60 //游戏区域宽度
#define HIGH 20 //游戏区域高度
//定义蛇身体
struct BODY
{
int X;
int Y;
};
//定义蛇对象
struct SNAKE
{
struct BODY body[WIDE * HIGH];
int size;
}snake; //一个蛇对象
//定义食物对象
struct FOOD
{
int X;
int Y;
}food; //一个食物对象
//定义分数
int score = 0;
//接收用户按下的key值坐标
int keyX = 0;
int keyY = 0;
//定义蛇尾坐标
int lastX = 0;
int lastY = 0;
//定义初始蛇移动速度
int sleepSecond = 300;
//声明自定义函数
void initSnake(); //封装蛇初始化函数
void initFood(); //初始化食物
void initUI(); //初始化界面控件
void playGame(); //开始游戏
void initWall(); //画墙
void showScore(); //打印成绩
#endif
主函数test.c:
#define _CRT_SECURE_NO_WARNINGS //防止scnaf函数返回值被忽略报错
#include "snake.h" //自定义头文件
int main(void) {
srand(time(NULL)); //播种随机数种子,定义食物位置
//去除光标
CONSOLE_CURSOR_INFO cci;
cci.dwSize = sizeof(cci);
cci.bVisible = FALSE;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cci);
initWall(); //画墙
initSnake(); //封装蛇初始化函数
initFood(); //初始化食物
initUI(); //初始化界面控件
playGame(); //开始游戏
showScore(); //打印成绩
system("pause");
return 0;
}
//封装蛇初始化函数
void initSnake() {
snake.size = 2; //初始化蛇两节
snake.body[0].X = WIDE / 2; //初始化蛇头
snake.body[0].Y = HIGH / 2;
snake.body[1].X = WIDE / 2 - 1; //初始化一节蛇身
snake.body[1].Y = HIGH / 2;
}
//初始化食物
void initFood() {
food.X = rand() % WIDE; //0-59
food.Y = rand() % HIGH; //0-59
return;
}
//初始化界面控件
void initUI() {
//修改控制台光标位置,蛇头位置
COORD coord = {0};
//int snakelong = snake.size; //将蛇的长度转到另一个常量中,防止编译器报错
for (size_t i = 0; i < snake.size; i++)
{
coord.X = snake.body[i].X;
coord.Y = snake.body[i].Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
if (i == 0)
{
putchar('@');
}
else
{
putchar('*');
}
}
//去除蛇尾,同时去除了cls清屏操作
coord.X = lastX;
coord.Y = lastY;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar(' ');
//画食物
coord.X = food.X;
coord.Y = food.Y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
putchar('#');
}
//开始游戏
void playGame() {
char key = 'd'; //初始化定义key的值,默认蛇头向右移动
//判断蛇头和墙碰撞
while (snake.body[0].X > 0 && snake.body[0].X < WIDE &&
snake.body[0].Y > 0 && snake.body[0].Y < HIGH)
{
initUI(); //更新蛇位置
//接收用户按键输入 ASDW
if (_kbhit()) //编译出错时使用 kbhit();用于不阻塞判断用户按下按键
{
key = _getch(); //编译出错时使用 getch();
}
//判断key值,控制方向
switch (key)
{
case 'w':
keyX = 0; keyY = -1; break;
case 's':
keyX = 0; keyY = +1; break;
case 'd':
keyX = +1; keyY = 0; break;
case 'a':
keyX = -1; keyY = 0; break;
default:
break;
}
//判断蛇头和身体碰撞
for (int i = 1; i < snake.size; i++)
{
if (snake.body[0].X == snake.body[i].X &&
snake.body[0].Y == snake.body[i].Y)
{
return; //游戏结束
}
}
//判断蛇头和食物碰撞
if (snake.body[0].X == food.X && snake.body[0].Y == food.Y)
{
initFood(); //食物消失
snake.size++; //身体增长
score += 10; //加分
sleepSecond+=5; //加速
}
//记录蛇尾坐标,转到 initUI()中查看
lastX = snake.body[snake.size - 1].X;
lastY = snake.body[snake.size - 1].Y;
//蛇移动,前一节身体的坐标赋值给后一节身体
for (size_t i = snake.size - 1; i > 0; i--)
{
snake.body[i].X = snake.body[i - 1].X;
snake.body[i].Y = snake.body[i - 1].Y;
}
snake.body[0].X += keyX; //蛇头坐标根据按键进行修改
snake.body[0].Y += keyY;
Sleep(sleepSecond); //间隔300毫秒移动一次
//system("cls"); //清屏
}
return; //游戏结束
}
//画墙
void initWall() {
for (size_t i = 0; i <= HIGH; i++)
{
for (size_t j = 0; j <= WIDE; j++)
{
if (j == WIDE)
{
printf("|");
}
else if (i == HIGH)
{
printf("_");
}
else
{
printf(" ");
}
}
printf("\n");
}
}
//打印成绩
void showScore() {
//防止光标干扰
COORD coord = { 0 };
coord.X = 0;
coord.Y = HIGH + 2;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
printf("GAME OVER!!!\n");
printf("成绩为:%d\n",score);
}
运行界面
结束界面