小游戏:人生中写的第一个小游戏——贪吃蛇(C语言)

简介: 小游戏:人生中写的第一个小游戏——贪吃蛇(C语言)

小编开了一个关于游戏的专栏,主要是运用easyx图形库进行的。


系列文章的目录:    

      第一章:人生中写的第一个小游戏——贪吃蛇(C语言)


       这个游戏的代码我在gitee上发布了,大家如果不嫌弃,可以进入这个网址进行查看和复制:https://gitee.com/rising-sun-1

微信截图_20230911195916.png

 今天,我们来用easyx图形库,C语言进行编写代码。首先,我们要进行分析这个小游戏的大致思路,然后将代码编写下来。


目录


分析思路:


窗口:


贪吃蛇:


食物:


其他功能:


代码编写:


编写代码前的准备:


开头准备:


蛇的创建:


食物的创建:


游戏结束的条件:


游戏初始化:


主函数内部:


分析思路:

窗口:

      首先,要先创建一个像素窗口,利用initgraph函数进行创建(这个函数的基本用法可以进入这个网站进行查看:https://docs.easyx.cn/zh-cn/intro)。


      创建完后开始想这个游戏的基本元素:贪吃蛇和食物。下面对贪吃蛇和食物进行分析:


贪吃蛇:

      对于贪吃蛇来说,需要好几个格子,那么这些格子有如何联系在一起呢?因为数组是要求相同类型的数据存放在一起,但对于在二维空间中存放蛇的身体需要坐标来表示,所以用数组相对麻烦,我们可以用结构体进行表示蛇的结点。因为蛇要移动,所以我们可以将头结点进行移动,然后将尾结点删除,这样,蛇就可以进行移动了。蛇在移动过程中,需要进行方向的变换,哪要如何变化方向呢?可以对坐标进行考虑,例如,向下移动,纵坐标就加一等等。


食物:

      食物是需要随机分布的,所以要进行随机数 的选取,利用rand函数(用cplusplus.com进行查看函数的用途),为了使随机数更加随机,我们需要使用time函数进行(需要调用头文件#include )。


其他功能:

      其他功能还有蛇吃掉食物,蛇的身体进行加长,游戏结束的条件,游戏结束后进行重新初始化,在写代码时进行讨论。


大致思路如上,下面进行代码的编写:


代码编写:

编写代码前的准备:

       首先,要先下载easyx图形库(https://easyx.cn/),下载完以后,按图操作,进入vs中创建项目,选择控制台应用,进入编写代码即可。


微信截图_20230911212112.png

开头准备:

      首先,进行编写头文件和宏,屏蔽了scanf函数的不安全性。

(为什么不用scanf_s函数,是因为scanf_s函数是vs的,其他编译器上不兼容,造成了函数的不可移植性。)

微信截图_20230911212129.png

接下来,创建一个main函数,根据分析思路进行创建一个800像素高,600像素宽的窗口,然后利用line函数进行表格的绘制,大致代码如下:

void printline()   //进行表格的绘画
{
  int x = 0;
  for (x = 0; x <= 800; x += NODE_WIDTH)
  {
    line(x, 0, x, 600);   //line函数是画出直线的函数
  }
  int y = 0;
  for (y = 0; y < 600; y += NODE_WIDTH)
  {
    line(0, y, 800, y);
  }
}
int main()
{
    //创建窗口
  initgraph(800, 600);
  setbkcolor(RGB(164, 225, 202)); //创建一个像素窗口
  cleardevice();
  getchar();
  closegraph();
  return 0;
}

蛇的创建:

     然后进行蛇的创建,利用结构体进行创建一个结点。

typedef struct {   //贪吃蛇的结点
  int x;
  int y;
}node;

定义一下蛇的初始位置:


node snack[100] = { {5, 7}, {4, 7}, {3, 7}, {2, 7}, {1, 7} };

      因为蛇的身体是由多个矩形(正方体)构成的,所以需要利用循环进行构建,已知蛇的长度用for循环进行构建。


      循环在C语言中有三个,分别是:for,while,do while。他们有一些区别使得他们适用的场景不太相同,如果已知循环的次数用for循环,如果不知道循环的次数用while循环,如果想要先循环一次则用do while循环。

void printsnack(node* snack, int n)  //进行蛇主题的绘画
{
  int left, right, bottom, top;
  int i = 0;
  for (i = 0; i < n; i++)
  {
    left = snack[i].x * NODE_WIDTH;
    top = snack[i].y * NODE_WIDTH;
    right = (snack[i].x + 1) * NODE_WIDTH;
    bottom = (snack[i].y + 1) * NODE_WIDTH;
    solidrectangle(left, top, right, bottom); 
  }
}

  建立完蛇身后进行蛇的移动,如何使蛇移动呢?利用坐标使蛇进行移动,例如,将前一个结点的值传入后一个结点的值,循环一下,就会使蛇向右前进一个,利用头结点使蛇进行移动,也是利用头结点进行控制方向,例如,向上移动,头结点的纵坐标减一,代码如下:

node snackmove(node* snack, int length, int direction) //蛇移动的函数
{
  node newfinsh = snack[length - 1];  //将蛇结点的最后一个结点保存下来
  for (int i = length - 1; i > 0; i--)
  {
    snack[i] = snack[i - 1];   //将前一个蛇结点移动到后一个蛇结点,进行蛇的移动
  }
  node head;  //定义一个头结点并利用头结点进行方向的移动
  head = snack[0];
  if (direction == eUp)
  {
    head.y--;
  }
  else if (direction == eDown)
  {
    head.y++;
  }
  else if (direction == eLeft)
  {
    head.x--;
  }
  else if (direction == eRight)
  {
    head.x++;
  }
  snack[0] = head;
  return newfinsh;
}

下面就是如何进行键盘交互,就是在键盘上输入‘w',会使蛇向上运动。首先利用_kbhit函数进行检查输入缓存区中是否有数据,利用getch()函数进行从缓存区中获取输入数据并做相应的数据。在这里要注意蛇不能往正在移动方向的反方向进行移动,所以需要加上条件。

void changedirection(enum direction* pD)   //中间有键盘交互的代码
{ 
  if (_kbhit() != 0)//检查输入缓存区中是否有数据
  {
    char c = _getch();//从缓存区中获取输入数据并做相应的数据
    switch (c)
    {
    case 'w':
      if(*pD != eDown) //要注意蛇不能向正在移动的反方向进行移动
      *pD = eUp;
      break;
    case 's':
      if(*pD != eUp)
      *pD = eDown;
      break;
    case 'a':
      if(*pD != eRight)
      *pD = eLeft;
      break;
    case 'd':
      if(*pD != eLeft)
      *pD = eRight;
      break;
    }
  }
}

食物的创建:

      食物的创建是需要随机分布的,所以利用随机数进行食物位置的随机。随机值是需要在创建的窗口内的,不能超过窗口。食物也不能创建在蛇的身体上,代码如下:

node creatfood(node* snack, int length)  //创建食物
{
  node food;
  while (1)
  {
    food.x = rand() % (800 / NODE_WIDTH); //利用随机数进行食物位置的随机
    food.y = rand() % (600 / NODE_WIDTH);
    int i = 0;
    for (i = 0; i < length; i++) //利用for循环一一遍历,防止食物生成在蛇身上
    {
      if (food.x == snack[i].x && food.y == snack[i].y)
      {
        break;
      }
    }
    if (i < length) //如果i小于蛇的长度,则需要继续遍历,知道i大于蛇的长度
    {
      continue;
    }
    else
      break;
  }
  return food;
}

在窗体上打印出食物就相对容易,也是利用solidrectangle函数进行绘制的,不过为了区分食物和蛇的颜色,我们可以利用setfillcolor函数进行填充不同的颜色。


游戏结束的条件:

      条件是蛇不能碰到墙壁,蛇不能碰到蛇身,用if判断就可以搞定。要注意这个函数的返回类型是bool类型。

bool isgameover(node* snack, int length)//游戏结束的条件
{
  if (snack[0].x < 0 || snack[0].x>800 / NODE_WIDTH)//当蛇碰到墙壁,游戏结束
    return true;
  if (snack[0].y < 0 || snack[0].y>600 / NODE_WIDTH)
    return true;
  for (int i = 1; i < length; i++)   //当蛇碰到蛇身游戏结束
  {
    if (snack[0].x == snack[i].x && snack[0].y == snack[i].y)
      return true;
  }
  return false;
}

游戏初始化:

       就是让游戏进行重新开始游戏的状态。

主函数内部:

       要用Sleep函数进行调解蛇移动的快慢,蛇如果吃到了食物,则蛇变长。

while (1)
  {
    cleardevice();
    printline();
    printsnack(snack, length);
    printfood(food);
    Sleep(500);
    changedirection(&d);
    node newlist = snackmove(snack, length, d);
    if (snack[0].x == food.x && snack[0].y == food.y)
    {
      if(length < 100)
      {
        snack[length] = newlist;
        length++;
      }
      food = creatfood(snack, length);
    }
    if (isgameover(snack, length) == true)
    {
      reset(snack, &length, &d);
      food = creatfood(snack, length);
    }
  }

 感谢大家的观看,如果有错,希望大佬批评指正。这是个刚刚踏上编程之旅的萌新。

相关文章
|
2月前
|
C语言 C++
【C语言】编写“猜数字“小游戏
【C语言】编写“猜数字“小游戏
107 1
|
3月前
|
定位技术 API C语言
C语言——实现贪吃蛇小游戏
本文介绍了一个基于Windows控制台的贪吃蛇游戏的实现方法。首先,需调整控制台界面以便更好地显示游戏。接着,文章详细描述了如何使用Win32 API函数如`COORD`、`GetStdHandle`、`GetConsoleCursorInfo`等来控制控制台的光标和窗口属性。此外,还介绍了如何利用`GetAsyncKeyState`函数实现键盘监听功能。文中还涉及了`&lt;locale.h&gt;`库的使用,以支持本地化字符显示。
78 1
C语言——实现贪吃蛇小游戏
|
3月前
|
存储 安全 算法
C 语言——实现扫雷小游戏
本文介绍了使用二维数组创建棋盘并实现扫雷游戏的方法。首先,通过初始化数组创建一个9x9的棋盘,并添加行列标识以便操作。接着,利用随机数在棋盘上布置雷。最后,通过判断玩家输入的坐标来实现扫雷功能,包括显示雷的数量和处理游戏胜利或失败的情况。文中提供了完整的代码实现。
57 1
C 语言——实现扫雷小游戏
|
2月前
|
存储 API C语言
【C语言】实践:贪吃蛇小游戏(附源码)(一)
【C语言】实践:贪吃蛇小游戏(附源码)
|
2月前
|
C语言 定位技术 API
【C语言】实践:贪吃蛇小游戏(附源码)(二)
【C语言】实践:贪吃蛇小游戏(附源码)
【C语言】实践:贪吃蛇小游戏(附源码)(二)
|
2月前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
2月前
|
存储 定位技术 API
C语言项目实战:贪吃蛇
C语言项目实战:贪吃蛇
|
2月前
|
C语言
【C语言】实践:贪吃蛇小游戏(附源码)(三)
【C语言】实践:贪吃蛇小游戏(附源码)
|
2月前
|
C语言
C语言贪吃蛇小游戏来啦!
C语言贪吃蛇小游戏来啦!
36 0
|
5月前
|
存储 编译器 C语言