C《贪吃蛇》简易字符版

哇咔咔,这是我步入游戏制作界的第一步。 得意

忙活了一个国庆,虽说bug略多,但是成就感满满的。






#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#define H 20
#define L 20
void map(int hard);
void maphard(void);
void play(void);
void food(void);
int live(void);
void direction(char button, struct snake*direction);
void flashmap(struct snake*showsnake, int fx, int fy);
char MAP[H][L];
char key;
int life = 0;
int h;
int roof[4];

struct snake
{
	int x;
	int y;
	struct snake *next;
}*head, *body, *tail, *direct, *test;

int main(void)
{
	char choice;
	int speed;
	printf("            《贪吃蛇》 作者:sp\n");
	printf("请选择您的贪吃蛇水平(输入数字,按回车确认):\n");
	printf("1.我是菜鸟        2.过关无压力\n");
	printf("3.大神你懂吗      4.丧心病狂模式\n");
	while (scanf("%c", &choice) == 1)
	{
		switch (choice)
		{
		case '1':
			map(0); 
			play(800, 0); 
			break;
		case '2':
			map(0); 
			play(400, 0); 
			break;
		case '3':
			map(0); 
			play(100, 0);
			break;
		case '4':
			printf("丧心病狂模式介绍:\n");
			printf("该模式下场地上会出现一片屋顶(用“+”表示)\n贪吃蛇可以穿过屋顶,但是在屋顶下玩家无法看到蛇的行踪\n");
			printf("贪吃蛇的食物有几率出现在屋顶下,玩家需要通过其丧心病狂的直觉来吃到食物\n");
			system("pause");
			map(1); 
			play(300, 1); 
			break;
		default:printf("游戏结束!");
		}
	}
	system("pause");
	return 0;
}

void map(int hard)
{
	int i, j, x, y;
	memset(MAP, ' ', sizeof(MAP));
	system("cls");
	head = (struct snake*)malloc(sizeof(struct snake));
	srand(time(0));//随机种子
	x = rand() % (H - 2) + 1;//初始化蛇头
	y = rand() % (L - 2) + 1;
	MAP[x][y] = '*';
	head->x = x;
	head->y = y;
	head->next = NULL;
	direct = head;
	if (hard = 0)
	{

		for (i = 0; i < H; i++)//画地图
		{
			for (j = 0; j < L; j++)
			{
				if (i == 0 || i == H - 1 || j == 0 || j == L - 1)//造围墙
					MAP[i][j] = '#';
				printf("%c", MAP[i][j]);
			}
			printf("\n");
		}
	}
	else
	{
		for (h = 0; h < 4; h++)
		{
			srand(time(0));
			roof[h] = rand() % (H - 2) + 1;
		}

		for (i = 0; i < H; i++)//画地图
		{
			for (j = 0; j < L; j++)
			{
				if (i == roof[0] || i == roof[1] || j == roof[2] || j == roof[3])//屋顶
					MAP[i][j] = '+';
				if (i == 0 || i == H - 1 || j == 0 || j == L - 1)//造围墙
					MAP[i][j] = '#';
				printf("%c", MAP[i][j]);
			}
			printf("\n");
		}
	}
}

void play(int speed, int hard)
{
	int fx, fy;
	int food = 1;
	while (1)
	{
		Sleep(speed);
		while (food)//生成食物
		{
			srand(time(0));
			fx = rand() % (H - 2) + 1;
			fy = rand() % (L - 2) + 1;
			food = 0;
		}
		if (_kbhit() != 0)//有键盘输入则变换key的值,否则保持原方向
			key = _getch();
		direction(key, direct);
		body = head;
		if ((direct->x != fx) || (direct->y != fy))
		{
			while (body->next != NULL)
			{
				body->x = (body->next)->x;
				body->y = (body->next)->y;
				body = body->next;
			}
		}
		else{
			tail = (struct snake*)malloc(sizeof(struct snake));//加长蛇身
			direct->next = tail;
			tail->next = NULL;
			tail->x = fx;
			tail->y = fy;
			direct = tail;
			food = 1;
		}
		flashmap(head, fx, fy, hard);
		life = live();
		if (life)
			break;

	}
}

int live(void)
{
	if (body->x == 0 || body->y == 0 || body->x == H - 1 || body->y == L - 1)
		return 1;
	else
		return 0;
}

void flashmap(struct snake*showsnake, int fx, int fy, int hard)//刷新屏幕
{
	system("cls");
	int i, j;
	memset(MAP, ' ', sizeof(MAP));
	while (showsnake != NULL)
	{
		MAP[showsnake->x][showsnake->y] = '*';
		showsnake = showsnake->next;
	}
	MAP[fx][fy] = '@';
	if (hard == 0)
	{

		for (i = 0; i < H; i++)//画地图
		{
			for (j = 0; j < L; j++)
			{
				if (i == 0 || i == H - 1 || j == 0 || j == L - 1)//造围墙
					MAP[i][j] = '#';
				printf("%c", MAP[i][j]);
			}
			printf("\n");
		}
	}
	else
	{
		for (i = 0; i < H; i++)//画地图
		{
			for (j = 0; j < L; j++)
			{
				if (i == roof[0] || i == roof[1] || j == roof[2] || j == roof[3])//屋顶
					MAP[i][j] = '+';
				if (i == 0 || i == H - 1 || j == 0 || j == L - 1)//造围墙
					MAP[i][j] = '#';
				printf("%c", MAP[i][j]);
			}
			printf("\n");
		}
	}

}

void direction(char button, struct snake*direction)//改变方向
{
	switch (button)
	{
	case 'a':direction->y--;
		break;
	case 'd':direction->y++;
		break;
	case 'w':direction->x--;
		break;
	case 's':direction->x++;
	default:break;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值