贪吃蛇游戏

本文详细介绍了如何在Windows环境中利用C++编程语言实现贪吃蛇游戏,包括使用gotoxy控制光标位置、创建地图、随机生成食物、蛇的移动和碰撞检测。通过函数拆分,展示了从地图绘制到游戏逻辑的关键步骤。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


提示:这里可以添加本文要记录的大概内容:

贪吃蛇


提示:以下是本篇文章正文内容,下面案例可供参考

一、gotoxy是什么?

gotoxy(x,y)是光标索引,可以把光标拖到指定位置;把整个屏幕看成一个坐标系横是轴纵是y轴
例如`

gotoxy(10,20);
cout<<'#';

可以在10,20的位置输出一个#
有一些编译器可以直接用,有一些需要自己写
这里直接复制就好了

void gotoxy(short x, short y) {//移动光标
	COORD coord = {x, y};
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}

了解gotoxy之后主要思路
/*
第一步绘制地图
第二步构建随机函数
第三步初始化蛇身
第四步使蛇移动(通过一个死循环,不断输出蛇的位置)
最后判断结束条件*/

二、代码

1.构建函数

1.引入库及宏定义

#include <windows.h>
#include <iostream>
#include <time.h>
#include <conio.h>
using namespace std;
#define C "@"//蛇头
#define X "■"//边框
#define CHANG 80//长
#define KUAN 26//宽
#define MOVE 10//向右移动
#define A "*"//食物
#define B "#"//蛇身
#define SHEN 3//蛇身长度
#define MAXLEN 30//蛇身最长长度
int Q = 0;

2.绘制地图

void creatmap() {//创建地图
	int i;

	for (i = 0 + MOVE; i < CHANG + MOVE; i += 2) { //打印上下

		gotoxy(i, 0);
		cout << X;
		gotoxy(i, KUAN - 1);//此时宽是25**********************特别注意地图宽已经减一了
		cout << X;
	}

	for (i = 0; i < KUAN ; i++) {

		gotoxy(0 + MOVE, i);//左边
		cout << X;
		gotoxy(CHANG + MOVE, i); //右边
		cout << X;
	}

	//gotoxy(96, 0);
}

3.创建食物

struct Food {//食物结构体
	int x;
	int y;
} food;
void creatfood() {//随机食物
	srand(time(0));
	food.x  = rand() % (CHANG - 2 ) + MOVE + 2; //食物横坐标
	food.y  = rand() % (KUAN - 2 ) + 1; //食物纵坐标
	int a = 0;
	int i;

	for ( i = 0; i < snake.length ; i++) { //如果蛇身位置和食物位置不重叠,完成创建

		if (snake.x[i] == food.x && snake.y[i] == food.y ) {//如果食物和蛇身相等
			a = 1;//令a=1
		}
	}

	if (a == 0) {//不相等直接创建食物
		gotoxy(food.x, food.y );
		cout << A;
	} else//相等调用创建食物的函数
		creatfood();
	gotoxy(95, 0);
}

4.创建蛇

struct  Snake { //蛇
	int x[MAXLEN];
	int y[MAXLEN];
	int length;//蛇长度
} snake;
void creatsnake() { //创建蛇
	int i;
	snake.x[0] = (CHANG ) / 2 + MOVE;//在屏幕中央
	snake.y[0] = KUAN / 2;
	gotoxy(snake.x[0], snake.y[0] );//创建蛇头
	cout << C;

	for (i = 1; i < SHEN ; i++) {//创建蛇身

		snake.x [i] = snake.x[i - 1] + 1; //蛇身x+1
		snake.y [i] = snake.y[i - 1]; //蛇身y不变
		gotoxy(snake.x[i], snake.y [i]);
		cout << B;
	}

	snake.length = SHEN; //蛇身的长度
	gotoxy(99, 30);
}

4.`使蛇可以移动

void movesnake(char &dong) { //蛇移动
	gotoxy(snake.x [snake.length - 1], snake.y [snake.length - 1]); //因为从x【0】开始的//删除蛇的最后一个位置
	cout << " "; //删除蛇尾
	Q = 0; //Q是全局变量

	for (int i = snake.length - 1; i > 0; i--) { //第一个不需要被覆盖,例如第10个身子需要移动到第九个身子,所以10移动到9

		snake.x [i] = snake.x [i - 1]; //让第十个位置的东西等于第九个位置的东西,此时相当于第十个位置到了第九个位置
		snake.y [i] = snake.y [i - 1];
		gotoxy(snake.x [i], snake.y [i]);
		cout << B;
	}

	char ch;
	ch = dong;//如果敲错键盘,记录上一次移动方向........default继续按照上一个方向移动,防止停下来

	if (_kbhit()) {//检测是否敲击键盘
		fflush(stdin);
		dong = getch();
	}

	if (dong != 'a' && dong != 'A' && dong != 's' && dong != 'S' && dong != 'd' && dong != 'D' && dong != 'W'
	        && dong != 'w')//如果没正确输入,则返回上一方向
		dong = ch;

	switch (dong) {


		case 'a'://左x--
		case 'A' :
			//case '4':
			snake.x[0]--;//左
			break;

		case 'D':
		case 'd':
			//case '6' :
			snake.x [0]++;//右
			break;

		case 'W':
		case 'w':
			//case '8' :
			snake.y [0]--;//上
			break;

		case 's':
		case 'S':
			//case '5' :
			snake.y [0]++;//下
			break;

		default:
			Q = 1; //Q等于1,证明键盘敲错了
			//dong = ch;
			break;

	}

	gotoxy(snake.x [0], snake.y [0]);//蛇头新位置
	cout << C;
	gotoxy(95, 0);

	if (food.x == snake.x [0] && food.y == snake.y [0]) { //判断蛇头和食物是否重叠
		creatfood();//创建新食物
		snake.length ++;//蛇身+1
	}
}

5.判断结束条件

int jieshu() {//判断结束
	int i;

	if (Q == 1) //如果键盘敲错了,不结束游戏
		return 0;

	for (i = 1; i < snake.length ; i++) { //如果蛇身等于蛇头,游戏结束

		if (snake.x [0] == snake.x [i] && snake.y [0] == snake.y [i]) {
			gotoxy((CHANG ) / 2 + MOVE, KUAN / 2);
			cout << "游戏结束";
			gotoxy(40, 25);
			//cout << endl << endl;
			return 1;
		}
	}

	if (snake.x [0] <= MOVE + 1 || snake.x [0] >= MOVE + CHANG - 1) { //蛇头碰到左右墙壁结束
		gotoxy((CHANG ) / 2 + MOVE, KUAN / 2);
		cout << "游戏结束";
		gotoxy(40, 25);
		return 1;
	}

	if (snake.y [0] <= 1 || snake.y [0] >= KUAN - 1) { //蛇头碰到上下墙壁结束
		gotoxy((CHANG ) / 2 + MOVE, KUAN / 2);
		cout << "游戏结束";
		gotoxy(40, 25);
		return 1;
	}

	if (snake.length > MAXLEN) { //蛇长度大于最大长度
		gotoxy((CHANG ) / 2 + MOVE, KUAN / 2);
		cout << "游戏结束";
		gotoxy(40, 25);
		return 1;
	}

	return 0;
}

2.主函数

代码如下(示例):

int main() {
	char dong = 'a';
	srand(time(0));
	creatmap();
	creatfood();
	creatsnake();

	while (1) {
		Sleep(200);//速度
		movesnake(dong);

		if (jieshu())
			break;
	}

	return 0;
}

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值