項(xiàng)目簡(jiǎn)介
本項(xiàng)目報(bào)名參加了“兗州中材杯”武漢理工大學(xué)第十一屆環(huán)保創(chuàng)意作品大賽藝術(shù)理念組比賽。組員共三名,本人負(fù)責(zé)代碼實(shí)現(xiàn)部分,其余兩人分別負(fù)責(zé)項(xiàng)目策劃與場(chǎng)景人物繪制。
項(xiàng)目背景
小組中負(fù)責(zé)策劃的同學(xué)經(jīng)過(guò)一定的調(diào)研之后發(fā)現(xiàn),我校在校學(xué)生普遍缺乏垃圾分類方面的知識(shí)。經(jīng)過(guò)討論后,我們把游戲方向定位于“垃圾分類”,游戲類型定位于像素風(fēng)游戲,由于本人水平和時(shí)間有限,只能將玩法設(shè)計(jì)得盡量簡(jiǎn)單。感謝另外兩位組員,他們的努力掩蓋了我水平上的不足。
玩法介紹
家控制一名角色在操場(chǎng)背景上移動(dòng),垃圾桶在操場(chǎng)邊上。撿起垃圾丟進(jìn)相應(yīng)的垃圾桶內(nèi),若全部正確投放則游戲成功,否則游戲失敗。游戲期間,若有不清楚該作何分類的垃圾,則可以點(diǎn)擊圖書(shū)館的按鈕,進(jìn)入圖書(shū)館查詢。圖書(shū)館提供垃圾圖鑒和分類標(biāo)準(zhǔn)兩種信息。垃圾圖鑒幫助玩家分辨自己撿到的垃圾,而分類標(biāo)準(zhǔn)指每種垃圾的定義及舉例。
項(xiàng)目成果
本項(xiàng)目在“兗州中材杯”武漢理工大學(xué)第十一屆環(huán)保創(chuàng)意作品大賽藝術(shù)理念組比賽中最終獲得了第五名、二等獎(jiǎng)的成績(jī),距第四名僅差0.5分。
項(xiàng)目實(shí)現(xiàn)
寫(xiě)項(xiàng)目時(shí)本人僅自學(xué)了一個(gè)月的Python,且本人是大一新生,對(duì)計(jì)算機(jī)科學(xué)的基礎(chǔ)知識(shí)了解甚少,若代碼風(fēng)格幼稚、愚蠢,還望讀者見(jiàn)諒。
模塊劃分
游戲按場(chǎng)景分為以下幾個(gè)模塊:開(kāi)始游戲界面、游戲說(shuō)明界面、人物選擇界面、操場(chǎng)界面(主要游戲場(chǎng)地)、圖書(shū)館外界面、圖書(shū)館內(nèi)界面、游戲結(jié)束界面。
開(kāi)始游戲界面:背景(像素化的學(xué)校建筑),游戲標(biāo)題,三個(gè)按鈕(開(kāi)始、游戲說(shuō)明、退出)。
游戲說(shuō)明界面:背景(與開(kāi)始界面相同),游戲說(shuō)明文字,返回按鈕。
人物選擇界面:背景,提示(選擇人物),兩個(gè)可選人物。
操場(chǎng)界面:背景,人物,垃圾桶,隨機(jī)產(chǎn)生的垃圾,圖書(shū)館按鈕。
圖書(shū)館外界面:背景(我校圖書(shū)館的像素風(fēng)繪制)、操場(chǎng)按鈕(會(huì)到操場(chǎng))、進(jìn)入按鈕(進(jìn)入圖書(shū)館內(nèi)部)。
圖書(shū)館內(nèi)界面:背景(我校圖書(shū)館內(nèi)部),各類垃圾圖標(biāo)按鈕(廚余垃圾、可回收垃圾、有害垃圾、其他垃圾),垃圾圖鑒按鈕,返回按鈕。子界面:各類垃圾信息界面,垃圾圖鑒界面,返回按鈕。
游戲結(jié)束界面:勝利界面,失敗界面。
代碼實(shí)現(xiàn)
直接上代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
|
import pygame as py import sys import random from pygame. locals import * #=========================================================== #========================前期準(zhǔn)備=========================== py.init() #注:游戲需要的所有文件(圖片等)都放在同游戲目錄的"Files"目錄下。 #定義一個(gè)按鈕類 class Button(py.rect.Rect): def __init__( self , obj): super ().__init__(obj) def has( self , pos): if self .right > = pos[ 0 ] > = self .left and self .bottom > = pos[ 1 ] > = self .top: return True else : return False screen = py.display.set_mode(( 1000 , 650 )) #=========================================================== #=========================圖書(shū)館內(nèi)========================== def knowledge(selection): path = 'Files\\inside_liberary\\knowledge' + str (selection) + '.jpg' know = py.image.load(path) know = py.transform.smoothscale(know,( 1000 , 650 )) screen.blit(know,( 0 , 0 )) exits = py.image.load( 'Files\\inside_liberary\\back.jpg' ) exits = py.transform.smoothscale(exits,( 72 , 72 )) exit_button = screen.blit(exits,( 918 , 570 )) exit_button = Button(exit_button) py.display.flip() #進(jìn)入事件循環(huán) while True : for event in py.event.get(): if event. type = = QUIT: sys.exit() if event. type = = MOUSEBUTTONDOWN: pos = py.mouse.get_pos() #點(diǎn)擊離開(kāi)該頁(yè)面 if exit_button.has(pos): selection = 0 break if not selection: break def inside_Liberary(): ilib = py.image.load( 'Files\\inside_liberary\\Inside.jpg' ) ilib = py.transform.smoothscale(ilib,( 1000 , 650 )) screen.blit(ilib,( 0 , 0 )) #退出圖書(shū)館的按鈕 exits = py.image.load( 'Files\\inside_liberary\\exit.jpg' ) exits = py.transform.smoothscale(exits,( 72 , 81 )) exit_button = screen.blit(exits,( 5 , 560 )) exit_button = Button(exit_button) #廚余垃圾按鈕 rubbish1 = py.image.load( 'Files\\inside_liberary\\rubbish1.jpg' ) rubbish1 = py.transform.smoothscale(rubbish1,( 150 , 298 )) rubbish1_button = screen.blit(rubbish1, ( 80 , 150 )) rubbish1_button = Button(rubbish1_button) #可回收垃圾按鈕 rubbish2 = py.image.load( 'Files\\inside_liberary\\rubbish2.jpg' ) rubbish2 = py.transform.smoothscale(rubbish2,( 150 , 298 )) rubbish2_button = screen.blit(rubbish2, ( 310 , 150 )) rubbish2_button = Button(rubbish2_button) #有害垃圾按鈕 rubbish3 = py.image.load( 'Files\\inside_liberary\\rubbish3.jpg' ) rubbish3 = py.transform.smoothscale(rubbish3,( 150 , 298 )) rubbish3_button = screen.blit(rubbish3, ( 540 , 150 )) rubbish3_button = Button(rubbish3_button) #不可回收垃圾按鈕 rubbish4 = py.image.load( 'Files\\inside_liberary\\rubbish4.jpg' ) rubbish4 = py.transform.smoothscale(rubbish4,( 150 , 298 )) rubbish4_button = screen.blit(rubbish4, ( 770 , 150 )) rubbish4_button = Button(rubbish4_button) #圖鑒按鈕 rubbish5 = py.image.load( 'Files\\inside_liberary\\rubbish5.jpg' ) rubbish5 = py.transform.smoothscale(rubbish5,( 82 , 72 )) rubbish5_button = screen.blit(rubbish5, ( 903 , 560 )) rubbish5_button = Button(rubbish5_button) py.display.flip() selection = - 1 #進(jìn)入事件循環(huán) while True : for event in py.event.get(): if event. type = = QUIT: sys.exit() if event. type = = MOUSEBUTTONDOWN: pos = py.mouse.get_pos() #點(diǎn)擊離開(kāi)圖書(shū)館 if exit_button.has(pos): selection = 0 break #點(diǎn)擊廚余垃圾 if rubbish1_button.has(pos): selection = 1 break #點(diǎn)擊可回收垃圾 if rubbish2_button.has(pos): selection = 2 break #點(diǎn)擊有害垃圾 if rubbish3_button.has(pos): selection = 3 break #點(diǎn)擊不可回收垃圾 if rubbish4_button.has(pos): selection = 4 break #點(diǎn)擊圖鑒 if rubbish5_button.has(pos): selection = 5 break if selection ! = - 1 : break if selection: knowledge(selection) inside_Liberary() #=========================================================== #=========================圖書(shū)館外========================== def outside_Liberary(): olib = py.image.load( 'Files\\outside_liberary\\Outside.jpg' ) olib = py.transform.smoothscale(olib,( 1000 , 650 )) screen.blit(olib,( 0 , 0 )) #進(jìn)入圖書(shū)館的按鈕 enter = py.image.load( 'Files\\outside_liberary\\enter_lib.jpg' ) enter = py.transform.smoothscale(enter,( 72 , 72 )) enter_button = screen.blit(enter,( 470 , 550 )) enter_button = Button(enter_button) #退出圖書(shū)館的按鈕 exits = py.image.load( 'Files\\outside_liberary\\playground.jpg' ) exits = py.transform.smoothscale(exits,( 72 , 51 )) exit_button = screen.blit(exits,( 5 , 590 )) exit_button = Button(exit_button) py.display.flip() selection = - 1 #進(jìn)入事件循環(huán) while True : for event in py.event.get(): if event. type = = QUIT: sys.exit() if event. type = = MOUSEBUTTONDOWN: pos = py.mouse.get_pos() #點(diǎn)擊返回操場(chǎng) if exit_button.has(pos): selection = 0 break #點(diǎn)擊進(jìn)入圖書(shū)館 if enter_button.has(pos): selection = 1 break if selection ! = - 1 : break if selection: inside_Liberary() outside_Liberary() #=========================================================== #==========================游戲幫助========================= def help_page(): background = py.image.load( 'Files\\help\\background.jpg' ) background = py.transform.smoothscale(background,( 1000 , 650 )) screen.blit(background,( 0 , 0 )) #返回按鈕 exits = py.image.load( 'Files\\help\\back.jpg' ) exits = py.transform.smoothscale(exits,( 72 , 57 )) exit_button = screen.blit(exits,( 5 , 585 )) exit_button = Button(exit_button) py.display.flip() back = 0 while True : for event in py.event.get(): if event. type = = QUIT: sys.exit() if event. type = = MOUSEBUTTONDOWN: pos = py.mouse.get_pos() if exit_button.has(pos): back = 1 break if back: break #=========================================================== #==========================游戲結(jié)束========================= def game_over(result): path = 'Files\\game_over\\result' + str (result) + '.jpg' background = py.image.load(path) background = py.transform.smoothscale(background,( 1000 , 650 )) screen.blit(background,( 0 , 0 )) py.display.flip() temp = 0 while True : for event in py.event.get(): if event. type = = QUIT: sys.exit() if event. type = = MOUSEBUTTONDOWN: temp = 1 break if temp: break #=========================================================== #==========================操場(chǎng)環(huán)節(jié)========================= choices = [ '01' , '02' , '11' , '12' , '21' , '22' , '31' ] class Rubbish(): def __init__( self , sort): self .sort = sort self .img = py.image.load( 'Files\\playground\\' + sort + ' .jpg') x = random.randint( 100 , 1400 ) y = random.randint( 110 , 900 ) self .position = self .img.get_rect() self .position = self .position.move((x, y)) screen.blit( self .img, self .position) class Role(): def __init__( self , role): self .r_side = py.image.load( 'Files\\playground\\' + role + ' 1.jpg ') self .r_walk = py.image.load( 'Files\\playground\\' + role + ' 2.jpg ') self .l_side = py.transform.flip( self .r_side, True , False ) self .l_walk = py.transform.flip( self .r_walk, True , False ) self .img = self . r_side self .position = self .img.get_rect() screen.blit( self .img, self .position) self .rubbish = None def move( self , key): if key = = K_UP: if self .position.top < = 200 : return ( 0 , 2 ) else : self .position = self .position.move( 0 , - 2 ) return 0 if key = = K_DOWN: if self .position.bottom > = 450 : return ( 0 , - 2 ) else : self .position = self .position.move( 0 , 2 ) return 0 if key = = K_RIGHT: if self .position.right > = 800 : return ( - 2 , 0 ) else : self .position = self .position.move( 2 , 0 ) return 0 if key = = K_LEFT: if self .position.left < = 200 : return ( 2 , 0 ) else : self .position = self .position.move( - 2 , 0 ) return 0 class Trash_can(): def __init__( self , num): self . num = num self .img = py.image.load( 'Files\\playground\\' + str(num) + ' .jpg') self .img = py.transform.smoothscale( self .img,( 100 , 92 )) self .position = self .img.get_rect() self .position = self .position.move(( 100 + num * 200 , 0 )) screen.blit( self .img, self .position) def playground(selection): background = py.image.load( 'Files\\playground\\Playground.jpg' ) screen.blit(background, [ 0 , 0 ]) lib = py.image.load( 'Files\\playground\\liberary.jpg' ) lib = py.transform.smoothscale(lib, ( 78 , 72 )) lib_button = screen.blit(lib, ( 900 , 10 )) lib_button = Button(lib_button) trash_can = [] for num in range ( 0 , 4 ): trash_can.append(Trash_can(num)) role = Role(selection) rubbish = [] for sort in choices: rubbish.append(Rubbish(sort)) py.display.flip() down = 0 go = None move_bg = [ 0 , 0 ] temp = 0 while True : for event in py.event.get(): if event. type = = QUIT: sys.exit() if event. type = = MOUSEBUTTONDOWN: pos = py.mouse.get_pos() if lib_button.has(pos): outside_Liberary() if event. type = = KEYDOWN and \ event.key in (K_UP, K_DOWN, K_RIGHT, K_LEFT): if event.key = = K_RIGHT: role.img = role.r_side elif event.key = = K_LEFT: role.img = role.l_side down = 1 go = event.key if event. type = = KEYUP and event.key = = go: if event.key = = K_RIGHT: role.img = role.r_side elif event.key = = K_LEFT: role.img = role.l_side down = 0 take = role.position.collidelist([each.position for each in rubbish]) if take > = 0 and not role.rubbish: role.rubbish = rubbish[take].sort[ 0 ] del rubbish[take] put = role.position.collidelist([each.position for each in trash_can]) if put > = 0 and role.rubbish: if role.rubbish = = str (trash_can[put].num): role.rubbish = None if not len (rubbish): game_over( 1 ) break else : game_over( 2 ) break if down: moved = role.move(go) temp + = 1 if not temp % 20 : if role.img = = role.r_side: role.img = role.r_walk elif role.img = = role.r_walk: role.img = role.r_side elif role.img = = role.l_side: role.img = role.l_walk else : role.img = role.l_side if moved: if 0 > = moved[ 0 ] + move_bg[ 0 ] > = - 497 and \ 0 > = moved[ 1 ] + move_bg[ 1 ] > = - 326 : for i in range ( 2 ): move_bg[i] + = moved[i] for each in rubbish: each.position = each.position.move(moved) for each in trash_can: each.position = each.position.move(moved) elif role.position.left - moved[ 0 ] > = 0 and \ role.position.right - moved[ 0 ] < = 1000 and \ role.position.top - moved[ 1 ] > = 0 and \ role.position.bottom - moved[ 1 ] < = 650 : role. position = role.position.move([ - i for i in moved]) screen.blit(background, move_bg) lib = py.image.load( 'Files\\playground\\liberary.jpg' ) lib = py.transform.smoothscale(lib, ( 78 , 72 )) lib_button = screen.blit(lib, ( 900 , 10 )) lib_button = Button(lib_button) for each in trash_can: screen.blit(each.img, each.position) for each in rubbish: screen.blit(each.img, each.position) screen.blit(role.img, role.position) py.display.flip() #=========================================================== #==========================選擇人物========================= def choose_role(): background = py.image.load( 'Files\\choose_player\\background.jpg' ) background = py.transform.smoothscale(background,( 1000 , 650 )) screen.blit(background, ( 0 , 0 )) man = py.image.load( 'Files\\choose_player\\man.jpg' ) man = py.transform.smoothscale(man,( 123 , 325 )) man_button = screen.blit(man,( 200 , 200 )) man_button = Button(man_button) woman = py.image.load( 'Files\\choose_player\\woman.jpg' ) woman = py.transform.smoothscale(woman,( 113 , 325 )) woman_button = screen.blit(woman,( 687 , 200 )) woman_button = Button(woman_button) py.display.flip() while True : for event in py.event.get(): if event. type = = QUIT: sys.exit() if event. type = = MOUSEBUTTONDOWN: pos = py.mouse.get_pos() if man_button.has(pos): return 'man' if woman_button.has(pos): return 'woman' #=========================================================== #========================開(kāi)始游戲界面======================== def start(): background = py.image.load( 'Files\\start\\background.jpg' ) background = py.transform.smoothscale(background,( 1000 , 650 )) screen.blit(background, ( 0 , 0 )) start_game = py.image.load( 'Files\\start\\start_game.jpg' ) start_game = py.transform.smoothscale(start_game,( 140 , 149 )) start_button = screen.blit(start_game,( 150 , 330 )) start_button = Button(start_button) game_help = py.image.load( 'Files\\start\\game_help.jpg' ) game_help = py.transform.smoothscale(game_help,( 280 , 182 )) help_button = screen.blit(game_help,( 380 , 320 )) help_button = Button(help_button) quit_game = py.image.load( 'Files\\start\\quit_game.jpg' ) quit_game = py.transform.smoothscale(quit_game,( 200 , 160 )) quit_button = screen.blit(quit_game,( 680 , 330 )) quit_button = Button(quit_button) py.display.flip() while True : for event in py.event.get(): if event. type = = QUIT: sys.exit() if event. type = = MOUSEBUTTONDOWN: pos = py.mouse.get_pos() if start_button.has(pos): role = choose_role() playground(role) break elif help_button.has(pos): help_page() break elif quit_button.has(pos): sys.exit() break start() start() |
游戲效果
游戲演示如下:
15
總結(jié)
這個(gè)游戲是本人第一次寫(xiě)出一百行以上的代碼,寫(xiě)完后沒(méi)來(lái)得及進(jìn)行進(jìn)一步的優(yōu)化就提交了項(xiàng)目。
到此這篇關(guān)于使用pygame實(shí)現(xiàn)垃圾分類小游戲功能(已獲校級(jí)二等獎(jiǎng))的文章就介紹到這了,更多相關(guān)pygame垃圾分類小游戲內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/Vincentish/article/details/107495432