简易贪吃蛇游戏-命令栏运行

 软件: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);
}

运行界面

结束界面

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

——风吹花落——

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值