C++贪吃蛇小游戏【有注释】

写在前面的废话

今天呢,我又编写了一款贪吃蛇小游戏,但是测试到一半我的DEV坏了(一直在显示正在检测乱七八糟的头文件,运行了好几分钟,甚至关不死了,最后再下面的小窗才给关了)所以可能有疏漏,请大家及时告诉我,我会及时改正的。

代码在此!


 

PS:一开始还在写注释,后来懒得写了 

#include<bits/stdc++.h>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
using namespace std;
int maxn;
void BackGround(unsigned int ForeColor = 7, unsigned int BackGroundColor = 0) {
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); 
	SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);
}
void gotoxy(int x, int y) {
	HANDLE handle;
	COORD coord; 
	coord.X = x;
	coord.Y = y;
	handle = GetStdHandle(STD_OUTPUT_HANDLE); 
	SetConsoleCursorPosition(handle, coord);   //移动光标到(x,y)处
}
//初始化地图数据

void restart(int bk[50][50], int look[4], int move[50][50]) {
	//bk为总的地图数据记录整个地图,为1时表示墙体,为2时表示果实,为3时表示蛇
	//look记录数据,为0时表示朝向,为1时表示长度,为3时表示胜负情况,为4表示分数
	//move记录蛇走过的路程,用来判断
	int pp, qq;  //用来记录获取的随机坐标
	//接下来要初始化地图
	for (int i = 0; i<=maxn;i++) {
		for (int j = 0; j <= maxn; j++) {
			if (i == 0 || i == maxn || j == 0 || j == maxn)  bk[i][j] = 1;//1表示墙体
			else bk[i][j] = 0; //什么都没有
			move[i][j] = 0;    记录蛇移动的轨迹
		}
	}
	//将蛇初始化在8,8坐标上
	bk[8][8] = 3;
	move[8][8] = 1;//则此时8,8,上的轨迹就应该记录为1
	move[0][0] = 1;//用此来记录步数
	pp = rand() % (maxn - 1) + 1;//范围是1-(maxn - 1)
	qq = rand() % (maxn - 1) + 1;
	bk[pp][qq] = 2;
	look[0] = 1;//朝向向上
	look[1] = 1;//长度
	look[2] = 0;//当为1表示失败
	look[3] = 0;//得分
	//接下来要绘制地图
	for(int i = 0; i <= maxn; i++) {
		for (int j = 0; j <= maxn; j++) {
			gotoxy(i * 2, j);//光标移动,每个光标都是矩形
			switch (bk[i][j]) {
			case 0:
				BackGround(0, 0);
				break;//没有东西打印黑色
			case 1:
				BackGround(0, 1);
				break;//墙打印蓝色
			case 2:
				BackGround(0, 2);
				break;//果实打印绿色
			case 3:
				BackGround(0, 3);
				break;//蛇打印蓝色
			default:
				break;
			}
			cout<<" ";
		}
	}
	gotoxy(55, 0);
	BackGround(7, 0);
	printf("现在得分是:%d,奥利给!", look[2]);
}
 

void map(int bk[50][50], int look[4], int xy[2], int move[50][50]) {
	int b[10], qq = 0, pp = 0;
	if (kbhit()) {
		b[0] = getch();//用b来记录
		if (b[0] == 224) {
			b[0] = getch();
		}
		if (b[0] == 72 && look[0] != 2) {
			look[0] = 1;
		}
		if (b[0] == 80 && look[0] != 1) {
			look[0] = 2;
		}
		if (b[0] == 75 && look[0] != 4) {
			look[0] = 3;
		}
		if (b[0] == 77 && look[0] != 3) {
			look[0] = 4;
		}
	}
	switch (look[0]) {
	case 1:
		xy[1]--;
		break;
	case 2:
		xy[1]++;
		break;
	case 3:
		xy[0]--;
		break;
	case 4:
		xy[0]++;
		break;
	}
	move[0][0]++;
	move[xy[0]][xy[1]] = move[0][0];
	gotoxy(55, 2);
	BackGround(7, 0);
	printf("横坐标:%d,纵坐标:%d", xy[0],xy[1]);
	gotoxy(xy[0] * 2, xy[1]);
	BackGround(0, 3);
	printf("  ");
 
	if (bk[xy[0]][xy[1]] == 2) {
		look[2]++;
		look[1]++;
		gotoxy(55, 0);
		BackGround(7, 0);
		printf("现在得分是:%d,请再接再厉!", look[2]);
		while (bk[pp][qq] != 0) {
			pp = rand() % (maxn - 1) + 1;
			qq = rand() % (maxn - 1) + 1;
		}
		bk[pp][qq] = 2;
		gotoxy(pp * 2, qq);
		BackGround(0, 2);
		printf("  ");
	}
	if (bk[xy[0]][xy[1]] == 1 || bk[xy[0]][xy[1]] == 3) {
		look[3] = 1;//输了
		gotoxy(6, 6);
		BackGround(7, 0);
		printf("You Lose!\n最后得分:%d", look[2]);
	}
	bk[xy[0]][xy[1]] = 3;

	for (int i = 0; i <= maxn; i++) {
		for (int j = 0; j <= maxn; j++) {
			if (move[i][j] == move[xy[0]][xy[1]]- look[1]){
				bk[i][j] = 0;
				gotoxy(i * 2, j);
				BackGround(0, 0);
				printf("  ");
				break;
			}
		}
	}
}
int main() {
	printf ("请输入您想要的难度(1表示简单,2表示中等,3表示困难)\n");
	int c;
	scanf ("%d", &c);
	if (c == 1) {
		maxn = 24;
	} else if (c == 2) {
		maxn = 20;
	} else if (c == 3) {
		maxn = 16;
	} else {
		printf ("请重新输入!\n"); main();
	}
	int bk[50][50], xy[2], move[50][50], look[4];
	xy[1] = xy[0] = maxn / 2;
	srand((unsigned) time(NULL));//初始化
	system("pause");
	restart(bk, look, move);
	while (look[3] == 0) {
		Sleep(250);
		map(bk, look, xy, move);
	}
	system("pause");
    system("cls");
	printf("游戏结束,感谢游玩,886~);
	return 0;
}

最后,希望大家能多多支持!请留下你的三连!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值