用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c++代码库

贪食蛇源码c++

2015-08-27 作者:小蜜锋举报

[c++]代码库

#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#include<conio.h>
#include<time.h>

#define Map_long 20
#define Map_high 15

typedef struct snake{
	int goods_class;
	int direction;
}SNAKE;

/*-------------------------------------------------------*/
/*                    全局变量声明区                      */

/* 二维结构体数组里goods_class的值,0代表活动区域(空格),
* 1代表■(地图砖头),2代表★(食物),3代表●(蛇头)
* 3之后的数字代表◎(蛇身),3+蛇长度-1表示◎(蛇尾)*/
/*direction表示蛇移动的方向,↑8,↓2,←4,→6*/
SNAKE Snake[Map_high][Map_long] = { { 0 } };

unsigned die = 0;  //1表示游戏结束
unsigned snake_move = 0;  //移动成功,用来跳出三重循环
unsigned eat_food = 0;  //1表示碰到食物,2表示用来跳出循环
unsigned snake_long = 3;  //记录蛇的长度

void Move(int ch);  //蛇移动的函数

void HideCursor();  //隐藏光标函数

int main(void)
{
	system("mode con:cols=43 lines=20");  //将控制台设置成长41,高18
	HideCursor();

	/*定义局部变量区域*/
	unsigned i, j;
	unsigned food = 0;  //食物存在的标志,1代表食物存在
	unsigned food_x, food_y;  //产生食物的临时坐标
	unsigned score = 0;  //统计分数
	char ch = '\0';  //用来获取↑↓←→

	/*播种子*/
	srand((unsigned)time(NULL));

	/*初始化地图*/
	for (i = 0; i < Map_long; i++)
	{
		Snake[0][i].goods_class = 1;
		Snake[Map_high - 1][i].goods_class = 1;
	}
	for (i = 0; i < Map_high; i++)
	{
		Snake[i][0].goods_class = 1;
		Snake[i][Map_long - 1].goods_class = 1;
	}

	/*初始化蛇的位置*/
	for (i = 0; i < snake_long; i++)
		Snake[Map_high / 2][Map_long / 2 + i].goods_class = snake_long + i;

	while (1)
	{
		while (!_kbhit())
		{
			switch (ch)
			{
			case 72:Move(8); break;
			case 75:Move(4); break;
			case 77:Move(6); break;
			case 80:Move(2); break;
			default:break;
			}

			if (eat_food == 2)  //2表示吃到食物,开始重置状态
			{
				food = 0;  //食物没有了
				eat_food = 0;  //重新判定是否吃到食物
				snake_long++;  //蛇的长度加1
				score++;  //增加分数
			}

			/*产生食物*/
			do{
				if (food == 1)
					break;
				food_x = rand() % Map_long;
				food_y = rand() % Map_high;
				if (Snake[food_y][food_x].goods_class == 0)
				{
					Snake[food_y][food_x].goods_class = 2;
					food++;
					break;
				}
			} while (1);

			printf("Grade:%u\n", score);
			for (i = 0; i < Map_high; i++)
			{
				if (die == 1)
					break;

				for (j = 0; j < Map_long; j++)
				{
					switch (Snake[i][j].goods_class)
					{
					case 0:printf("  "); break;
					case 1:printf("■"); break;
					case 2:printf("★"); break;
					case 3:printf("●"); break;
					default:printf("◎"); break;
					}
				}
				putchar('\n');
			}
			printf("Up↑ Down↓ Left← Right→ Other Pause.");

			Sleep(50);
			system("cls");

			if (die == 1)
				break;
		}
		if (die == 1)
			break;

		do{
			ch = _getch();
		} while (ch != -32 && ch != 80 && ch != 72 && ch != 77 && ch != 75);
		ch = _getch();
	}
	system("cls");
	printf("Game Over,your grade is %u.\n", score);
	getchar();
	return 0;
}

