欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++實(shí)現(xiàn)推箱子小游戲

 更新時(shí)間:2021年01月15日 08:32:01   作者:蒟蒻一枚  
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C++實(shí)現(xiàn)推箱子小游戲的具體代碼,供大家參考,具體內(nèi)容如下

游戲效果

簡(jiǎn)單易懂的推箱子闖關(guān)小游戲。

游戲代碼

#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 ("按方向鍵進(jìn)行移動(dòng),按刪除鍵進(jìn)行撤銷");
 puts ("按空格鍵查詢步數(shù)。");
 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āng)前步數(shù)為%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("對(duì)不起,您無法推動(dòng)這個(gè)方塊!");
 } 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 ("第一行輸入兩個(gè)整數(shù)n和m,表示地圖的大小");
 puts ("接下來n行,每行m個(gè)元素。");
 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.第一關(guān)");
 puts ("2.第二關(guān)");
 puts ("3.第三關(guān)");
 puts ("4.第四關(guān)");
 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.闖關(guān)模式");
 puts ("2.輸入模式");
 puts ("Esc.退出游戲");
 while (o = getch ()) {
 if (o=='1') {
 pass ();
 break;
 } else if (o == '2') {
 in ();
 break;
 } else if (o == 27) {
 exit (0); 
 }
 }
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語言示例講解動(dòng)態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)

    C語言示例講解動(dòng)態(tài)/文件/靜態(tài)功能版本的通訊錄實(shí)現(xiàn)

    通訊錄是一個(gè)可以記錄親人、好友信息的工具,這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)通訊錄管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 基于字符串移位包含的問題詳解

    基于字符串移位包含的問題詳解

    本篇文章是對(duì)字符串移位包含的問題的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++實(shí)現(xiàn)猴子吃桃的示例代碼

    C++實(shí)現(xiàn)猴子吃桃的示例代碼

    這篇文章主要介紹了C++實(shí)現(xiàn)猴子吃桃的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • C語言goto的應(yīng)用舉例以及詳解

    C語言goto的應(yīng)用舉例以及詳解

    goto的用法就是改變程序執(zhí)行的順序,從某個(gè)地方跳轉(zhuǎn)到你標(biāo)志的地方,下面這篇文章主要給大家介紹了關(guān)于C語言goto的應(yīng)用舉例及詳解的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C++中拷貝構(gòu)造函數(shù)的總結(jié)詳解

    C++中拷貝構(gòu)造函數(shù)的總結(jié)詳解

    深拷貝和淺拷貝可以簡(jiǎn)單理解為:如果一個(gè)類擁有資源,當(dāng)這個(gè)類的對(duì)象發(fā)生復(fù)制過程的時(shí)候,資源重新分配,這個(gè)過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝
    2013-09-09
  • 帶你用C語言實(shí)現(xiàn)strtok和字符串分割函數(shù)

    帶你用C語言實(shí)現(xiàn)strtok和字符串分割函數(shù)

    下面小編就為大家?guī)硪黄猚語言中字符串分割函數(shù)及實(shí)現(xiàn)方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2021-09-09
  • C語言實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)程序

    C語言實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)程序

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)隨機(jī)抽獎(jiǎng)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C語言借助EasyX實(shí)現(xiàn)的生命游戲源碼

    C語言借助EasyX實(shí)現(xiàn)的生命游戲源碼

    這篇文章主要介紹了C語言借助EasyX實(shí)現(xiàn)的生命游戲的方法,需要的朋友可以參考下
    2014-07-07
  • 解析C++編程中如何使用設(shè)計(jì)模式中的狀態(tài)模式結(jié)構(gòu)

    解析C++編程中如何使用設(shè)計(jì)模式中的狀態(tài)模式結(jié)構(gòu)

    這篇文章主要介紹了如何在C++編程中適用設(shè)計(jì)模式中的狀態(tài)模式結(jié)構(gòu),狀態(tài)模式強(qiáng)調(diào)將特定狀態(tài)相關(guān)的邏輯分散到一些類的狀態(tài)類中,需要的朋友可以參考下
    2016-03-03
  • C++ STL 四種智能指針的用法詳解

    C++ STL 四種智能指針的用法詳解

    C++ 標(biāo)準(zhǔn)模板庫 STL(Standard Template Library) 一共給我們提供了四種智能指針:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,今天給大家詳細(xì)介紹這幾種指針的具體用法,需要的朋友參考下吧
    2021-06-06

最新評(píng)論