贪吃蛇小游戏(数组实现,简单易懂,启发版)

贪吃蛇小游戏(数组实现)

新手而言,学c的过程确实蛮枯燥的,偶然间看到了之前写过的贪吃蛇的代码,分享给大家作为参考,给大家添点乐趣(能添一点是一点)。//满满的无奈感

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<conio.h>//conio.h和windows.h两个头文件不太了解的可以搜一下,网上说的很清楚

int wall[30][30];//建造围墙,30行30列
int snake[15][2];//15是蛇的最大长度,snake[0][0]用于保存蛇头x坐标值,snake[0][1]则是y坐标,后面类推
int apple[2];//保存苹果的x与y坐标
int len = 3;//初始化蛇长为3
int score = 0;//初始化得分
char ch;//保存输入的按键

void color(int a)//color函数用于改变控制台接下来要输出的内容的颜色,比如color(12)为黑底红色
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}

void gotoxy(int x, int y)//改变光标位置,你想在控制台哪个地方输出,可以使用
{
	COORD pos;
	pos.X = 2 * x;
	pos.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void background()//初始化围墙和地图
{
	int i, j;
	for (i = 1; i >= 1 && i < 29; i++) {
		for (j = 1; j >= 1 && j < 29; j++) {
			wall[i][j] = 1;
		}
	}
	color(11);
	for (i = 0; i >= 0 && i < 30; i++) {
		for (j = 0; j >= 0 && j < 30; j++) {
			if (wall[i][j] == 1)
				printf("■");
			else
				printf("□");
		}
		printf("\n");//这个不要漏
	}
	color(14);//黑底黄色
	gotoxy(32, 2);
	printf("按w、s、a、d(或“↑ ↓ ← → ”)改变方向\n");
	gotoxy(32, 3);
	printf("得分:%d\n", score);
}

void start()
{
	srand((unsigned)time(NULL));//初始化随机数发生器
	apple[0] = rand() % 28 + 1;//取[1,28]的随机数(0和29都是围墙)
	apple[1] = rand() % 28 + 1;
	gotoxy(apple[0], apple[1]);
	color(12);
	printf("●");//产生苹果
	snake[0][0] = 14;
	snake[0][1] = 14;
	//初始蛇头位置
	color(14);
	gotoxy(snake[0][0], snake[0][1]);
	printf("¤");
	//输出蛇头
	for (int i = 1; i < len; i++) {
		snake[i][0] = snake[0][0];
		snake[i][1] = snake[0][1] + i;
		color(14);
		gotoxy(snake[i][0], snake[i][1]);
		printf("★");//输出蛇身
	}
}
void movesnake()
{
	int i;
	int Tsnake[15][2];
	eat_apple();
	for (i = 0; i < len; i++)
	{
		Tsnake[i][0] = snake[i][0];
		Tsnake[i][1] = snake[i][1];
	}
	srand((unsigned)time(NULL));

	if (_kbhit()) {
		ch = _getch();
		if (ch == -32)
		{
			ch = _getch();
		}
		//这里有必要解释一下为什么有可能用2次_getch()函数
		//如果输入的是w,s,a,d,变量ch可以直接接收
		//但是如果是方向键,第一次_getch()函数返回的是-32(ch为char类型变量),第二次才可以正常接收
	}
	switch (ch) {
	case 'w':case 'W':case 72:
		snake[0][1]--; break;
	case 's':case 'S':case 80:
		snake[0][1]++; break;
	case 'a':case 'A':case 75:
		snake[0][0]--; break;
	case 'd':case 'D':case 77:
		snake[0][0]++; break;
	default: break;
	}

	gotoxy(snake[0][0], snake[0][1]);
	color(14);
	printf("¤");

	for (i = 1; i <= len - 1; i++) {
		snake[i][0] = Tsnake[i - 1][0];
		snake[i][1] = Tsnake[i - 1][1];
		gotoxy(snake[i][0], snake[i][1]);
		color(14);
		printf("★");

		gotoxy(snake[i + 1][0], snake[i + 1][1]);
		color(11);
		printf("■");
		gotoxy(0, 0);
		printf("□");
	}
	Sleep(abs(200 - 0.5 * score));
}
eat_apple()
{
	if (snake[0][0] == apple[0] && snake[0][1] == apple[1])
	{
		score++;
		len++;
		color(11);
		gotoxy(apple[0], apple[1]);
		printf("■");
		srand((unsigned)time(NULL));
		apple[0] = rand() % 28 + 1;
		apple[1] = rand() % 28 + 1;
		gotoxy(apple[0], apple[1]);
		color(12);
		printf("●");

		color(14);
		gotoxy(32, 3);
		printf("得分:%d\n", score);
	}
}
if_wall()
{
	if (snake[0][0] == 0 || snake[0][1] == 0 || snake[0][0] == 29 || snake[0][1] == 29)
	{
		color(15);
		gotoxy(15, 15);
		printf("您失败了");
		Sleep(INFINITE);
	}
}

int main()
{
	ch = 'a';//初始化方向为左
	background();
	start();
	while (1) {
		Sleep(180);
		movesnake();
		if (len == 15)
		{
			gotoxy(15, 15);
			color(4);
			printf("通关");
			Sleep(INFINITE);
		}
		if_wall();
	}
	return 0;
}

很简单的贪吃蛇雏形,你甚至可以向后跑,吃到自己也无所谓,大家如果想完善的话可以自己思考一下如何实现你想要的的功能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值