简单的贪吃蛇程序(C++实现)

学习C++时的代码,仅供自己使用

1.运行结果

运行结果

2. 源码

2.1 main.cpp

#include"GluttonousSnake.h"

int main()
{
	// 给随机种子
	srand(time(NULL)); 
	Initial();     //初始化工作
	Control_snake();
	return 0;
}

2.2 GluttonousSnake.h

#pragma once
#include<stdio.h>
#include<time.h>
#include<conio.h>
#include<stdlib.h>
#include<Windows.h>
//变色
void B(char *);

//菜单
void Menu();

//贪吃蛇的地图
void Map();

//输出函数
void Show_map();

//蛇的结构
typedef struct _a{
	char x;
	char y;
	struct _a *next;
}Snake;

//创建蛇
void Create_snake(Snake *);

//食物的结构
typedef struct _b {
	char x;
	char y;
}Food;

//刷新食物
void Refresh_Food(Snake *);

//移动蛇
void Move_snake(Snake *);

//录入蛇
void Entry_snake(Snake *);

//判断蛇是否死亡,是否吃到了食物
void Judgment(char);

//给新长出来的身体定位
void Dw(char,Snake *);

//控制蛇
void Control_snake();

//初始化工作
void Initial();

2.3 GluttonousSnake.cpp

#include "GluttonousSnake.h"
#define N 30  //地图的宽
#define M 81  //地图的长
char map[N][M];//地图数组
int snake_length = 3;//蛇的长度
Snake *snake = (Snake *)malloc(sizeof(Snake));//初始化蛇结构的指针
Food food;  //定义食物的结构

//菜单
void Menu()
{
	puts("-----------------------------------规则wasd移动方向,ESC暂停,空格变颜色!----------------------------------------");
	Sleep(3000);
	system("cls");
	puts("-----------------------------------------------——--还有3秒开始----------------------------------------------------");
	Sleep(1000);
	system("cls");
	puts("--------------------------------------------------还有2秒开始----------------------------------------------------");
	Sleep(1000);
	system("cls");
	puts("--------------------------------------------------还有1秒开始----------------------------------------------------");
	Sleep(1000);
	system("cls");
	puts("-----------------------------------------------------开始!-------------------------------------------------------");
}

//贪吃蛇的地图
void Map()
{
	int i, j;
	for (i = 0; i < N; i++)
	{
		for (j = 0; j < M-1; j++)
		{
			if (i == 0 || i == N - 1 || j == 0 || j == M - 2)
				map[i][j] = '*';
			else
				map[i][j] = ' ';
		}
		map[i][j] = '\n';
	}
	map[i][j] = '\0';
}

//输出
void Show_map()
{
	system("cls");
		printf("%s", map);
	Sleep(100);
}

//创建蛇
void Create_snake(Snake *snake)
{
	snake->x = rand() % 78 + 1;
	snake->y = rand() % 26 + 1;
	char _x = snake->x;
	char _y = snake->y;
	while (--snake_length)
	{
		snake->next = (Snake *)malloc(sizeof(Snake));
		snake = snake->next;
		snake->x = _x;
		snake->y = ++_y;
	}
	snake->next = NULL;
}

//刷新食物
void Refresh_Food(Snake *snake)
{
p:	food.x = rand() % 78 + 1;
	food.y = rand() % 28 + 1;
	while (snake)
	{
		if (food.x == snake->x && food.y == snake->y)
			goto p;
		snake = snake->next;
	}
}

//移动蛇
void Move_snake(Snake *snake)
{
	static char  _x, _y, _x1, _y1;
	_x = snake->x;
    _y = snake->y;
	while (snake=snake->next)
	{
		_x1 = snake->x;
		_y1 = snake->y;
		snake->x = _x;
		snake->y = _y;
		_x = _x1;
		_y = _y1;
	}
}

//录入蛇与食物,并刷新地图
void Entry_snake(Snake *snake)
{
	Map();
	map[snake->y][snake->x] = '@';
	while (snake = snake->next)
		map[snake->y][snake->x] = '+';
	map[food.y][food.x] = '$';
}

