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][M];
int step, dct, query, cross, rx[233], ry[233];
char str[M][M], title[M], o;
char atlas[M][M][M] = {
 {"...#@.","@..*..","#*##..","..##*#","..X.&.",".@#..."},
 {"########...####","########..*####","########*....##","######.*..*..##"
 ,"@@..##.###.#...","@@.X......*..*.","@@..#.####.####","#####......####"},
 {"####..#...##","##.*..*.#.##","...#.**#....","X*.....#*##.","#.*###**....","##..##.#*..."
 ,"###@@@.#.*#.","###@@@@@#.*.","####@@@@@...","#######.#*.#","#######....#","#######...##"},
 {"..@*.##",".@*@*..","&*@*@X.",".@*@*.#","..@*..#"}
};
int A[M] = {6, 8, 12, 5}, B[M] = {6, 15, 12, 7};
struct pos {
 int x, y;
} player;
struct node {
 pos man;
 int dct;
 vector<pos> box;
 node() {
 box.clear ();
 }
} rec[M * M * M];
void color (int x);
void clean ();
bool check (int x, int y, int cross);
bool forward (int rx, int ry);
bool win ();
void pt ();
void update ();
void playing ();
void in ();
void pass ();
void Init ();
void remain ();
int main() {
 MessageBox (NULL, "欢迎来到推箱子游戏!", "温馨提示", MB_OK);
 Init ();
 while (true) {
 remain ();
 }
 return 0;
}
void color (int x) {
 SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE), x);
}
void clean () {
 system("cls");
 color(7);
}
bool check (int x, int y, int cross) {
 if (!cross) {
  return x < 1 || x > n || y < 1 || y > m || wall[x][y];
 }
 return x < 0 || x > n + 1 || y < 0 || y > m + 1;
}
bool forward (int rx, int ry) {
 int x = player.x + rx, y = player.y + ry, X = x + rx, Y = y + ry;
 if (check (x,y,cross)) {
 return false;
 }
 if(box[x][y]) {
 if (check (X, Y, 0) || box[X][Y]) {
 return false;
 }
 }
 return true;
}
bool win () {
 for (int i = 0; i < rec[step].box.size (); i++) {
 if (!hole[rec[step].box[i].x][rec[step].box[i].y]) {
 return false;
 }
 }
 return true;
}
void pt () {
 memset (box, 0, sizeof (box));
 for (int i = 0; i < rec[step].box.size (); i++) {
  box[rec[step].box[i].x][rec[step].box[i].y] = 1;
 }
 player.x = rec[step].man.x;
 player.y = rec[step].man.y;
 dct = rec[step].dct;
 clean ();
 color (154);
 puts ("按方向键进行移动,按删除键进行撤销");
 puts ("按空格键查询步数。");
 puts ("按0返回,按Esc键退出游戏");
 color (7);
 for (int i = 0; i <= n + 1; i++) {
 printf(" ");
  for (int j = 0; j <= m + 1; j++) {
 if (i == player.x && j == player.y) {
    color (15);
 if (check (i, j, 0)) {
  color (63);
 }
 printf ("♀");
    color (7);
   } else if (i == 0 || i == n + 1 || j == 0 || j == m + 1 || wall[i][j]) {
 color (3);
 printf ("■");
 } else if(box[i][j]) {
 color (14);
    if (hole[i][j]) {
  color (12);
 }
    printf ("▓");
   } else if (hole[i][j]) {
 color (3);
 printf ("※");
 } else {
 printf (" ");
 }
  }
 puts ("");
 }
 color (7);
}
void update () {
 node temp;
 int i, j;
 for (i = 1; i <= n; i++) {
 for (j = 1; j <= m; j++) {
 if (box[i][j]) {
 pos po;
 po.x = i;
 po.y = j;
 temp.box.push_back (po);
 }
 }
 }
 temp.man.x = player.x;
 temp.man.y = player.y;
 temp.dct = dct;
 rec[step] = temp;
}
void playing () {
 dct = 72;
 step = 0;
 update ();
 pt ();
 int winstep = -1;
 while (o = getch ()) {
 int tp = 0;
 if (o == 72 || o == 77 || o == 80 || o == 75) {
 if (forward (rx[o],ry[o])) {
 int x = player.x + rx[o], y = player.y + ry[o];
 if (box[x][y]) {
  box[x][y] = 0;
  box[x + rx[o]][y + ry[o]] = 1;
 }
 player.x = x;
 player.y = y;
 step++;
 } else {
 tp = 1;
 }
 dct = o;
 update ();
 } else if (o == 8) {
 tp = 3;
 step = max (0, step - 1);
 if (step <= winstep) {
 winstep = -1;
 }
 } else if (o == 48) {
 break;
 }
 else if (o == 27) {
 exit (0);
 }
 else if (o == 32) {
 query ^= 1;
 }
 else {
 tp = 2;
 }
 pt ();
 color (154);
 if (query) {
 printf ("当前步数为%d!\n", step);
 }
 if(win () || winstep != -1) {
 if (winstep == -1) {
 winstep = step;
 }
 printf ("恭喜您,您赢了!共用了%d步。\n", winstep);
 MessageBox (NULL, "恭喜您,您赢了!", "温馨提示", MB_OK);
 } else if (tp == 1) {
 color (207);
 puts("对不起,您无法推动这个方块!");
 } else if (tp == 2) {
 color (207);
 } else if (tp == 3) {
 puts ("撤销成功!");
 }
 color (7);
 }
}
void in () {
 memset (wall, 0, sizeof (wall));
 memset (hole, 0, sizeof(hole));
 memset (box, 0, sizeof(box));
 clean ();
 puts ("第一行输入两个整数n和m,表示地图的大小");
 puts ("接下来n行,每行m个元素。");
 puts ("'.'表示空地");
 puts ("'#'表示墙");
 puts ("'*'表示箱子");
 puts ("'@'表示洞");
 puts ("'X'表示人" );
 puts ("'&'表示箱子已在洞上");
 scanf ("%d %d", &n, &m);
 int i,j;
 for (i = 1; i <= n; i++) {
 scanf ("%s", str[i] + 1);
 }
 for (i = 1; i <= n; i++) {
 for (j = 1; j <= m; j++) {
 o = str[i][j];
 if (o == 'X') {
 player.x = i;
 player.y = j;
 }
 if (o == '#') {
 wall[i][j] = 1;
 }
 if (o == '@' || o == '&') {
 hole[i][j] = 1;
 }
 if (o == '*' || o =='&') {
 box[i][j] = 1;
 }
 }
 }
 playing ();
}
void pass () {
 memset (wall, 0, sizeof (wall));
 memset (hole, 0, sizeof (hole));
 memset (box, 0, sizeof (box));
 clean ();
 puts ("1.第一关");
 puts ("2.第二关");
 puts ("3.第三关");
 puts ("4.第四关");
 puts ("\n0.返回");
 puts ("Esc.退出游戏");
 while (o = getch ()) {
 if (o >= '1' && o <= '4') {
 int id = o - 48 - 1;
 n = A[id];
 m = B[id];
 for (int i = 1; i <= n; i++) {
 for (int j = 1; j <= m; j++) {
  char o = atlas[id][i - 1][j - 1];
  if (o == 'X') {
  player.x = i;
  player.y = j;
  }
  if (o == '#') {
  wall[i][j] = 1;
  }
  if (o == '@' || o == '&') {
  hole[i][j] = 1;
  }
  if (o == '*' || o =='&') {
  box[i][j] = 1;
  }
  }
 }
 playing ();
 break;
 } else if (o == 48) {
 break;
 }
 }
}
void Init () {
 system ("mode con cols=40 lines=20");
 SetConsoleTitle ("推箱子");
 rx[72] = -1;
 rx[80] = 1;
 ry[77] = 1;
 ry[75] = -1;
}
void remain () {
 clean ();
 puts ("1.闯关模式");
 puts ("2.输入模式");
 puts ("Esc.退出游戏");
 while (o = getch ()) {
 if (o=='1') {
 pass ();
 break;
 } else if (o == '2') {
 in ();
 break;
 } else if (o == 27) {
 exit (0);
 }
 }
}

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

(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++实现简单推箱子小游戏

    本文实例为大家分享了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++基于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

  • 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++实现推箱子小游戏的具体代码,供大家参考,具体内容如下 游戏效果 简单易懂的推箱子闯关小游戏. 游戏代码 #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][

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

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

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

随机推荐