C++基於easyx圖形庫實現推箱子游戲
阿新 • • 發佈:2020-07-01
本文例項為大家分享了C++實現推箱子游戲的具體程式碼,供大家參考,具體內容如下
標頭檔案:
#include<stdio.h> #include<stdlib.h> //#include<Windows.h> #include<conio.h> #include<graphics.h> #include<stdbool.h> //播放音樂需要的標頭檔案 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") //格子邊長 #define SPACE 60 //6.3.1 定義變數 IMAGE png[12];//5張圖,定義5個變數,定義一個數組 #define MapMany 6 //列舉方向 enum CH { right = 1,left = 2,up = 3,down = 4 }ch; //定義一個全域性三維陣列 //0表示空地“ ” 1表示牆“■” 2代表目的地“⊙” 3代表人站在空地上“♀” 4代表箱子“□” //5箱子與目的地重合“◆” 6,人站在目的地上“♀” //下面定義地圖 int map[MapMany][10][10] = { //圖一 { { 1,1,1 },{ 1,2,4,3,},//圖二 { { 1,//圖三 { { 1,//圖四 { { 1,//圖五 { { 1,//圖六 { { 0,0 },{ 0,} }; //定義當前關卡 int WhatMap = 0;//初始化位第0張地圖 void DrawMap(int n); void initscreen(); void ManUp(); int KbHit(); void ManUp(); void ManRight(); void ManLeft(); void ManDown(); int GameOver(); void drawGame();
CPP檔案:
#include"SokoBan.h" int main() { initscreen(); //播放音樂 mciSendString(TEXT("open sun.mp3 alias mysong"),NULL,NULL); mciSendString(TEXT("play mySong"),NULL); while (1) { switch (KbHit()) { case 4:ManUp(); break; case 2:ManLeft(); break; case 1:ManRight(); break; case 3:ManDown(); break; //case 0:continue; } drawGame(); if (GameOver()) { WhatMap++; Sleep(1000); } if (WhatMap == 3)break; } loadimage(&png[7],_T("6.jpg"),10*SPACE,true); putimage(0,&png[7]); Sleep(10000); return 0; //printf("作者:小豆芽\n時間:2018/12/18\n版權:[email protected]"); //system("pause"); } //設定視窗大小 void initscreen() { initgraph(10 * SPACE,10 * SPACE ); //6.3.2 載入圖片 //0表示空地“ ” 1表示牆“■” 2代表目的地“⊙” 3代表人站在空地上“♀” 4代表箱子“□” //5箱子與目的地重合“◆” 6,人站在目的地上“♀” loadimage(&png[0],_T("0.jpg"),SPACE,true); loadimage(&png[1],_T("1.jpg"),true); loadimage(&png[2],_T("2.jpg"),true); loadimage(&png[3],_T("3.jpg"),true); loadimage(&png[4],_T("4.jpg"),true); loadimage(&png[5],_T("5.jpg"),true); loadimage(&png[6],true); //以下是windows視窗 //system("mode con cols=20 lines=10"); //cols 代表列 //lines 代表行 // //設定標題 //SetConsoleTitleA("推箱子"); //設定標題 } //貼圖 void drawGame() { for (int i = 0; i < 10; i++) {//顯示一行 for (int j = 0; j < 10; j++) {//顯示一個格子 putimage(j*SPACE,i*SPACE,&png[map[WhatMap][i][j]]); } } } //畫出地圖 //0表示空地“ ” 1表示牆“■” 2代表目的地“⊙” 3代表人“♀” 4代表箱子“□” //5箱子與目的地重合“◆” 6,人站在目的地 void DrawMap(int n) { system("cls"); for (int j = 0; j < 10; j++) { int i; for (i = 0; i < 10; i++) { if (map[WhatMap][i][j] == 0)printf(" "); if (map[WhatMap][i][j] == 1)printf("■"); if (map[WhatMap][i][j] == 2)printf("⊙"); if (map[WhatMap][i][j] == 3)printf("♀"); if (map[WhatMap][i][j] == 4)printf("□"); if (map[WhatMap][i][j] == 5)printf("◆"); if (map[WhatMap][i][j] == 6)printf("♀"); } if(i<9)printf("\n"); } } //判斷按鍵操作 int KbHit() { if (GetAsyncKeyState(VK_UP)&1)return up; else if (GetAsyncKeyState(VK_DOWN)&1)return down; else if (GetAsyncKeyState(VK_RIGHT)&1)return right; else if (GetAsyncKeyState(VK_LEFT)&1)return left; else return 0; } //********************************************人向上移動 void ManUp() { //先找到人的位置 int i,j; for (i = 0; i < 10; i++) { int flag = 0; for (j = 0; j < 10; j++) if (map[WhatMap][i][j] == 3 || map[WhatMap][i][j] == 6) { flag = 1; break; } if (flag)break; } //人的位置是map[WhatMap][i][j]; //改變人的方向 //人的位置是空地 if (map[WhatMap][i][j] == 3) { //***********人的上面是空地 if (map[WhatMap][i + 1][j] == 0) { map[WhatMap][i][j] = 0; map[WhatMap][i + 1][j] = 3; } //************人的上面是目的地 else if (map[WhatMap][i + 1][j] == 2) { map[WhatMap][i][j] = 0; map[WhatMap][i + 1][j] = 6; } //*************人的上面是箱子 else if (map[WhatMap][i + 1][j] == 4) { //1,***********箱子上面是目的地 if (map[WhatMap][i + 2][j] == 2) { map[WhatMap][i][j] = 0; map[WhatMap][i + 1][j] = 3; map[WhatMap][i + 2][j] = 5; } //2,************箱子上面是空地 else if (map[WhatMap][i + 2][j] == 0) { map[WhatMap][i][j] = 0; map[WhatMap][i + 1][j] = 3; map[WhatMap][i + 2][j] = 4; } //3,*************箱子上面是。。。。。 } } //人的位置是目的地 else if (map[WhatMap][i][j] == 6) { //***********人的上面是空地 if (map[WhatMap][i + 1][j] == 0) { map[WhatMap][i][j] = 2; map[WhatMap][i + 1][j] = 3; } //************人的上面是目的地 else if (map[WhatMap][i + 1][j] == 2) { map[WhatMap][i][j] = 2; map[WhatMap][i + 1][j] = 6; } //*************人的上面是箱子 else if (map[WhatMap][i + 1][j] == 4) { //1,***********箱子上面是目的地 if (map[WhatMap][i + 2][j] == 2) { map[WhatMap][i][j] = 2; map[WhatMap][i + 1][j] = 3; map[WhatMap][i + 2][j] = 5; } //2,************箱子上面是空地 else if (map[WhatMap][i + 2][j] == 0) { map[WhatMap][i][j] = 2; map[WhatMap][i + 1][j] = 3; map[WhatMap][i + 2][j] = 4; } //3,*************箱子上面是。。。。。 } } } //********************************************人向右移動 void ManRight() { //先找到人的位置 int i,j; for (i = 0; i < 10; i++) { int flag = 0; for (j = 0; j < 10; j++) if (map[WhatMap][i][j] == 3 || map[WhatMap][i][j] == 6) { flag = 1; break; } if (flag)break; } //人的位置是map[WhatMap][i][j]; //改變人的方向 //人的位置是空地 if (map[WhatMap][i][j] == 3) { //***********人的右面是空地 if (map[WhatMap][i][j+1] == 0) { map[WhatMap][i][j] = 0; map[WhatMap][i][j+1] = 3; } //************人的右面是目的地 else if (map[WhatMap][i][j+1] == 2) { map[WhatMap][i][j] = 0; map[WhatMap][i][j+1] = 6; } //*************人的右面是箱子 else if (map[WhatMap][i][j+1] == 4) { //1,***********箱子右面是目的地 if (map[WhatMap][i][j+2] == 2) { map[WhatMap][i][j] = 0; map[WhatMap][i][j+1] = 3; map[WhatMap][i][j+2] = 5; } //2,************箱子右面是空地 else if (map[WhatMap][i][j+2] == 0) { map[WhatMap][i][j] = 0; map[WhatMap][i][j+1] = 3; map[WhatMap][i][j+2] = 4; } //3,*************箱子右面是。。。。。 } } //人的位置是目的地 else if (map[WhatMap][i][j] == 6) { //***********人的右面是空地 if (map[WhatMap][i][j+1] == 0) { map[WhatMap][i][j] = 2; map[WhatMap][i][j+1] = 3; } //************人的右面是目的地 else if (map[WhatMap][i][j+1] == 2) { map[WhatMap][i][j] = 2; map[WhatMap][i][j+1] = 6; } //*************人的右面是箱子 else if (map[WhatMap][i][j+1] == 4) { //1,***********箱子右面是目的地 if (map[WhatMap][i][j+2] == 2) { map[WhatMap][i][j] = 2; map[WhatMap][i][j+1] = 3; map[WhatMap][i][j+2] = 5; } //2,************箱子右面是空地 else if (map[WhatMap][i][j+2] == 0) { map[WhatMap][i][j] = 2; map[WhatMap][i][j+1] = 3; map[WhatMap][i][j+2] = 4; } //3,*************箱子右面是。。。。。 } } } //********************************************人向左移動 void ManLeft() { //先找到人的位置 int i,j; for (i = 0; i < 10; i++) { int flag = 0; for (j = 0; j < 10; j++) if (map[WhatMap][i][j] == 3 || map[WhatMap][i][j] == 6) { flag = 1; break; } if (flag)break; } //人的位置是map[WhatMap][i][j]; //改變人的方向 //人的位置是空地 if (map[WhatMap][i][j] == 3) { //***********人的左面是空地 if (map[WhatMap][i][j-1] == 0) { map[WhatMap][i][j] = 0; map[WhatMap][i][j-1] = 3; } //************人的左面是目的地 else if (map[WhatMap][i][j-1] == 2) { map[WhatMap][i][j] = 0; map[WhatMap][i][j-1] = 6; } //*************人的左面是箱子 else if (map[WhatMap][i][j-1] == 4) { //1,***********箱子左面是目的地 if (map[WhatMap][i][j-2] == 2) { map[WhatMap][i][j] = 0; map[WhatMap][i][j-1] = 3; map[WhatMap][i][j-2] = 5; } //2,************箱子左面是空地 else if (map[WhatMap][i][j-2] == 0) { map[WhatMap][i][j] = 0; map[WhatMap][i][j-1] = 3; map[WhatMap][i][j-2] = 4; } //3,*************箱子左面是。。。。。 } } //人的位置是目的地 else if (map[WhatMap][i][j] == 6) { //***********人的上面是空地 if (map[WhatMap][i][j-1] == 0) { map[WhatMap][i][j] = 2; map[WhatMap][i][j-1] = 3; } //************人的上面是目的地 else if (map[WhatMap][i][j-1] == 2) { map[WhatMap][i][j] = 2; map[WhatMap][i][j-1] = 6; } //*************人的上面是箱子 else if (map[WhatMap][i][j-1] == 4) { //1,***********箱子上面是目的地 if (map[WhatMap][i][j-2] == 2) { map[WhatMap][i][j] = 2; map[WhatMap][i][j-1] = 3; map[WhatMap][i][j-2] = 5; } //2,************箱子上面是空地 else if (map[WhatMap][i][j-2] == 0) { map[WhatMap][i][j] = 2; map[WhatMap][i][j-1] = 3; map[WhatMap][i][j-2] = 4; } //3,*************箱子上面是。。。。。 } } } //********************************************人向下移動 void ManDown() { //先找到人的位置 int i,j; for (i = 0; i < 10; i++) { int flag = 0; for (j = 0; j < 10; j++) if (map[WhatMap][i][j] == 3 || map[WhatMap][i][j] == 6) { flag = 1; break; } if (flag)break; } //人的位置是map[WhatMap][i][j]; //改變人的方向 //人的位置是空地 if (map[WhatMap][i][j] == 3) { //***********人的下面是空地 if (map[WhatMap][i - 1][j] == 0) { map[WhatMap][i][j] = 0; map[WhatMap][i - 1][j] = 3; } //************人的上面是目的地 else if (map[WhatMap][i - 1][j] == 2) { map[WhatMap][i][j] = 0; map[WhatMap][i - 1][j] = 6; } //*************人的上面是箱子 else if (map[WhatMap][i - 1][j] == 4) { //1,***********箱子上面是目的地 if (map[WhatMap][i - 2][j] == 2) { map[WhatMap][i][j] = 0; map[WhatMap][i - 1][j] = 3; map[WhatMap][i - 2][j] = 5; } //2,************箱子上面是空地 else if (map[WhatMap][i - 2][j] == 0) { map[WhatMap][i][j] = 0; map[WhatMap][i - 1][j] = 3; map[WhatMap][i - 2][j] = 4; } //3,*************箱子上面是。。。。。 } } //人的位置是目的地 else if (map[WhatMap][i][j] == 6) { //***********人的上面是空地 if (map[WhatMap][i - 1][j] == 0) { map[WhatMap][i][j] = 2; map[WhatMap][i - 1][j] = 3; } //************人的上面是目的地 else if (map[WhatMap][i - 1][j] == 2) { map[WhatMap][i][j] = 2; map[WhatMap][i - 1][j] = 6; } //*************人的上面是箱子 else if (map[WhatMap][i - 1][j] == 4) { //1,***********箱子上面是目的地 if (map[WhatMap][i - 2][j] == 2) { map[WhatMap][i][j] = 2; map[WhatMap][i - 1][j] = 3; map[WhatMap][i - 2][j] = 5; } //2,************箱子上面是空地 else if (map[WhatMap][i - 2][j] == 0) { map[WhatMap][i][j] = 2; map[WhatMap][i - 1][j] = 3; map[WhatMap][i - 2][j] = 4; } //3,*************箱子上面是。。。。。 } } } //判斷遊戲是否結束 int GameOver() { //統計目的地的個數 int flag = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (map[WhatMap][i][j] == 2)flag++; } } //箱子到達目的地的個數 int count = 0; for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (map[WhatMap][i][j] == 4)count++; } } if (count == 0&&flag == 0 )return 1; else return 0; }
執行效果:
遊戲資源:
1.
2.
3.
4.
5.
6.
結束展示: