当前位置:   article > 正文

C语言贪吃蛇_c语言随机食物思路

c语言随机食物思路

一、说明

  • 编译环境:vs 2019
  • 需要安装 eazyx(几秒钟就行)
  • 代码注释详细
  • 成像图
    蛇身和食物颜色都会不断变化

二、制作思路

  1. 界面
    大小、颜色
  2. 蛇的初始化
    蛇身形状、长度,出现在地图的位置,一开始往哪个方向移动
  3. 食物的随机出现
    播种:srand((unsigned int)time(NULL));
    随机函数:rand()
  4. 蛇的行动操作(移动和吃食物)
    WASD
    不能直接走与自身方向相反的方向,如:
     向右走时不能向左
  5. 蛇死亡条件
    撞边界、撞自己
  6. 得分的计算
    吃食物得分,打印在界面
  7. 如何画蛇、画食物

三、代码

//在代码中取消 Unicode 编码的宏定义,让后续编译都以 MBCS 编码进行
#undef UNICODE
#undef _UNICODE

#include<stdio.h>
#include<conio.h> // _getch  _kbhit
#include<time.h>
#include<graphics.h> //需安装easyX

//界面大小,可直接修改
#define M 600
#define N 400

typedef struct {
	int x, y;
}point;//坐标xy,与数学的坐标略有不同
struct snake {
	point xy[100];
	int position;
	int lenth;
}snake;
struct food {
	int flag = 0;//判断食物是否存在
	point fdxy;
	int grade = 0;
}food;

enum position { up, down, left, right };//枚举

//蛇,初始化蛇的位置
void startsnake()
{
	//蛇头
	snake.xy[0].x = 20;
	snake.xy[0].y = 0;

	snake.xy[1].x = 10;
	snake.xy[1].y = 0;

	snake.xy[2].x = 0;
	snake.xy[2].y = 0;

	//蛇初始化方向
	snake.position = right;

	snake.lenth = 3;
}

//画蛇(要安装easy_X),颜色会不断变化
void drawsnake()
{
	for (int i = 0; i < snake.lenth; i++)
	{
		setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
		fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10);
	}
}

void movesnake()
{
	//蛇身往前移动一格
	for (int i = snake.lenth - 1; i > 0; i--)
	{
		snake.xy[i].x = snake.xy[i - 1].x;
		snake.xy[i].y = snake.xy[i - 1].y;
	}
	//蛇头方向移动
	switch (snake.position)
	{
	case up:
		snake.xy[0].y = snake.xy[0].y - 10; break;
	case down:
		snake.xy[0].y = snake.xy[0].y + 10; break;
	case left:
		snake.xy[0].x = snake.xy[0].x - 10; break;
	case right:
		snake.xy[0].x = snake.xy[0].x + 10; break;
	}
}

//随机生成食物
void showfood()
{
	food.fdxy.x = rand() % (M/10) * 10;//0~590
	food.fdxy.y = rand() % (N/10) * 10;//0~390
	//循环用于判断是否与蛇重合
	for (int i = 0; i < snake.lenth; i++)
	{
		if (snake.xy[i].x == food.fdxy.x && snake.xy[i].y == food.fdxy.y)
		{
			food.fdxy.x = rand() % 60 * 10;
			food.fdxy.y = rand() % 40 * 10;
		}
	}
}
//
void drawfood()
{
	setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
	fillrectangle(food.fdxy.x, food.fdxy.y, food.fdxy.x + 10, food.fdxy.y + 10);
}

void eatfood()
{
	if (snake.xy[0].x == food.fdxy.x && snake.xy[0].y == food.fdxy.y)
	{
		snake.lenth++;
		food.flag = 0;//这里看下main函数
		food.grade += 10;
	}
}

//键盘操作
void keydown()
{
	char dqown = _getch();
	switch (dqown)
	{
	case 'W':
	case 'w':
		if (snake.position != down)
			snake.position = up;
		break;
	case 'A':
	case 'a':
		if (snake.position != right)
			snake.position = left;
		break;
	case 'S':
	case 's':
		if (snake.position != up)
			snake.position = down;
		break;
	case 'D':
	case 'd':
		if (snake.position != left)
			snake.position = right;
		break;
	case '9':Sleep(5000);//按下 9 暂停 5 秒 (可自行更改)
	}
}

void showgrade()
{
	char Grade[20] = "";
	sprintf_s(Grade, "grade:%d", food.grade);
	outtextxy(250, 20, Grade);
}

//撞墙则死,碰自己不死
void dead()
{
	if (snake.xy[0].x == M || snake.xy[0].x < 0 || snake.xy[0].y < 0 || snake.xy[0].y == N)
	{
		char over[20] = "Game Over!";
		outtextxy(250, 50, over);
		system("pause");
		exit(0);
	}

}

int main()
{
	srand((unsigned int)time(NULL));//播种
	initgraph(M, N); //画面大小,可自行随意更改
	setbkcolor(RGB(110, 120, 119));//背景颜色

	//初始化蛇
	startsnake();
	drawsnake();

	while (1)
	{
		cleardevice();//清屏
		movesnake();
		drawsnake();
		if (food.flag == 0)//判断是否生成食物
		{
			showfood();
			food.flag = 1;
		}
		drawfood();
		if (_kbhit())//判断是否键盘操作
		{
			keydown();
		}
		eatfood();
		showgrade();
		dead();
		Sleep(100);//这个可以看作蛇的移动速度
	}
	return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/626116
推荐阅读
相关标签
  

闽ICP备14008679号