C++學習(九)之 項目 推箱子遊戲
阿新 • • 發佈:2018-05-23
bgm 控制臺 兩個 分享 加載圖片 eat gethwnd put init
遊戲制作 推箱子
步驟分析
1、模板
2、模板分析
組成元素:
空地 墻 人 目的地 箱子 背景
3、如何操作
通過WASD鍵盤操作人,推著箱子,到達目的地,遊戲結束,如果箱子卡在死角則遊戲失敗
4、如何繪制地圖
通過數組來存儲繪制
數組中 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 1、準備工作 地圖 素材
22 2、推箱子
23 3、判斷遊戲是否結束
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 //1、贏 所有的箱子全部推到目的地上-->外面沒有箱子
190 //2、輸 有箱子沒有推到目的地上 或者遊戲超時
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
C++學習(九)之 項目 推箱子遊戲