//给新长出来的身子定位
void Dw(char c,Snake *_snake)
{
	char _x = _snake->x;
	char _y = _snake->y;
	_snake = _snake->next;
	if (c == 'w')
	{
		_snake->x = _x;
		_snake->y = ++_y;
	}
	else if(c=='s')
	{
		_snake->x = _x;
		_snake->y = --_y;
	}
	else if(c=='a')
	{
		_snake->x = ++_x;
		_snake->y = _y;
	}
	else
	{
		_snake->x = --_x;
		_snake->y = _y;
	}
	_snake->next = NULL;
}

//判断蛇是否死亡,是否吃到了食物
void Judgment(char c)
{
	Snake *_snake =snake;
	if (snake->x == food.x && snake->y == food.y)
	{
		while (_snake->next)
			_snake = _snake->next;
		_snake->next = (Snake *)malloc(sizeof(Snake));
		Dw(c, _snake);
		snake_length++;
		if (snake_length == (N-2)*(M-3))
		{
			fprintf(stderr, "恭喜你成功通过,你太牛了!!!");
			exit(EXIT_FAILURE);
		}
		Refresh_Food(snake);
		return;
	}
	if (snake->x == 0 || snake->x == 79 || snake->y == 0 || snake->y == 29)
	{
		fprintf(stderr, "墙都被你撞破了...,不说了修墙去了^&^");
		exit(EXIT_FAILURE);
	}
	while (_snake=_snake->next)
	{
		if (snake->x == _snake->x && snake->y == _snake->y)
		{
			fprintf(stderr, "你自己把自己撞死了...^&^");
			exit(EXIT_FAILURE);
		}
	}
}

//控制蛇
void Control_snake()
{
	char p = 0;
	char c, a = 'w';
	//开始
z:	while (!kbhit()); 
	c = getch();
	if (c == 'w' || c == 'a' || c == 'd' || c == 's' || c == 27 || c == 32)
	{
		if (c == 27 || c == 32)
			goto s;
		else if ((c == 'w' && a == 's') || (c == 's' && a == 'w') || (c == 'a' && a == 'd') || (c == 'd' && a == 'a'))
			goto z;
		else
			a = c;
	}
	else
		goto z;
o:	Move_snake(snake);
s:	switch (c)
		{
			//上
		case 'w':
			snake->y--;
			break;
			//下
		case 's':
			snake->y++;
			break;
			//左
		case 'a':
			snake->x--;
			break;
			//右
		case 'd':
			snake->x++;
			break;
			//暂停
		case 27:
			goto z;
		case 32:
			B(&p);
			p++;
		}
	Judgment(c);
	Entry_snake(snake);
	Show_map();
	if (kbhit())
		c = getch();
	if (c == 'w' || c == 'a' || c == 'd' || c == 's' || c == 27 || c == 32)
	{
		if (c == 32 || c == 27)
			goto s;
		else if ((c == 'w' && a == 's') || (c == 's' && a == 'w') || (c == 'a' && a == 'd') || (c == 'd' && a == 'a'))
			c = a;
		else
			a = c;
	}
	else
		c = a;
	goto o;
}

//初始化工作
void Initial()
{
	Menu();
	Create_snake(snake);
	Refresh_Food(snake);
	Entry_snake(snake);
	Show_map();
}

//变色
void B(char *p)
{
	switch (*p)
	{
	case 0:system("color 0");
		break;
	case 1:system("color 1");
		break;
	case 2:system("color 2");
		break;
	case 3:system("color 3");
		break;
	case 4:system("color 4");
		break;
	case 5:system("color 5");
		break;
	case 6:system("color 6");
		break;
	case 7:system("color 7");
		break;
	case 8:system("color 8");
		break;
	case 9:system("color 9");
		break;
	case 10:system("color A");
		break;
	case 11:system("color B");
		break;
	case 12:system("color C");
		break;
	case 13:system("color D");
		break;
	case 14:system("color E");
		break;
	case 15:system("color F");
		break;
	default:
		*p = 0;
	}
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

亲爱的老吉先森

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

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

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

打赏作者

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

抵扣说明:

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

余额充值