C++學習(九)(C語言部分)之 項目 推箱子游戲

 遊戲製做 推箱子數組

 

步驟分析函數

一、模板字體

二、模板分析spa

      組成元素:指針

      空地 牆 人 目的地 箱子 背景code

三、如何操做blog

     經過WASD鍵盤操做人,推着箱子,到達目的地,遊戲結束,若是箱子卡在死角則遊戲失敗遊戲

四、如何繪製地圖圖片

      經過數組來存儲繪製ci

      數組中 0表示空地

                  1表示牆

                  2表示人

                  3表示箱子

                  4表示目的地

       移動時

人在目的地上:人+目的地=2+4=6
箱子在目的地上:箱子+目的地=3+4+7

 

 (⊙o⊙)…額  大概就這樣吧 (其實就是本身作的時候的一些筆記,之後用的時候再看吧)

 

 

 

 

 

 1 //事先先改多字節  2 #include<stdio.h>//預處理頭文件  3 #include<conio.h>//控制檯輸入輸出,其中定義了經過控制檯進行數據輸入和數據輸出的函數,主要是一些用戶經過按鍵盤產生的對應操做  4 #include<graphics.h>//圖形庫 頭文件  5 #include<mmsystem.h>//多媒體庫頭文件  6 #pragma comment(lib,"winmm.lib")//多媒體庫  7  8 /*  9 1.音樂播放  10 mciSendString mp3 wav格式音樂 音樂不要用網易雲下載  11 #include<mmsystem.h>//多媒體庫頭文件  12 #pragma comment(lib,"winmm.lib")//多媒體庫  13 PlaySound 只能播放WAV格式音樂  14 2.推箱子 素材:照片-->jpg或者bmp格式 音樂  15 圖形庫  16  17  18 推箱子的流程-->地圖-->推進箱子-->箱子到目的地的時候 遊戲結束  19  20 操做 每個操做對應一個函數  21 一、準備工做 地圖 素材  22 二、推箱子  23 三、判斷遊戲是否結束  24 數據存放部分  25 推箱子  26 空地0 牆1 人2 箱子3 目的地4 (用數組存儲)  27 人在目的地上:人+目的地=2+4=6  28 箱子在目的地上:箱子+目的地=3+4+7  29  30  31  32 */  33  34 int map[8][8] = {  35 0, 0, 1, 1, 1, 0, 0, 0,  36 0, 0, 1, 4, 1, 0, 0, 0,  37 0, 0, 1, 0, 1, 1, 1, 1,  38 1, 1, 1, 3, 0, 3, 4, 1,  39 1, 4, 0, 3, 2, 1, 1, 1,  40 1, 1, 1, 1, 3, 1, 0, 0,  41 0, 0, 0, 1, 4, 1, 0, 0,  42 0, 0, 0, 1, 1, 1, 0, 0  43 };//8行8列的地圖 0空地 1牆 2人 3箱子 4目的地  44 //8*8的地圖-->每張圖片大小80*80 地圖總大小640*640  45 IMAGE img[6];//總共6張素材 用數組存放  46  47 void init()//自定義的函數 用來加載素材 全局 全部人均可以用  48 {  49 //加載圖片 窗口大小640*640 小格子的大小80*80  50 loadimage(&img[0], "背景.jpg");  51 loadimage(&img[1], "目的地.jpg",80,80);//箱子推到目的地上  52 loadimage(&img[2], "牆.jpg",80,80);  53 loadimage(&img[3], "人物.jpg",80,80);  54 loadimage(&img[4], "箱子.jpg",80,80);  55 loadimage(&img[5], "源氏.jpg",80,80);//空的目的地  56  57 }  58 void drawMap()//畫地圖  59 {  60 putimage(0,0,&img[0]);  61 for (int i = 0; i < 8; ++i)//數組大小是8  62 {  63 for (int j = 0; j < 8; ++j)  64 {  65 switch (map[i][j])//循環遍歷數組  66 {  67 case 0://空地 不貼圖  68 break;  69 case 1://  70 putimage(i * 80, j * 80, &img[2]);//用來貼圖的 前面兩個是座標(圖形庫的座標)  71 break;  72 case 2://  73 putimage(i * 80, j * 80, & img[3]);  74 break;  75 case 3://箱子  76 putimage(i * 80, j * 80, &img[4]);  77 break;  78 case 4://目的地  79 putimage(i * 80, j * 80, &img[5]);  80 break;  81 case 6://人+目的地  82 putimage(i * 80, j * 80, &img[3]);  83 break;  84 case 7://箱子+目的地  85 putimage(i * 80, j * 80, &img[1]);  86 break;  87 }  88 }  89 }  90 }  91 void play()//操做部分  92 {  93 int x, y;//找人物位置  94 for (int i = 0; i < 8; ++i)  95 {  96 for (int j = 0; j < 8; ++j)  97 {  98 if (map[i][j] == 2||map[i][j]==6)//等於2或6 找到人  99 { 100 x = i; 101 y = j;//保存了人的位置 102 } 103 } 104 } 105 //而後判斷用戶輸入 106 //getch-->獲取用戶按鍵 conion.h 107 switch (getch())//人移動時遇到牆不能動 108 { 109 case 'w'://往上 多是空地多是牆 多是箱子 //多是目的地 多是箱子加目的地  110 case 'W': 111 if (map[x][y - 1] == 0 || map[x][y - 1] == 4) 112 { 113 map[x][y] -= 2; 114 map[x][y - 1] += 2; 115 } 116 else if (map[x][y - 1] == 3 || map[x][y - 1] == 7) 117 { 118 if (map[x][y - 2] == 0 || map[x][y - 2] == 4) 119 { 120 map[x][y] -= 2; 121 map[x][y - 1] -= 1; 122 map[x][y - 2] += 3; 123 } 124 } 125 break; 126 127 128 case 's'://往下 129 case 'S': 130 if (map[x][y + 1] == 0 || map[x][y + 1] == 4) 131 { 132 map[x][y] -= 2; 133 map[x][y + 1] += 2; 134 } 135 else if (map[x][y + 1] == 3 || map[x][y + 1] == 7) 136 { 137 if (map[x][y + 2] == 0 || map[x][y + 2] == 4) 138 { 139 map[x][y] -= 2; 140 map[x][y + 1] -= 1; 141 map[x][y + 2] += 3; 142 } 143 } 144 break; 145 146 case 'a'://往左 147 case 'A': 148 if (map[x - 1][y] == 0 || map[x - 1][y] == 4)//上方是空地或者是目的地 149 { 150 map[x][y] -= 2;//至關於map[x][y]=map[x][y]-2; 151 map[x - 1][y] += 2;//人往上走 152 } 153 else if (map[x - 1][y] == 3 || map[x - 1][y] == 7)//人的上方是箱子或是箱子加目的地 154 { 155 if (map[x - 2][y] == 0 || map[x - 2][y] == 4)//箱子上方是空地 能夠推進 156 { 157 map[x][y] -= 2;//人往上走 158 map[x - 1][y] -= 1;//人來了+2 箱子上去了-3 因此就是 -3+2=-1 159 map[x - 2][y] += 3;//箱子往上走 160 } 161 } 162 break; 163 164 case 'd'://往右 165 case 'D': 166 if (map[x + 1][y] == 0 || map[x + 1][y] == 4) 167 { 168 map[x][y] -= 2; 169 map[x + 1][y] += 2; 170 } 171 else if (map[x + 1][y] == 3 || map[x + 1][y] == 7) 172 { 173 if (map[x + 2][y] == 0 || map[x + 2][y] == 4) 174 { 175 map[x][y] -= 2; 176 map[x + 1][y] -= 1; 177 map[x + 2][y] += 3; 178 } 179 } 180 break; 181 182 } 183 184 185 } 186 void gameOver() 187 { 188 //何時遊戲結束 189 //一、贏 全部的箱子所有推到目的地上-->外面沒有箱子 190 //二、輸 有箱子沒有推到目的地上 或者遊戲超時 191 int flag = 0; 192 for (int i = 0; i < 8; ++i) 193 { 194 for (int j = 0; j < 8; ++j) 195 { 196 if (map[i][j] == 3)//找到了箱子 遊戲尚未贏 197 { 198 ++flag; 199 if (map[i - 1][j] == 1 || map[i + 1][j] == 1)//上方或者下方有一個 200 { 201 if (map[i][j - 1] == 1 || map[i][j + 1] == 1)//左右有一個 202 { 203 //遊戲結束 輸 204 MessageBox(GetHWnd(),"","sad",MB_OK); 205 closegraph(); 206 exit(0); 207 } 208 } 209 } 210 } 211 } 212 if (flag == 0) 213 { 214 //沒有箱子 遊戲結束 215 //return 216 MessageBox(GetHWnd(), "", "GOOD", MB_OK); 217 //第一個參數 句柄(能夠理解爲指向窗口的指針) 做用讓窗口置前 能夠爲空寫NULL或0 218 //第二個是文本 第三個是標題 第四個是按鈕 219 closegraph(); 220 exit(0);//表示退出程序 221 } 222 223 } 224 225 226 int main() 227 { 228 //音樂播放示例1 229 //mciSendString("open bgm.mp3",0,0,0);//打開音樂 230 //mciSendString("play bgm.mp3 repeat",0,0,0);//先打開 而後播放 repeat 循環播放 231 //關閉音樂 stop 暫停音樂 pause 232 //音樂播放示例2 233 mciSendString("open bgm.mp3 alias bgm", 0, 0, 0);//打開音樂 alias bgm取一個名字 234 mciSendString("play bgm repeat", 0, 0, 0);//先打開 而後播放 repeat 循環播放 235 236 initgraph(640,640);//建立窗口 237 init();//加載圖片 238 239 //開始界面================================ 240 putimage(0,0,&img[0]);//背景圖 241 settextstyle(40, 0, "宋體"); 242 settextcolor(BLACK); 243 setbkmode(TRANSPARENT);//字體背景透明 244 //或者 setbkmode(1);設置背景模式 set background mode 245 246 rectangle(200,200,400,400); 247 outtextxy(200, 200, "開始遊戲"); 248 MOUSEMSG msg; 249 int flag = 1; 250 while (flag) 251 { 252 msg = GetMouseMsg();//獲取鼠標消息 253 switch ((msg.uMsg))//判斷鼠標消息 254 { 255 case WM_LBUTTONDOWN://左鍵按下 256 if (msg.x > 200 && msg.x<400 && msg.y>200 && msg.y < 400) 257 { 258 //點擊的區域在方框以內 能夠退出循環 259 flag = 0; 260 } 261 262 default: 263 break; 264 } 265 } 266 //outtextxy(400,400,"按任意鍵開始遊戲"); 267 //getch(); 268 269 270 /* 271 鼠標操做 272 MouseHit() 判斷是否存在鼠標消息 273 MOUSEMSG 類型 存放鼠標信息 274 GetMouseMsg() 獲取鼠標信息的函數 275 */ 276 //========================================= 277 278 drawMap(); 279 while (1)//循環 函數調用 280 { 281 play(); 282 drawMap(); 283 gameOver(); 284 } 285 getchar(); 286 closegraph(); 287 return 0; 288 } 289 290 

 

 

運行結果

 

 

 

 

 

 2018.05.23    12:26:26

相關文章
相關標籤/搜索