21xrx.com
2024-09-20 00:40:35 Friday
登录
文章检索 我的文章 写文章
C++推箱子游戏代码
2023-06-24 00:38:02 深夜i     --     --
C++ 推箱子 游戏 代码 算法

推箱子游戏是一款非常流行的益智游戏,它的代码实现也比较简单。以下是一份基于C++的推箱子游戏代码,可以供初学者参考。


#include<iostream>

#include<cstdio>

#include<cstdlib>

#include<cstring>

#include<windows.h>

using namespace std;

HANDLE hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);//定义窗口句柄

struct Loca{ // 初始化地图

  int w,h;//地图长和宽

  int wall[30][30] = {0};//0表示空地,1表示墙,2表示箱子,3表示目标,4表示玩家

}loca;

void gotoxy(int x,int y){ //光标移动

  COORD coord;

  coord.X = x;

  coord.Y = y;

  SetConsoleCursorPosition(hConsoleHandle,coord);

}

void draw(){//画出地图

  system("cls");//清屏

  for(int i = 0;i < loca.h;i++){

    for(int j = 0;j < loca.w;j++){

      if(loca.wall[i][j] == 0)//空地

        cout<<" ";

      

      else if(loca.wall[i][j] == 1)//墙

        cout<<"# ";

      

      else if(loca.wall[i][j] == 2)//箱子

        cout<<"& ";

      

      else if(loca.wall[i][j] == 3)//目标

        cout<<"@ ";

      

      else if(loca.wall[i][j] == 4){//玩家

        cout<<"* ";

      }

    }

    cout<<endl;

  }

}

int main(){

  int box_n,target_n;//箱子数,目标数

  int step = 0;//步数

  int px,py;//玩家在地图中的位置

  char ch;//玩家移动方向

  bool flag ;//清除目标用标记

  char s[100];//用户输入的地图数据

  cout<<"请输入地图(数字之间用空格分隔,换行表示地图的行数,0表示空地,1表示墙,2表示箱子,3表示目标,4表示玩家):"<<endl;

  gets(s);

  int len = strlen(s),k = 0;

  for(int i = 0;i < len;i++){

    if(s[i] == ' ') k++;//计算箱子数目标数

    if(s[i] == '0') loca.wall[i / (k + 1)][i % (k + 1)] = 0;//空地

    if(s[i] == '1') loca.wall[i / (k + 1)][i % (k + 1)] = 1;//墙

    if(s[i] == '2'){

      loca.wall[i / (k + 1)][i % (k + 1)] = 2;//箱子

      box_n++;//箱子数+1

    }

    if(s[i] == '3'){

      loca.wall[i / (k + 1)][i % (k + 1)] = 3;//目标

      target_n++;//目标数+1

    }

    if(s[i] == '4'){

      loca.wall[i / (k + 1)][i % (k + 1)] = 4;//玩家存档

      px = i % (k + 1);//玩家的行列坐标

      py = i / (k + 1);

    }

  }

  loca.w = k + 1;//地图宽度

  loca.h = len / (k + 1);//地图长度

  draw();//画出地图

  while(1){//游戏循环

    flag = 1;//假设清除目标了

    ch = getchar();//获取玩家移动方向

    if(ch == 'a'){//左移

      if(loca.wall[py][px - 1] == 0 || loca.wall[py][px - 1] == 3){//空地或目标,直接移动

        loca.wall[py][px - 1] = 4;

        loca.wall[py][px] = loca.wall[py][px] == 4 ? 3 : 0;//上一个格子是目标就是3,否则就是0

        px--;

        step++;//步数+1

      }

      else if(loca.wall[py][px - 1] == 2){//箱子

        if(loca.wall[py][px - 2] == 0 || loca.wall[py][px - 2] == 3){//箱子前面是空地或目标,推一步

          loca.wall[py][px - 2] = 2;//箱子移动

          loca.wall[py][px - 1] = loca.wall[py][px - 1] == 2 ? 4 : 3;//上一个格子是箱子就是2,否则就是3

          loca.wall[py][px] = loca.wall[py][px] == 4 ? 3 : 0;

          px--;

          step++;

        }

      }

    }

    else if(ch == 'd'){//右移

      if(loca.wall[py][px + 1] == 0 || loca.wall[py][px + 1] == 3){

        loca.wall[py][px + 1] = 4;

        loca.wall[py][px] = loca.wall[py][px] == 4 ? 3 : 0;

        px++;

        step++;

      }

      else if(loca.wall[py][px + 1] == 2){

        if(loca.wall[py][px + 2] == 0 || loca.wall[py][px + 2] == 3){

          loca.wall[py][px + 2] = 2;

          loca.wall[py][px + 1] = loca.wall[py][px + 1] == 2 ? 4 : 3;

          loca.wall[py][px] = loca.wall[py][px] == 4 ? 3 : 0;

          px++;

          step++;

        }

      }

    }

    else if(ch == 'w'){//上移

      if(loca.wall[py - 1][px] == 0 || loca.wall[py - 1][px] == 3){

        loca.wall[py - 1][px] = 4;

        loca.wall[py][px] = loca.wall[py][px] == 4 ? 3 : 0;

        py--;

        step++;

      }

      else if(loca.wall[py - 1][px] == 2){

        if(loca.wall[py - 2][px] == 0 || loca.wall[py - 2][px] == 3){

          loca.wall[py - 2][px] = 2;

          loca.wall[py - 1][px] = loca.wall[py - 1][px] == 2 ? 4 : 3;

          loca.wall[py][px] = loca.wall[py][px] == 4 ? 3 : 0;

          py--;

          step++;

        }

      }

    }

    else if(ch == 's'){//下移

      if(loca.wall[py + 1][px] == 0 || loca.wall[py + 1][px] == 3){

        loca.wall[py + 1][px] = 4;

        loca.wall[py][px] = loca.wall[py][px] == 4 ? 3 : 0;

        py++;

        step++;

      }

      else if(loca.wall[py + 1][px] == 2){

        if(loca.wall[py + 2][px] == 0 || loca.wall[py + 2][px] == 3){

          loca.wall[py + 2][px] = 2;

          loca.wall[py + 1][px] = loca.wall[py + 1][px] == 2 ? 4 : 3;

          loca.wall[py][px] = loca.wall[py][px] == 4 ? 3 : 0;

          py++;

          step++;

        }

      }

    }

    //目标清除,判断是否通关

    for(int i = 0;i < loca.h;i++){

      for(int j = 0;j < loca.w;j++){

        if(loca.wall[i][j] == 3)

          flag = 0;

          break;

        

      }

      if(flag == 0) break;

    }

    if(flag == 1){//游戏胜利

      gotoxy(loca.w , loca.h + 2);

      cout<<"已通关,您的步数为"<<step;

      break;//退出游戏

    }

    draw();//重新画地图

  }

  return 0;

}

该代码通过 `gets()` 函数从控制台中获取玩家输入的地图数据,并初始化地图。接着,每当玩家输入移动指令时,程序通过判断当前位置的物品类型(空地、墙、箱子、玩家等),来对其进行移动或推动操作。游戏玩家需要将所有箱子推到目标位置,即可赢得游戏。

上述代码是一个很小的玩具,完全可以进行二次优化,比如,加上图形化界面等,来使游戏更加美观。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复