用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.函数声明取名字的重要性,不然等代码一长,很难区分函数的功能,还要区仔细看代码,会浪费很多时间,还要就是多敲注释的重要性;

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

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

(0)

相关推荐

  • C++实现推箱子游戏

    一.项目简介 用两天闲余时间回顾了推箱子这款经典的小游戏,目前设置了5关,只能实现基本的人物移动.判断胜利条件,其他功能还未实现(例:撤回到上一步,自由选择关卡等),也顺便复习了C++的相关知识. 二. 代码区 Class Map(地图类) Map.h: #pragma once #define N 10 #define M 10 //地图类 class Map { public: Map(); ~Map(); void Init(); void ReadMapFile(int map[M][N

  • C++基于easyx图形库实现推箱子游戏

    本文实例为大家分享了C++实现推箱子游戏的具体代码,供大家参考,具体内容如下 头文件: #include<stdio.h> #include<stdlib.h> //#include<Windows.h> #include<conio.h> #include<graphics.h> #include<stdbool.h> //播放音乐需要的头文件 #include <mmsystem.h> #pragma comment(

  • 用C++实现推箱子

    本文实例为大家分享了C++实现推箱子游戏的具体代码,供大家参考,具体内容如下 // 1.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include <iostream> #include <stdio.h>//■ #include <cstdlib> #include <conio.h> using std::cout; const int row = 12; const int col = 13;

  • C++实现推箱子小游戏源码

    本文实例为大家分享了C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 功能尚为完善. // ConsoleApplication2.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include<windows.h> #define KEY_DOWN(vk_code) GetAsyncKeyState(vk_code) & 0x8000 ? 1 : 0 using

  • C++实现简单推箱子小游戏

    本文实例为大家分享了C++实现简单推箱子的具体代码,供大家参考,具体内容如下 游戏演示 代码展示 #include<stdio.h> #include<stdlib.h> #include<getch.h> int main(int argc,const char*argv[]) { int cut=0; int a[8][8]={ {0,0,3,3,3,3,0,0}, {0,0,3,5,5,3,0,0}, {0,0,3,0,5,3,0,0}, {0,3,0,0,4,5

  • DEVC++实现推箱子小游戏

    推箱子小游戏(基于DEVC++),供大家参考,具体内容如下 #include<iostream> #include<stdio.h> #include<conio.h> #include <windows.h> using namespace std; void Game_Menu(HANDLE hout); void Game_description(HANDLE hout); void gotoxy(HANDLE hout, int x, int y);

  • C/C++编写推箱子小游戏

    本文实例为大家分享了C/C++编写推箱子小游戏的具体代码,供大家参考,具体内容如下 我们用' #'来代表墙,'O'来代表箱子,' * '代表终点,'@'代表箱子已经到达终点,'S来表示人'. 注意:W,A,S,D为方向键,而且要在英文格式下 运行示例: 以下为完整代码: /* 推箱子(示例二) */ #include <stdio.h> #include <stdlib.h> #include <windows.h> #include <conio.h> i

  • C/C++实现推箱子小游戏

    本文实例为大家分享了C/C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 效果演示 实现功能 如上图所示.按键控制小猪的运动,推箱子到达目的地. 如何实现 1.首先思考要保存箱子,小猪等信息,添加多个map可以用到三维数组. 2.定义小猪,箱子,墙,空地等信息在三维数组里的数值. 空地             0       墙               1  目的地           2     箱子             3  猪               4  2+4=6

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

    本文实例为大家分享了C++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 游戏效果 简单易懂的推箱子闯关小游戏. 游戏代码 #include <bits/stdc++.h> #include <windows.h> #include <conio.h> using namespace std; #define VERSION "2.2" #define M 55 int n, m, wall[M][M], hole[M][M], box[M][

  • js推箱子小游戏步骤代码解析

    推箱子小游戏大家肯定都玩过,之所以写这篇文章,是觉得这个小游戏足够简单好理解 demo: 步骤解析: 本文代码已经放在了github上面了,里面也进行了很详细的代码注释,可以copy下来,在本地运行一下看看. 1. 渲染地图 html结构: html结构十分简单,只要弄一堆div,来放置地图的class就可以了,我这里初始化了12*9个div,地图里最多九行高度. 这些div都是同样大小,地图渲染出来区别的只是颜色的不同. 地图函数: var box=$('.box div'); //地图使用的

  • java二维数组实现推箱子小游戏

    本文实例为大家分享了java实现推箱子小游戏的具体代码,供大家参考,具体内容如下 二维数组 二维数组:类似于二维表格(有很多层,每一层有多个房间的楼房) 数组声明: 数据类型[][]数据名 = new 数据类型[行数][列数]; 获取二维数组的长度:数组名.lengt 得到的是行数 数组名[行下标].length 得到的是列数 推箱子小游戏 import java.util.Random; import java.util.Scanner; /* * 推箱子的小游戏 */ public clas

  • C语言代码实现推箱子小游戏

    本文实例为大家分享了C语言实现推箱子小游戏的具体代码,供大家参考,具体内容如下 本次游戏是个推箱子第一关最简单的小游戏 有详细注释,下面是做出来的游戏界面 游戏操作说明和功能说明: 1.按wasd控制小人的上下左右移动. 2.按 r 重新开始游戏 3.游戏开始有操作介绍 4.游戏结束有胜利提示 游戏原理分析 1.游戏开始时的星星个数 = 箱子在星星上的个数时 , 游戏胜利. 2.按 r 键重新开始游戏, 我们需要定义一个量 map_1[8][8] 来保存游戏初始时的界面, 操作时我们将其赋值给

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

    前言 推箱子小游戏相信是很多人的同年记忆了,今天用c++语言来尝试下,用的是vs编译器. 代码还有很多可以优化的地方,为了更直观了解函数的形参和实参,所以地图没有用全局变量声明了,其实用全局变量声明会简洁很多. 头文件和main函数分享在最下面了. 提示:以下是本篇文章正文内容,下面案例可供参考 一.初始化游戏数据 void GameInit(int(*&pMap)[10][10], int index)//两张地图数据 { // static:返回静态全局区变量 static int loca

  • 利用c++写一个简单的推箱子小游戏

    效果图 相信各位都肯定完整这种推箱子的小游戏.游戏玩法很简单,那就是一个人把所有的箱子推动到对应的位置那就可以赢了. 那么我们接下来看看这个推箱子的游戏改怎么写 char map[10][10]= { {'#','#','#','#','#','#','#','#','#','#'}, {'#','#','#','#',' ',' ','!',' ',' ','#'}, {'#',' ',' ',' ',' ','o',' ',' ',' ','#'}, {'#',' ',' ',' ',' '

随机推荐