void Move(int ch)
{
	int i, j, n;
	int direction;  //临时存储方向

	for (n = 0; n < snake_long; n++)
	for (i = 0; i < Map_high; i++)
	{
		if (snake_move == 1)
		{
			snake_move = 0;
			break;
		}
		if (eat_food == 2)
			break;
		for (j = 0; j < Map_long; j++)
		if (Snake[i][j].goods_class == 3 + n)
		{
			/*第一次获取按键,初始化蛇的运动状态*/
			if (Snake[i][j].goods_class == 3 && Snake[i][j].direction == 0)
			{
				Snake[i][j].direction = ch;
				Snake[i][j + 1].direction = 4;
				Snake[i][j + 2].direction = 4;
			}
			else if (Snake[i][j].goods_class == 3)  //重置蛇头的方向
				Snake[i][j].direction = ch;

			/*进行移动前,先判断蛇头是否碰到死亡因子*/
			if (Snake[i][j].goods_class == 3)
			{
				if (Snake[i][j].direction == 8 && Snake[i - 1][j].goods_class != 0 && Snake[i - 1][j].goods_class != 2)
					die++;

				else if (Snake[i][j].direction == 2 && Snake[i + 1][j].goods_class != 0 && Snake[i + 1][j].goods_class != 2)
					die++;

				else if (Snake[i][j].direction == 4 && Snake[i][j - 1].goods_class != 0 && Snake[i][j - 1].goods_class != 2)
					die++;

				else if (Snake[i][j].direction == 6 && Snake[i][j + 1].goods_class != 0 && Snake[i][j + 1].goods_class != 2)
					die++;
			}

			/*进行移动前,先判断蛇头是否碰到食物*/
			if (Snake[i][j].goods_class == 3)
			{
				if (Snake[i][j].direction == 8 && Snake[i - 1][j].goods_class == 2)
					eat_food++;

				else if (Snake[i][j].direction == 2 && Snake[i + 1][j].goods_class == 2)
					eat_food++;

				else if (Snake[i][j].direction == 4 && Snake[i][j - 1].goods_class == 2)
					eat_food++;

				else if (Snake[i][j].direction == 6 && Snake[i][j + 1].goods_class == 2)
					eat_food++;
			}

			if (die == 1)
				break;

			/*蛇尾的移动*/
			if (Snake[i][j].goods_class == 3 + snake_long - 1)
			{
				if (eat_food == 1)  //吃到食物就更新蛇尾
				{
					if (Snake[i][j].direction == 8)
					{
						direction = Snake[i - 1][j].direction;
						Snake[i - 1][j] = Snake[i][j];
						Snake[i - 1][j].direction = direction;
						Snake[i][j].goods_class = 3 + snake_long;
					}
					else if (Snake[i][j].direction == 2)
					{
						direction = Snake[i + 1][j].direction;
						Snake[i + 1][j] = Snake[i][j];
						Snake[i + 1][j].direction = direction;
						Snake[i][j].goods_class = 3 + snake_long;
					}
					else if (Snake[i][j].direction == 4)
					{
						direction = Snake[i][j - 1].direction;
						Snake[i][j - 1] = Snake[i][j];
						Snake[i][j - 1].direction = direction;
						Snake[i][j].goods_class = 3 + snake_long;
					}
					else if (Snake[i][j].direction == 6)
					{
						direction = Snake[i][j + 1].direction;
						Snake[i][j + 1] = Snake[i][j];
						Snake[i][j + 1].direction = direction;
						Snake[i][j].goods_class = 3 + snake_long;
					}
					snake_move++;
					eat_food++;
					break;
				}
				else{
					if (Snake[i][j].direction == 8)
					{
						Snake[i][j].direction = Snake[i - 1][j].direction;
						Snake[i - 1][j] = Snake[i][j];
						Snake[i][j].goods_class = 0;
					}
					else if (Snake[i][j].direction == 2)
					{
						Snake[i][j].direction = Snake[i + 1][j].direction;
						Snake[i + 1][j] = Snake[i][j];
						Snake[i][j].goods_class = 0;
					}
					else if (Snake[i][j].direction == 4)
					{
						Snake[i][j].direction = Snake[i][j - 1].direction;
						Snake[i][j - 1] = Snake[i][j];
						Snake[i][j].goods_class = 0;
					}
					else if (Snake[i][j].direction == 6)
					{
						Snake[i][j].direction = Snake[i][j + 1].direction;
						Snake[i][j + 1] = Snake[i][j];
						Snake[i][j].goods_class = 0;
					}
					snake_move++;
					break;
				}
			}

			/*蛇头的移动*/
			if (Snake[i][j].goods_class == 3)
			{
				if (Snake[i][j].direction == 8)
					Snake[i - 1][j] = Snake[i][j];

				else if (Snake[i][j].direction == 2)
					Snake[i + 1][j] = Snake[i][j];

				else if (Snake[i][j].direction == 4)
					Snake[i][j - 1] = Snake[i][j];

				else if (Snake[i][j].direction == 6)
					Snake[i][j + 1] = Snake[i][j];
				snake_move++;
				break;
			}

			/*蛇身的移动*/
			if (Snake[i][j].direction == 8)
			{
				direction = Snake[i - 1][j].direction;
				Snake[i - 1][j] = Snake[i][j];
				Snake[i - 1][j].direction = direction;
			}
			else if (Snake[i][j].direction == 2)
			{
				direction = Snake[i + 1][j].direction;
				Snake[i + 1][j] = Snake[i][j];
				Snake[i + 1][j].direction = direction;
			}
			else if (Snake[i][j].direction == 4)
			{
				direction = Snake[i][j - 1].direction;
				Snake[i][j - 1] = Snake[i][j];
				Snake[i][j - 1].direction = direction;
			}
			else if (Snake[i][j].direction == 6)
			{
				direction = Snake[i][j + 1].direction;
				Snake[i][j + 1] = Snake[i][j];
				Snake[i][j + 1].direction = direction;
			}
			snake_move++;
			break;
		}
	}
}

void HideCursor()//隐藏光标函数
{
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}


分享到:
更多

网友评论    (发表评论)

共6 条评论 1/1页

发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。