c语言小游戏-推箱子

简介: c语言小游戏-推箱子

 (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹)

之前做了很多与easyx相关的游戏,这次我们之间用控制台做游戏试试看吧

就以推箱子游戏为例

首先就是引用头文件

#include<stdio.h>
#include<conio.h>//按键控制 
#include<stdlib.h>

然后就是要定义相关变量,在推箱子游戏中,涉及到的元素有

//空地 0 墙 1 目的地 2 箱子 3 玩家 4
#define SPACE 0
#define WALL 1
#define DEST 2
#define BOX 3
#define PLAYER 4

因为控制台程序没有easyx图形库的坐标那样方便, 我们要想绘制图形,只能用二维数组来实现

//制作基本框架
int map[10][10] =
{
    0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,1,1,1,0,0,0,
    0,0,0,0,1,2,1,0,0,0,
    0,0,0,1,1,0,1,0,0,0,
    0,1,1,1,0,3,1,1,1,0,
    0,1,2,0,3,4,3,2,1,0,
    0,1,1,1,1,3,1,1,1,0,
    0,0,0,0,1,2,1,0,0,0,
    0,0,0,0,1,1,1,0,0,0,
    0,0,0,0,0,0,0,0,0,0,
};

为了便于变量的运算,我们这里将变量i,k作为全局变量

int i = 0;
int k = 0;

接下来就是图像的绘制了,如果只是用1234来表示图形未免太抽象了吧O(∩_∩)O哈哈~

void draw()//画基本框架
{
    for (int i = 0; i < 10; i++)
    {
        for (int k = 0; k < 10; k++)
        {
            switch (map[i][k])
            {
            case SPACE:
                printf("  ");
                break;
            case WALL:
                printf("l ");
                break;
            case DEST:
                printf("* ");
                break;
            case BOX:
                printf("& ");
                break;
            case PLAYER:
                printf("@ ");
                break;
            case BOX + DEST://箱子与目的地相碰后变成另一个字符
                printf("# ");
            }
        }
        printf("\n");
    }
}

画完基本框架,接下来就是对玩家进行移动

首先要先找到玩家的位置,才能对玩家进行移动,找到以后,用goto函数跳出循环

这里以向上为例:当玩家向上移动时,首先要判断玩家是否能移动,如果玩家的上面是墙,就不能移动,如果玩家的上面是箱子或者是空地,就可以移动,当玩家上面是箱子时,在玩家向上移动的同时,箱子也要跟着向上移动,当箱子上面也是墙时,箱子和玩家都不能再向上移动

getch使计算机可以直接读取键盘,这个在我之前的游戏中都有讲到。

void move()//移动
{
    //先找到玩家
    for (i = 0; i < 10; i++)
    {
        for (k = 0; k < 10; k++)
        {
            if (map[i][k] == PLAYER)
            {
                goto end;
            }
        }
    }
end:;
    char key = _getch();
    switch (key)
    {
    case'W':
    case'w':
    case 72://上
        //先判断玩家能不能动,玩家的前面是空地或者箱子才能动
        if (map[i - 1][k] == SPACE || map[i - 1][k] == DEST)
        {
            //先把人物移动到前面,再把原来的消除
            map[i - 1][k] += PLAYER;
            map[i][k] -= PLAYER;
        }
        //玩家前面是箱子
        else if (map[i - 1][k] == BOX || map[i - 1][k] == BOX + DEST)
        {
            //箱子是否可以动
            if (map[i - 2][k] == SPACE || map[i - 2][k] == DEST)
            {
                map[i - 2][k] += BOX;//移动箱子到前面
                map[i - 1][k] -= BOX;//取消原来的箱子
                map[i - 1][k] += PLAYER;
                map[i][k] -= PLAYER;
            }
        }
        break;
    case'S':
    case's':
    case 80://下
        //先判断玩家能不能动,玩家的前面是空地或者箱子才能动
        if (map[i+1][k] == SPACE || map[i+1][k] == DEST)
        {
            //先把人物移动到前面,再把原来的消除
            map[i+1][k] += PLAYER;
            map[i][k] -= PLAYER;
        }
        //玩家前面是箱子
        else if (map[i+1][k] == BOX || map[i+1][k] == BOX + DEST)
        {
            //箱子是否可以动
            if (map[i+2][k] == SPACE || map[i+2][k] == DEST)
            {
                map[i+2][k] += BOX;//移动箱子到前面
                map[i+1][k] -= BOX;//取消原来的箱子
                map[i+1][k] += PLAYER;
                map[i][k] -= PLAYER;
            }
        }
        break;
    case'A':
    case'a':
    case 75://左
        if (map[i][k - 1] == SPACE || map[i][k - 1] == DEST)
        {
            //先把人物移动到前面,再把原来的消除
            map[i][k - 1] += PLAYER;
            map[i][k] -= PLAYER;
        }
        else if (map[i][k - 1] == BOX || map[i][k - 1] == BOX + DEST)
        {
            if (map[i][k - 2] == SPACE || map[i][k - 2] == DEST)
            {
                map[i][k - 2] += BOX;//移动箱子到前面
                map[i][k - 1] -= BOX;//取消原来的箱子
                map[i][k - 1] += PLAYER;
                map[i][k] -= PLAYER;
            }
        }
        break;
    case'D':
    case'd':
    case 77://右
        if (map[i][k + 1] == SPACE || map[i][k + 1] == DEST)
        {
            map[i][k + 1] += PLAYER;
            map[i][k] -= PLAYER;
        }
        else if (map[i][k + 1] == BOX|| map[i][k + 1]==BOX+DEST)
        {
            if (map[i][k + 2] == SPACE || map[i][k + 2] == DEST)
            {
                map[i][k + 2] += BOX;
                map[i][k + 1] -= BOX;
                map[i][k + 1] += PLAYER;
                map[i][k] -= PLAYER;
            }
        }
        break;
    }
}

