使用c语言写WIN32控制台小游戏 贪吃蛇

使用c语言写WIN32控制台小游戏 贪吃蛇

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<Windows.h>
#include<conio.h>

//宽度
#define WIDE 60
//高度
#define HIGH 20

//坐标结构体
struct Position
{
	int X;
	int Y;
};

typedef struct
{
	struct Position pos[WIDE*HIGH];//坐标
	int size;//长度
}SNAKE;

typedef struct
{
	struct Position pos;
}FOOD;

enum MyEnum
{
	UP='W',DOWN='S',LEFT='A',RIGHT='D'
};
//定义全局变量
SNAKE snake;
FOOD food;
int score = 0;
//获取尾巴坐标
int tx = 0;
int ty = 0;

//初始化蛇的信息
void SnakeInit()
{
	snake.size = 2;
	snake.pos[0].X = WIDE / 2;
	snake.pos[0].Y = HIGH / 2;

	snake.pos[1].X = WIDE / 2 - 1;
	snake.pos[1].Y = HIGH / 2;
}

//初始化食物的信息
void FoodInit()
{
	food.pos.X = rand() % WIDE;
	food.pos.Y = rand() % HIGH;
}

//初始化地图信息
void MapInit()
{
	for (int i = 0; i <= HIGH; i++)
	{
		for (int j = 0; j <= WIDE; j++)
		{
			
			if (i == HIGH && j == WIDE)
			{
				printf("+");
			}
			else if (j == WIDE)
			{
				printf("|");
			}else if (i == HIGH)
			{
				printf("-");
			}
			else
			{
				printf(" ");
			}

		}
		printf("\n");
	}
}

//显示游戏界面
void ShowUI()
{
	COORD  coord;
	//去掉重影
	coord.X = tx;
	coord.Y = ty;

	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
	putchar(' ');
	//打印蛇的信息
	for (int i = 0; i < snake.size; i++)
	{
		coord.X = snake.pos[i].X;
		coord.Y = snake.pos[i].Y;
		//设置控制台光标位置
		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
		if (i == 0)
			putchar('@');
		else
			putchar('*');
	}

	//打印食物信息

	coord.X = food.pos.X;
	coord.Y = food.pos.Y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
	putchar('#');

	
}

//开始游戏
void PlayGame()
{
	//蛇移动偏移量
	int dx = 0;
	int dy = 0;
	char key = 'D';
	//蛇和墙的碰撞检测
	while (snake.pos[0].X >= 0 && snake.pos[0].X < WIDE 
		&& snake.pos[0].Y >= 0 && snake.pos[0].Y < HIGH)
	{
		
		//蛇和身体的碰撞检测
		for (int i = 1; i < snake.size; i++)
		{
			if (snake.pos[0].X == snake.pos[i].X && snake.pos[0].Y == snake.pos[i].Y)
			{
				return;
			}
		}

		//蛇和食物的碰撞检测
		if (snake.pos[0].X == food.pos.X && snake.pos[0].Y == food.pos.Y)
		{
			//随机新食物
			FoodInit();
			//蛇身体增长
			snake.size++;
			//分数增长
			score += 10;


		}

		//控制蛇的移动
		//_kbhit 判断键盘是否有输入 如果有结束数据
		if (_kbhit())
		{
			key = _getch();
		}
		switch (key)
		{
		case UP:
			dx = 0;
			dy = -1;
			break;
		case DOWN:
			dx = 0;
			dy = 1;
			break;
		case LEFT:
			dx = -1;
			dy = 0;
			break;
		case RIGHT:
			dx = 1;
			dy = 0;
			break;
		}

		//记录尾巴坐标
		tx = snake.pos[snake.size - 1].X;
		ty = snake.pos[snake.size - 1].Y;

		//改变蛇的坐标
		for (int i = snake.size - 1; i > 0; i--)
		{
			//用前一个身体坐标位当前身体坐标赋值
			snake.pos[i].X = snake.pos[i - 1].X;
			snake.pos[i].Y = snake.pos[i - 1].Y;
		}
		//改变蛇头坐标
		snake.pos[0].X += dx;
		snake.pos[0].Y += dy;

		//system("cls");
		//MapInit();
		ShowUI();
		Sleep(200);
	}
}

int main()
{
	srand((unsigned int)time(NULL));

	//去掉控制台光标
	CONSOLE_CURSOR_INFO cci;
	cci.bVisible = FALSE;
	cci.dwSize = sizeof(cci);
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);


	//初始化蛇的信息
	SnakeInit();

	//初始化食物的信息
	FoodInit();
	//初始化地图的信息
	MapInit();
	//显示蛇和食物的信息
	//ShowUI();
	PlayGame();
	system("cls");
	printf("游戏结束\n分数:%d\n", score);
	return EXIT_SUCCESS;
}

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值