1. 程式人生 > >用C++寫的推箱子小遊戲2.2(支援步數顯示,回撤,穿牆,闖關,輸入等功能)

用C++寫的推箱子小遊戲2.2(支援步數顯示,回撤,穿牆,闖關,輸入等功能)

歡迎來到jiedai的推箱子。

jiedai用C++寫的推箱子游戲支援步數顯示,回撤,穿牆,闖關,輸入等操作。

1.1的更新增加了步數的輸出,對玩家移動的箭頭進行了改進。

1.2的更新推出了小編提供的地圖,希望大家遊戲愉快。

1.3的更新修正了除錯過程中的bug。

經過玩家的強烈要求,小編在1.3的基礎上更新了2.0,創新推出了推箱子穿牆技能,開啟了闖關模式。

2.1的更新,新增了步數查詢功能,以及遊戲返回和退出鍵。

2.2的更新縮短了程式碼長度,改進了闖關模式繁瑣的地圖操作。

下面是在控制檯上執行的程式碼:

#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.&.","
[email protected]
#..."}, {"########...####","########..*####","########*....##","######.*..*..##" ,"@@..##.###.#...","@@.X......*..*.","@@..#.####.####","#####......####"}, {"####..#...##","##.*..*.#.##","...#.**#....","X*.....#*##.","#.*###**....","##..##.#*..." ,"###@@@.#.*#.","###@@@@@#.*.","####@@@@@...","#######.#*.#","#######....#","#######...##"}, {"
[email protected]
*.##","[email protected]*@*..","&*@*@X.","[email protected]*@*.#","[email protected]*..#"} };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){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);} void clean(){system("cls");color(154);printf("歡迎來到jiedai的推箱子%s\n\n",VERSION);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 0; if(box[x][y])if(check(X,Y,0)||box[X][Y])return 0; return 1; } 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 0; return 1; } 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); if(dct==72)printf("↑"); else if(dct==77)printf("→"); else if(dct==80)printf("↓"); else if(dct==75)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 tmp;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; tmp.box.push_back(po); }tmp.man.x=player.x;tmp.man.y=player.y; tmp.dct=dct;rec[step]=tmp; } 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==35)cross^=1; else if(o==48)break; else if(o==27)exit(0); else if(o==32)query^=1; else if(o!=-32)tp=2; pt();color(154); if(query)printf("當前步數為%d\n",step); if(win()||winstep!=-1){ if(winstep==-1)winstep=step; printf("恭喜你,你贏了!您用了%d步。\n",winstep); }else if(tp==1){color(207);puts("對不起,你無法推動這個方塊!");} else if(tp==2){color(207);puts("請使用↑↓←→來移動!");} 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(){ sprintf(title,"推箱子%s by jiedai",VERSION);SetConsoleTitle(title); 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); } } int main(){Init();while(1)remain();}
大家遊戲愉快!

相關推薦

C++箱子遊戲2.2支援步數顯示穿輸入功能

歡迎來到jiedai的推箱子。 jiedai用C++寫的推箱子游戲支援步數顯示,回撤,穿牆,闖關,輸入等操作。 1.1的更新增加了步數的輸出,對玩家移動的箭頭進行了改進。 1.2的更新推出了小編提供的地圖,希望大家遊戲愉快。 1.3的更新修正了除錯過程中的bug。 經過玩家

