猫史档案馆


初学C++做的小游戏:贪吃蛇

用户:happy_chickenhappy_chicken查看:1 回复:1 评论:1 创建时间:2022-05-29T14:54:57


就像下面的效果哦~

只是个小小的作品啦~
center_image


回复

上一页1 页 / 共 1下一页
happy_chickenhappy_chicken

#include <iostream>
#include <windows.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;

char Hide() {
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(handle, &CursorInfo);
	CursorInfo.bVisible = false;
	SetConsoleCursorInfo(handle, &CursorInfo);
	return 0;
}



#define high 20  //定义地图的高度 
#define width 70   //定义地图的宽度 
#define snake_maxlength 100000  //蛇长最大值 
int snake_x[snake_maxlength], snake_y[snake_maxlength]; //蛇的坐标
int snake_length;  //蛇现在的长度
int map[high][width] = {0}; //初始化地图,0表示空格,1表示蛇身,2表示食物。
//3表示墙,4表示蛇头,现在地图中什么也没有
int food_x, food_y; //食物的坐标
int score;  //本局分数
char input;  //读取用户键入的字符
//数据的初始化函数
void setdata() {
	snake_x[0] = high / 2;
	snake_y[0] = width / 3; //初始化蛇头,在地图内的位置随意
	snake_x[1] = high / 2;
	snake_y[1] = width / 3 + 1; //初始化蛇身
	snake_length = 2; //蛇的原始尺寸(一格头一格身子)
	food_x = high / 3, food_y = width / 3; //初始化食物的位置,在地图内位置随意
	score = 0;
	int i, j;
	map[snake_x[0]][snake_y[0]] = 4; //蛇头
	map[snake_x[1]][snake_y[1]] = 1; //蛇身
	map[food_x][food_y] = 2; //食物
	for (i = 0; i < high; i++) //墙
		for (j = 0; j < width; j++)
			if (i == 0 || j == 0 || i == high - 1 || j == width - 1)
				map[i][j] = 3;
}

//画面打印
void gotoxy(int x, int y) { //解释1
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition(handle, pos);
}

void show() {
	gotoxy(0, 0);
	int i, j;
	for (i = 0; i < high; i++) {
		for (j = 0; j < width; j++) {
			HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
			if (map[i][j] == 0)
				cout << " ";
			else if (map[i][j] == 1) {
				SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY |
				                        FOREGROUND_RED);
				cout << "*";
			} else if (map[i][j] == 2) {
				SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY |
				                        FOREGROUND_RED |
				                        FOREGROUND_GREEN);
				cout << "@";
			} else if (map[i][j] == 3) {
				SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY |
				                        FOREGROUND_GREEN |
				                        FOREGROUND_BLUE);
				cout << "#";
			} else if (map[i][j] == 4) {
				SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY |
				                        FOREGROUND_RED);
				cout << "O";
			}
		}
		printf("\n");
	}
	printf("得分:%d", score);
}

//与输入无关的更新
void updatewithoutinput() {
	int i;
	if (snake_x[0] == food_x && snake_y[0] == food_y) {
		score++;
		srand((unsigned)time(NULL));  //srand和rand函数连用产生随机数,一般以时间作为产生随机数的种子
		food_x = rand() % (high - 3) + 1; //解释2
		food_y = rand() % (width - 3) + 1;
		map[food_x][food_y] = 2;
		snake_length++;
	}
	if (snake_x[0] == 0 || snake_x[0] == high - 1 || snake_y[0] == 0 || snake_y[0] == width - 1) { //碰墙了
		HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
		system("cls");
		SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY |
		                        FOREGROUND_RED);
		cout << "                                              游戏结束!" << endl;
		getch();
		exit(1);  //解释3
	}
	for (i = 1; i < snake_length; i++) //碰到自己了 ,遍历蛇身找是否和蛇头重复
		if (snake_x[0] == snake_x[i] && snake_y[0] == snake_y[i]) {
			HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
			system("cls");
			SetConsoleTextAttribute(hout, FOREGROUND_INTENSITY |
			                        FOREGROUND_RED);
			cout << "                                               游戏结束!" << endl;
			getch();
			exit(1);
		}
}

void updatewithinput() {
	int i = 1;
	short p = 0;
	if (kbhit()) //解释4
		input = getch();
	if (input == 'w' || input == 'a' || input == 's' || input == 'd') {
		if (p == 1) {
			system("cls");
			p == 0;
		}
		map[snake_x[snake_length - 1]][snake_y[snake_length - 1]] = 0; //蛇走过一格,蛇尾处变为空格
		for (i = snake_length - 1; i > 0; i--) {
			snake_x[i] = snake_x[i - 1]; //走过一格后蛇身的坐标覆盖前面的坐标 (从后往前覆盖,蛇头也会被蛇身覆盖)
			snake_y[i] = snake_y[i - 1]; //解释5
			map[snake_x[i]][snake_y[i]] = 1;
		}

	}
	if (input == 'w')
		snake_x[0]--;
	else if (input == 's')
		snake_x[0]++;
	else if (input == 'a')
		snake_y[0]--;
	else if (input == 'd')
		snake_y[0]++;
	else {
		cout << "     已暂停";
		p = 1;
	}
	map[snake_x[0]][snake_y[0]] = 4; //蛇头的坐标覆盖前面的坐标
}

int main() {
	setdata();//数据初始化
	Hide();//隐藏光标
	while (1) {
		show();  //画面打印
		updatewithoutinput();   //与输入无关的更新
		updatewithinput();      //与输入有关的更新
		Sleep(100);
	}


	return 0;
}

点赞0


评论