c语言贪吃蛇小游戏_c语言课程设计与游戏开发

c语言贪吃蛇小游戏_c语言课程设计与游戏开发用结构体来定义食物,食物需要坐标半径(由于我是用圆来表示食物)、判断是否存在(消失)、食物的颜色

目录

五、定义一个食物

六、初始化食物

七、画食物

八、吃食物

九、总代码


(接上节)

五、定义一个食物

结构体来定义食物,食物需要坐标半径(由于我是用圆来表示食物)、判断是否存在(消失)、食物的颜色

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;
    }
}

如图所示:

四节蛇与一个食物  c语言贪吃蛇小游戏_c语言课程设计与游戏开发

蛇   准备“吃食物‘”    c语言贪吃蛇小游戏_c语言课程设计与游戏开发

吃掉食物,蛇身加1 c语言贪吃蛇小游戏_c语言课程设计与游戏开发

九、总代码

#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

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注