箱子遊戲 C語言 共了四十遊戲有多種模式適合新手學習交流 有全部完整程式碼可直接編譯執行

}void middleMap(int Map[20][20],int *n,int *m,char *ch) {//中等關卡    static int cs=0;    int guan;    //fscanf(fp1, "%d", &guanshu2);    //fclose(fp1);//

c語言控制檯箱子遊戲

這是最早編寫的一個小程式,程式設計思路源於網路。 用CodeBlocks16.01編繹通過。 關卡設計參考易語言例程,十八個關卡的陣列初始值,看圖手工填寫了兩個多小時。 或許是很笨辦法,高手請多指教。 程式設計思路: 一     二維陣列指定物件的位置和種類。 二   雙快

箱子遊戲《格魯的實驗室》13 - bfs最短路徑

rst ace clu end 路徑 我們 prior top other 下載了一款推箱子小遊戲,第13關的時候怎麽也破不了最佳紀錄(最少步數是9而我們最好的方案是10步),因為數據比較小(6*8的方陣),所以寫了個BFS來找最短路。 遊戲的目標是把小黃人推到黃色球,小綠

c++俄羅斯方塊遊戲

第二篇部落格 把我之前用c++寫的一個俄羅斯方塊也傳上來算了,這個程式是我學完c++後寫的,雖然有點長,看起來比較嚇人,但是程式碼絕對是你能夠找到的理解起來最簡單的俄羅斯方塊的程式碼,對於一些基礎不好的同學還是非常友好的。(歡迎批評指正) #include<iostream>

Java貪吃蛇遊戲

1 package snake; 2 3 import java.awt.Color; 4 import java.awt.Font; 5 import java.awt.Graphics; 6 import java.awt.event.ActionEvent; 7 impor

小夥利用Python自制一個箱子遊戲

導語 月初更波python製作小遊戲系列吧用python寫了個推箱子小遊戲,在這裡分享給大家,讓我們愉快地開始吧 進群進群:943752371可以獲取Python各類入門學習資料! 這是我的微信公眾號【Python程式設計之家】各位大佬用空可以關注下,每天更新Python學習方法,感謝!

Java實現箱子遊戲

package Test1; //用於呼叫Test2包 import Test2.*; import java.awt.*; import javax.swing.*; public class APP extends JFrame{ public static v

自己C++的一個箱子~~

    自己寫了一個推箱子,不過目前只有兩關,打圖太難了orz。(絕不是因為我太懶) #include<iostream> #include<cstdio> #include<cstdlib> using namespace std;

C#個NBiot串列埠工具

背景 做嵌入式這行剛剛開始入門基本就是流水燈跟串列埠這些了,一直用別人的工具(在此感謝那些前輩寫的很好用的工具),雖然很好,但是缺少一些定製化的開發。比如最近我在做NBiot的專案,在除錯NB模組的時候就需要手動複製貼上MsgID號碼,十分繁瑣,有時候還會因為超時,不得不從頭來走一遍

C語言的2048遊戲

基於"基於C_語言的2048演算法設計_顏冠鵬.pdf" 這一篇文獻提供的思路 在中國知網上能找到 就不貼具體內容了 [摘 要] 針對2048的遊戲規則,分析了該遊戲的演算法特點,對其相關的功能需求和演算法設計進行了簡單介紹,提出了一種 新的設計方案。解決了該設計在方陣資料結構、運動演算法和遊戲結束判斷方面的

c++一個簡單的打字遊戲

#include <graphics.h>  //圖形介面的標頭檔案 #include <conio.h> #include <time.h>     //隨機數 #include <stdio.h> #include <

QT庫的一個遊戲——FlappyBird憤怒的小鳥

最近瀏覽網站的時候,忘記在哪裡看的這個FlappyBird了,這個小遊戲在前兩年小火了一段時間。今天用QT簡單的實現了一把,然後在網上找了一些相關的切圖,便進行了製作。難度不是很大,只是通過寫這篇部落格,能有點啟發以及大家共同學習。 如果你對C語言C++感興趣,那麼歡迎加入學

C# 一個 Redis 資料同步工具

用 C# 寫一個 Redis 資料同步小工具 Intro 為了實現 redis 的資料遷移而寫的一個小工具,將一個例項中的 redis 資料同步到另外一個例項中。(原本打算找一個已有的工具去做,找了一個 nodejs 的小工具,結果折騰了好久都沒裝上。。。於是就自己寫了這個小工具) 之所以自己寫一個工具而不是

【python學習】使用python一個2048遊戲

ast stc 遊戲 多少 wan nbsp 小遊戲 效果 參考 個人博客:jerwang.cn 沒有參考其他代碼,效果圖: 話不多少,源代碼: https://github.com/jerustc/Python/blob/master/2048.py【python學

C++的帶模板雙向鏈表

main 報錯 src for out rst 所有 else ddl 1 #ifndef _BLIST_H_ 2 #define _BLIST_H_ 3 4 #include <iostream> 5 6 using n

php調C#的dll包

ext src logs cnblogs class tex .com 技術 png php調用C#寫的dll包

C++程序相比於C到底有哪些不同

mfc tun com docs jsm http w3m mib dbr 1啃腦7暮0殺a斡還http://weibo.com/u/6373334892 腋6趴胖s斷堵c苑寥6gwhttp://shufang.docin.com/jwo55353 7懈5qyof6醇b

C語 三子棋遊戲

splay ret int def 選擇 種子 define tdi rand() 1 #include <stdio.h> 2 #include <Windows.h> 3 #include<time.h> 4 #de

sql server中調c#的dll裏的方法

lib null all varchar 什麽什麽 server 調用dll func 雲服務 最近有一項目: 一超市管理系統單機版,運行在WIN2003+SQL2005上,每天超市關門都都會關電腦,現客戶要新加功能,每天關門下班後回家可以上網查看超市管理系統的數據