C++中练习贪吃蛇

Hello, 大家好,我是爱吃香蕉的猴子, 练习一下贪吃蛇的例子


#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>
#include"Snake.h"

/*
 *code的思路 
1、定义蛇的结构体
2、初始化蛇和食物
3、场景
	蛇和墙的碰撞
	蛇和自身碰撞
	蛇和食物碰撞
		重新随机食物
		蛇身体增长
		分数增长
	方向键控制
4、游戏结束

*/

//初始化食物
//rand() 产生随机数
void InitFood()
{
	food[0] = rand() % WIDE;//随机产生食物的宽
	food[1] = rand() % HIGH;//随机产生食物的高
}

//初始化蛇
void InitSnake()
{
	snake.size = 3;//初始的长度头部+尾巴

	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 ShowUI()
{
	COORD coord;//C++改变光标位置的函数
	//更新末尾空格
	coord.X = lx;
	coord.Y = ly;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
	putchar(' ');
	//显示蛇的位置
	for (int 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('*');//尾巴
	}
	//显示食物位置

	coord.X = food[0];
	coord.Y = food[1];
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
	putchar('#');
}


//键盘控制
void PlayGame()
{
	char key = 'D';
	while (snake.body[0].X >= 0 && snake.body[0].X < WIDE 
		&& snake.body[0].Y >= 0 && snake.body[0].Y < HIGH)
	{

		//显示界面
		ShowUI();
		//方向控制
		while (_kbhit())
		{
			key = _getch();
		}
		switch (key)
		{
		case 'D':case 'd': dx = 1; dy = 0; break;
		case 'A':case 'a': dx = -1; dy = 0; break;
		case 'W':case 'w': dx = 0; dy = -1; break;
		case 'S':case 's': dx = 0; dy = 1; 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[0] && snake.body[0].Y == food[1])
		{

			//随机新食物
			InitFood();
			//蛇身体增长
			snake.size++;
			//分数增长
			score += 10;
			//关卡 速度  障碍物
		}


		//蛇更新坐标

		lx = snake.body[snake.size - 1].X;
		ly = snake.body[snake.size - 1].Y;

		for (int 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 += dx;
		snake.body[0].Y += dy;

		Sleep(100);
		//system("cls");

	}

}

void InitWall()
{
	for (int i = 0; i <= HIGH; i++)
	{
		for (int j = 0; j <= WIDE; j++)
		{
			if (i == HIGH)
				putchar('=');
			else if (j == WIDE)
				putchar('=');
			else
				putchar(' ');
		}
		putchar('\n');
	}
}



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

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


	InitWall();
	InitFood();
	InitSnake();
	//ShowUI();
	PlayGame();
	//getchar();

	return EXIT_SUCCESS;
}

.h

#pragma once

#define WIDE 60
#define HIGH 20

struct BODY
{
	int X;
	int Y;
};
struct SNAKE
{
	int size;
	struct BODY body[WIDE*HIGH];
}snake;

int food[2] = {0};//food[0]为X坐标 food[1]为Y坐标

int score = 0;
//偏移坐标
int dx = 0;
int dy = 0;
//记录蛇末尾坐标
int lx = 0;
int ly = 0;
void InitFood();
void InitSnake();
void ShowUI();
void PlayGame();
void InitWall();


                           Code的搬运工V1.0
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值