目录
五、定义一个食物
六、初始化食物
七、画食物
八、吃食物
九、总代码
(接上节)
五、定义一个食物
用结构体来定义食物,食物需要坐标、半径(由于我是用圆来表示食物)、判断是否存在(消失)、食物的颜色。
struct FOOD { int x; int y; int r;//食物(圆)的半径 bool flag; DWORD color;//DWORD表示32位无符号整型 }food;
讯享网
六、初始化食物
首先理解一下什么是rand()函数,一个可以产生随机数的随机函数。一般需要设置随机数种子,因为如果不设置,rand()函数将使用默认的随机数种子即1。
可以通过srand()函数来设置随机数种子,它的函数头文件为<stdlib.h>。
如:srand(time(NULL));这是使用当前时间作为随机数种子。
srand(GetTickCount()); 这是获取一个开机毫秒随机数种子(GetTickCount()表示从操作系统启动所经过的毫秒数,它的返回值是DWORD)
rand()%n(n表示一个整数),在进行模运算(%)时,其结果的范围总是0到除数减1。
如:2%5的结果是2,因为2除以5的商为0余2。而当我们想要在0到4之间生成随机数时,可以使用2%5来获取0到4之间的随机数。
讯享网void initfood() { srand(time(NULL)); food.x = rand() % 1000; food.y = rand() % 600; food.r = 15; food.flag = true; }
七、画食物
画食物,当flag为真的时候执行
void drawfood() { if (food.flag) solidcircle(food.x, food.y, food.r); }
八、吃食物
判断吃食物,当蛇头碰到食物即吃到食物,吃到食物让食物消失,再重新生成。
因为如果让蛇的坐标与食物的中心坐标相等条件过于苛刻,所以我们让蛇的坐标等于食物(圆)的坐标。也就是:
snake.point[0].x>=food.x-food.r && snake.point[0].x <=food.x+food.r && snake.point[0].y>=food.y-food.r && snake.point[0].y <=food.y+food.r
当符合条件时,food.flag=false;蛇的长度加1节,snake.size++;
讯享网void eatfood() { if (snake.point[0].x >= food.x - food.r && snake.point[0].x <= food.x + food.r && snake.point[0].y >= food.y - food.r && snake.point[0].y <= food.y + food.r) { food.flag = false; snake.size++; //再次重新生成一个食物 food.x = rand() % 1000; food.y = rand() % 600; food.r = 15; food.flag = true; } }
如图所示:
四节蛇与一个食物 
蛇 准备“吃食物‘” 
吃掉食物,蛇身加1 
九、总代码
#include<stdio.h> #include<time.h> #include<stdlib.h> #include<graphics.h> #include<conio.h> struct Point { int x; int y; }; //蛇的坐标分为横坐标纵坐标 typedef enum { up=72, down=80, left=75, right=77 }; //通过枚举分别列出蛇的四个方向 struct Snake { int size;//节数 int dir;//方向 int speed;//速度 struct Point point[100];//坐标 }snake; struct FOOD { int x; int y; int r;//食物(圆)的半径 bool flag; DWORD color;//DWORD表示32位无符号整型 }food; void initsnake() { snake.size = 4;//设置蛇的初始节数为4 snake.speed = 10;//设置蛇的速度为10 snake.dir = right;//设置蛇的初始方向为向右移动 snake.point[0].x = 10; snake.point[0].y = 10; for (int i = 0; i < snake.size; i++) { snake.point[i].x = 40 - 10 * i;//由于设置的是四节蛇,这样设置使每节相隔10 snake.point[i].y = 10;//使初始蛇的纵坐标统一固定在同一水平线 } } void initfood() { srand(time(NULL)); food.x = rand() % 1000; food.y = rand() % 600; food.r = 15; food.flag = true; } void drawsnake() { for (int i = 0; i < snake.size; i++) { rectangle(snake.point[i].x, snake.point[i].y, snake.point[i].x + 10, snake.point[i].y + 10); //画矩形,也可以用solidcircle(snake.point[i].x, snake.point[i].y,5) } } void drawfood() { if (food.flag) solidcircle(food.x, food.y, food.r); } void movesnake() { for (int i = snake.size-1; i > 0;i--) { snake.point[i] = snake.point[i-1]; //从蛇尾开始,蛇尾等于上一个蛇身,即每一个点等于它上一个点的坐标 } switch (snake.dir) { case right: snake.point[0].x = snake.point[0].x + snake.speed; if (snake.point[0].x + snake.speed >= 1000) { snake.point[0].x = 0; }break; case left: snake.point[0].x = snake.point[0].x - snake.speed; if (snake.point[0].x - snake.speed <= 0) { snake.point[0].x = 1000; } break; case up: snake.point[0].y = snake.point[0].y - snake.speed; if (snake.point[0].y - snake.speed <= 0) { snake.point[0].y = 600; } break; case down: snake.point[0].y = snake.point[0].y + snake.speed;//或者snake.point[0].y += snake.speed; if (snake.point[0].y + snake.speed >= 600) { snake.point[0].y = 0; } break; default: break; } } void KeyControl() { // 判断有没有按键; if (_kbhit())//检测有没有按键,如果有就返回真,否则返回假; { //72 80 75 77上下左右键值; switch (_getch()) { case 'w': case 'W': case 72: if (snake.dir != down) { snake.dir = up; } break; case 's': case 'S': case 80: if (snake.dir != up) { snake.dir = down; } break; case 'a': case 'A': case 75: if (snake.dir != right) { snake.dir = left; } break; case 'd': case 'D': case 77: if (snake.dir != left) { snake.dir = right; } break; case ' ': while (1) { if (_getch() == ' ');//空格键暂停 return; } } } } void eatfood() { if (snake.point[0].x >= food.x - food.r && snake.point[0].x <= food.x + food.r && snake.point[0].y >= food.y - food.r && snake.point[0].y <= food.y + food.r) { food.flag = false; snake.size++; //再次重新生成一个食物 food.x = rand() % 1000; food.y = rand() % 600; food.r = 15; food.flag = true; } } //首先定义一个图形界面 int main() { initgraph(1000, 600); initsnake(); initfood(); while (1) { setbkcolor(RGB(28, 1115, 119));//设置背景颜色 cleardevice();//用该颜色清除图形屏幕,也就是填充背景 drawsnake(); drawfood(); movesnake(); KeyControl(); eatfood(); Sleep(80);//延时 } return 0; }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/19580.html