目录
(接上节)
五、定义一个食物
用结构体来定义食物,食物需要坐标、半径(由于我是用圆来表示食物)、判断是否存在(消失)、食物的颜色。
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;
}
今天的文章c语言贪吃蛇小游戏_c语言课程设计与游戏开发分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/84185.html