接下来就是要判断是否通关

//判断是否通关
int jude()
{
    for (int i = 0; i < 10; i++)
    {
        for (int k = 0; k < 10; k++)
        {
            if (map[i][k] == BOX)
            {
                return 0;
            }
        }
    }
    return 1;
}

最后将其全部输入主函数中

int main()
{
    while (1)
    {
        system("cls");
        draw();
        if (jude())
        {
            printf("通关");
            return 0;
        }
        move();
    }
    return 0;
}

具体代码如下,如果大家发现bug或者有更好的方法 ,欢迎大家一起来讨论,一起加油吧

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<conio.h>//按键控制 
#include<stdlib.h>
//空地 0 墙 1 目的地 2 箱子 3 玩家 4
#define SPACE 0
#define WALL 1
#define DEST 2
#define BOX 3
#define PLAYER 4 
//推箱子需要通过二维数组实现
//初始化变量,制作基本框架
int map[10][10] =
{
  0,0,0,0,0,0,0,0,0,0,
  0,0,0,0,1,1,1,0,0,0,
  0,0,0,0,1,2,1,0,0,0,
  0,0,0,1,1,0,1,0,0,0,
  0,1,1,1,0,3,1,1,1,0,
  0,1,2,0,3,4,3,2,1,0,
  0,1,1,1,1,3,1,1,1,0,
  0,0,0,0,1,2,1,0,0,0,
  0,0,0,0,1,1,1,0,0,0,
  0,0,0,0,0,0,0,0,0,0,
};
int i = 0;
int k = 0;
void draw()//画基本框架
{
  for (int i = 0; i < 10; i++)
  {
    for (int k = 0; k < 10; k++)
    {
      switch (map[i][k])
      {
      case SPACE:
        printf("  ");
        break;
      case WALL:
        printf("l ");
        break;
      case DEST:
        printf("* ");
        break;
      case BOX:
        printf("& ");
        break;
      case PLAYER:
        printf("@ ");
        break;
      case BOX + DEST:
        printf("# ");
      }
    }
    printf("\n");
  }
}
void move()//移动
{
  //先找到玩家
  for (i = 0; i < 10; i++)
  {
    for (k = 0; k < 10; k++)
    {
      if (map[i][k] == PLAYER)
      {
        goto end;
      }
    }
  }
end:;
  char key = _getch();
  switch (key)
  {
  case'W':
  case'w':
  case 72://上
    //先判断玩家能不能动,玩家的前面是空地或者箱子才能动
    if (map[i - 1][k] == SPACE || map[i - 1][k] == DEST)
    {
      //先把人物移动到前面,再把原来的消除
      map[i - 1][k] += PLAYER;
      map[i][k] -= PLAYER;
    }
    //玩家前面是箱子
    else if (map[i - 1][k] == BOX || map[i - 1][k] == BOX + DEST)
    {
      //箱子是否可以动
      if (map[i - 2][k] == SPACE || map[i - 2][k] == DEST)
      {
        map[i - 2][k] += BOX;//移动箱子到前面
        map[i - 1][k] -= BOX;//取消原来的箱子
        map[i - 1][k] += PLAYER;
        map[i][k] -= PLAYER;
      }
    }
    break;
  case'S':
  case's':
  case 80://下
    //先判断玩家能不能动,玩家的前面是空地或者箱子才能动
    if (map[i+1][k] == SPACE || map[i+1][k] == DEST)
    {
      //先把人物移动到前面,再把原来的消除
      map[i+1][k] += PLAYER;
      map[i][k] -= PLAYER;
    }
    //玩家前面是箱子
    else if (map[i+1][k] == BOX || map[i+1][k] == BOX + DEST)
    {
      //箱子是否可以动
      if (map[i+2][k] == SPACE || map[i+2][k] == DEST)
      {
        map[i+2][k] += BOX;//移动箱子到前面
        map[i+1][k] -= BOX;//取消原来的箱子
        map[i+1][k] += PLAYER;
        map[i][k] -= PLAYER;
      }
    }
    break;
  case'A':
  case'a':
  case 75://左
    if (map[i][k - 1] == SPACE || map[i][k - 1] == DEST)
    {
      //先把人物移动到前面,再把原来的消除
      map[i][k - 1] += PLAYER;
      map[i][k] -= PLAYER;
    }
    else if (map[i][k - 1] == BOX || map[i][k - 1] == BOX + DEST)
    {
      if (map[i][k - 2] == SPACE || map[i][k - 2] == DEST)
      {
        map[i][k - 2] += BOX;//移动箱子到前面
        map[i][k - 1] -= BOX;//取消原来的箱子
        map[i][k - 1] += PLAYER;
        map[i][k] -= PLAYER;
      }
    }
    break;
  case'D':
  case'd':
  case 77://右
    if (map[i][k + 1] == SPACE || map[i][k + 1] == DEST)
    {
      map[i][k + 1] += PLAYER;
      map[i][k] -= PLAYER;
    }
    else if (map[i][k + 1] == BOX|| map[i][k + 1]==BOX+DEST)
    {
      if (map[i][k + 2] == SPACE || map[i][k + 2] == DEST)
      {
        map[i][k + 2] += BOX;
        map[i][k + 1] -= BOX;
        map[i][k + 1] += PLAYER;
        map[i][k] -= PLAYER;
      }
    }
    break;
  }
}
//判断是否通关
int jude()
{
  for (int i = 0; i < 10; i++)
  {
    for (int k = 0; k < 10; k++)
    {
      if (map[i][k] == BOX)
      {
        return 0;
      }
    }
  }
  return 1;
}
int main()
{
  while (1)
  {
    system("cls");
    draw();
    if (jude())
    {
      printf("通关");
      return 0;
    }
    move();
  }
  return 0;
}
相关文章
|
10天前
|
C语言 C++
【C语言】编写“猜数字“小游戏
【C语言】编写“猜数字“小游戏
|
1月前
|
定位技术 API C语言
C语言——实现贪吃蛇小游戏
本文介绍了一个基于Windows控制台的贪吃蛇游戏的实现方法。首先,需调整控制台界面以便更好地显示游戏。接着,文章详细描述了如何使用Win32 API函数如`COORD`、`GetStdHandle`、`GetConsoleCursorInfo`等来控制控制台的光标和窗口属性。此外,还介绍了如何利用`GetAsyncKeyState`函数实现键盘监听功能。文中还涉及了`&lt;locale.h&gt;`库的使用,以支持本地化字符显示。
47 1
C语言——实现贪吃蛇小游戏
|
1月前
|
存储 安全 算法
C 语言——实现扫雷小游戏
本文介绍了使用二维数组创建棋盘并实现扫雷游戏的方法。首先,通过初始化数组创建一个9x9的棋盘,并添加行列标识以便操作。接着,利用随机数在棋盘上布置雷。最后,通过判断玩家输入的坐标来实现扫雷功能,包括显示雷的数量和处理游戏胜利或失败的情况。文中提供了完整的代码实现。
39 1
C 语言——实现扫雷小游戏
|
15天前
|
C语言 定位技术 API
【C语言】实践:贪吃蛇小游戏(附源码)(二)
【C语言】实践:贪吃蛇小游戏(附源码)
【C语言】实践:贪吃蛇小游戏(附源码)(二)
|
18天前
|
C语言 开发者
C语言实现猜数字小游戏(详细教程)
C语言实现猜数字小游戏(详细教程)
|
15天前
|
C语言
【C语言】实践:贪吃蛇小游戏(附源码)(三)
【C语言】实践:贪吃蛇小游戏(附源码)
|
15天前
|
存储 API C语言
【C语言】实践:贪吃蛇小游戏(附源码)(一)
【C语言】实践:贪吃蛇小游戏(附源码)
|
17天前
|
C语言
C语言贪吃蛇小游戏来啦!
C语言贪吃蛇小游戏来啦!
23 0
|
3月前
|
存储 编译器 C语言
|
3月前
|
存储 C语言
【C语言】猜数字小游戏
C语言实现猜数字小游戏
39 2
【C语言】猜数字小游戏