我的编程空间,编程开发者的网络收藏夹
学习永远不晚

用C++实现推箱子小游戏

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

用C++实现推箱子小游戏

前言

推箱子小游戏相信是很多人的同年记忆了,今天用c++语言来尝试下,用的是vs编译器。

代码还有很多可以优化的地方,为了更直观了解函数的形参和实参,所以地图没有用全局变量声明了,其实用全局变量声明会简洁很多。

头文件和main函数分享在最下面了。

提示:以下是本篇文章正文内容,下面案例可供参考

一、初始化游戏数据


void GameInit(int(*&pMap)[10][10], int index)//两张地图数据
{
 // static:返回静态全局区变量
 static int localmap[2][10][10] =
 {
  {
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
   1, 0, 5, 0, 1, 0, 0, 3, 0, 1,
   1, 0, 0, 0, 1, 0, 0, 3, 0, 1,
   1, 0, 0, 4, 1, 0, 0, 3, 0, 1,
   1, 0, 0, 0, 1, 0, 0, 0, 0, 1,
   1, 0, 0, 0, 1, 0, 0, 0, 0, 1,
   1, 0, 0, 0, 1, 0, 0, 0, 0, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  },
  {
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
   1, 0, 0, 0, 0, 0, 0, 0, 0, 1,
   1, 0, 0, 0, 0, 4, 0, 0, 0, 1,
   1, 0, 5, 0, 0, 0, 0, 0, 0, 1,
   1, 0, 0, 0, 3, 0, 0, 1, 0, 1,
   1, 0, 0, 0, 0, 0, 0, 1, 0, 1,
   1, 0, 0, 0, 0, 0, 0, 1, 0, 1,
   1, 0, 0, 0, 1, 0, 1, 1, 0, 1,
   1, 0, 0, 0, 1, 0, 0, 0, 0, 1,
   1, 1, 1, 1, 1, 1, 1, 1, 1, 1
  }
 };
 // 数组指针指向对应关卡的地址
 pMap = localmap ;//数组名表示指针,此时指向第一个二维数组地图
}

用3维数组来编写两个地图,第一关过了就进入下一关,用static关键字声明数组,保证地图数据可以返回出去。

二、渲染地图


void RenderMap(int(*pMap)[10][10])
{
 system("CLS");
 for (int i = 0; i < 10; i++)
 {
  for (int j = 0; j < 10; j++)
  {
  int element = (*pMap)[i][j];
   switch (element)
   {
   case 0:
    cout << "  ";//空地
    break;
   case 1:cout << "■";//墙
    break;
   case 3:
    cout << "☆";//胜利点
    break;
   case 4:
    cout << "□";//箱子
    break;
     case 5:
    cout << "♀";//人
    posx = i;//记录人的坐标
    posy = j;
    break;
    case 7:
    cout << "★";//箱子进入胜利点
    break;
    case 8:
    cout << "♀";//人进入胜利点
    posx = i;//记录人的坐标
    posy = j;
    break;
   } }
  cout << endl;
 }
}

渲染地图其实很简单了,做个二维数组的遍历,用switch语句进行渲染,
这里其实还有一点可以渲染的更明了一点,可以在全局声明,拿人来举例子。


const int people = 5;

这样的好处呢其实用people来代替5这个数字,显得更直观,不然下面更新地图数据还要翻上去看哪个数字代表什么就很麻烦。

三、 更新地图数据


void UpdateMap(int(*&pMap)[10][10])
{
 char input = _getch();//获取从键盘输入的字母
 int offsetx=0, offsety=0;//设置偏移量
 switch (input)
 {
 case 's':
 case 'S'://输入s,人物向下走,x加1,偏移量为1,y不变,一次类推
 offsetx= 1;
  offsety = 0;
  break;
 case 'w':
 case 'W':
  offsetx = -1;
  offsety = 0;
  break;
  case 'd':
 case 'D':
  offsety = 1;
  offsetx = 0;
  break;
 case 'a':
 case 'A':
  offsety = -1;
  offsetx = 0;
  break;
 default:
  break;
  }
 move(pMap, offsetx, offsety);//调用了move函数
}

这是move函数,形参为地图和偏移量,在move函数中调用了 nextElement函数;
可以看到,在一开始定义了两个int型常量分别保存英雄下一个位置和下下个位置的值;


void move(int(*&pMap)[10][10], int offsetx, int offsety)
{
int nextelementOfpos = nextElement(pMap, posx+offsetx, posy+offsety);//下一个位置
 int nextnextelementOfpos = nextElement(pMap, posx+offsetx * 2,posy+offsety * 2);//下下个位置
 if (nextelementOfpos == 0 || nextelementOfpos == 3)
  {
  *((*((*(pMap )) + posx)) + posy) -= 5;
  *((*((*(pMap )) + posx + offsetx)) + posy + offsety) += 5;
 }
 else if (nextelementOfpos == 4 || nextelementOfpos == 7)
 {
  if (nextnextelementOfpos == 0 || nextnextelementOfpos == 3)
   {
    *(*((*(pMap )) + posx) + posy) -= 5;
    *(*((*(pMap)) + posx + offsetx) + posy + offsety) += 5;
    *(*((*(pMap )) + posx + offsetx) + posy + offsety) -= 4;
    *(*((*(pMap )) + posx + offsetx * 2) + posy + offsety * 2) += 4;
   }
 }
 }

记录移动后人物的下一个位置


int nextElement(int(*&pMap)[10][10], int x, int y)
{
 int k = *(*((*(pMap)) + x) + y);//指针偏移运算,运行结果为偏移后的地址,用k保存并返回
 return k;
}

//判定游戏过关
bool isWin(int(*&pMap)[10][10])
{
 for (int i = 0; i < 10; i++)
 {
  for (int j = 0; j < 10; j++)
  {
   if ((*pMap)[i][j] == 4)
    return false;
  }
 }
 return true;
}

四、头文件的定义和引用

以下是头文件的声明


// 初始化游戏数据
void GameInit(int(*&pMap)[10][10], int index);
// 渲染地图
void RenderMap(int(*pMap)[10][10]);
// 更新地图数据
void UpdateMap(int(*&pMap)[10][10]);
void move(int(*&pMap)[10][10], int offsetx, int offsety);
int nextElement(int(*&pMap)[10][10], int x, int y);
int posx, posy;//人物坐标
int mapPage=1;//第一张地图
bool isWin(int(*&pMap)[10][10]);//判断是否过关

main函数


#include <iostream>
#include <conio.h>
using namespace std;
#include "header.h"
int main()
{
 // 地图数据
 int(*mMap)[10][10];
 // 1.初始化游戏数据(地图)
 GameInit(mMap, mapPage);
 while (true)
 {
  // 2.渲染地图
  RenderMap(mMap);
  if (isWin(mMap))
  {
   if (mapPage == 2)
   {
    cout << "恭喜你,已经通关了" << endl;
    break;
   }
   cout << "游戏胜利,按任意键进入下一关" << endl;
   getch();
   mapPage++;
   mMap++;
   continue;
  }
  // 3.更新地图数据
  UpdateMap(mMap);
 }
 return 0;
}

五、总结

1.对于推箱子来说找到规律很重要,还要一点要注意的就是形参为数组形式出现,实参传入数组进去,数组会退化为指针的形式;
2.在更新地图时调用了move函数,要分清楚着重于人物要移动时的下一个位置和下下个位置是什么来分开讨论,所以这也就是为什么要用两个int型变量来保存偏移后的位置;
3.函数声明取名字的重要性,不然等代码一长,很难区分函数的功能,还要区仔细看代码,会浪费很多时间,还要就是多敲注释的重要性;

希望这些可以帮助到你哦。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

用C++实现推箱子小游戏

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

如何用C++实现推箱子小游戏

本篇内容主要讲解“如何用C++实现推箱子小游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何用C++实现推箱子小游戏”吧!前言推箱子小游戏相信是很多人的同年记忆了,今天用c++语言来尝试下,
2023-06-20

C++怎么实现推箱子小游戏

这篇文章主要介绍“C++怎么实现推箱子小游戏”,在日常操作中,相信很多人在C++怎么实现推箱子小游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++怎么实现推箱子小游戏”的疑惑有所帮助!接下来,请跟着小编
2023-06-20

C语言如何实现推箱子小游戏

本篇内容介绍了“C语言如何实现推箱子小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文实例为大家分享了C语言实现推箱子代码的具体代码,
2023-06-20

使用C/C++怎么实现一个推箱子小游戏

这篇文章给大家介绍使用C/C++怎么实现一个推箱子小游戏,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如何实现1.首先思考要保存箱子,小猪等信息,添加多个map可以用到三维数组。2.定义小猪,箱子,墙,空地等信息在三维
2023-06-15

android自定义view实现推箱子小游戏

本文实例为大家分享了android推箱子游戏的具体实现代码,供大家参考,具体内容如下自定义view:package com.jisai.materialdesigndemo.tuixiangzhi; import android.cont
2022-06-06

如何使用C语言实现推箱子游戏

这篇文章主要为大家展示了“如何使用C语言实现推箱子游戏”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何使用C语言实现推箱子游戏”这篇文章吧。1.前言推箱子是c语言的一个经典的项目2.游戏效果展
2023-06-29

Python怎么实现推箱子游戏

小编给大家分享一下Python怎么实现推箱子游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.游戏规则推箱子游戏是一款可玩性极高的策略解谜手游,游戏中玩家将扮
2023-06-22

使用C/C++怎么制作一个推箱子小游戏

使用C/C++怎么制作一个推箱子小游戏?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。运行示例:以下为完整代码:#include #in
2023-06-15

HTML+JS实现经典推箱子游戏

今天,这篇文章将利用HTML,CSS,JS的知识编写一个童年经典游戏 - 推箱子,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录