1. 程式人生 > 程式設計 >使用pygame實現垃圾分類小遊戲功能(已獲校級二等獎)

使用pygame實現垃圾分類小遊戲功能(已獲校級二等獎)

專案簡介

本專案報名參加了“兗州中材杯”武漢理工大學第十一屆環保創意作品大賽藝術理念組比賽。組員共三名,本人負責程式碼實現部分,其餘兩人分別負責專案策劃與場景人物繪製。

專案背景

小組中負責策劃的同學經過一定的調研之後發現,我校在校學生普遍缺乏垃圾分類方面的知識。經過討論後,我們把遊戲方向定位於“垃圾分類”,遊戲型別定位於畫素風遊戲,由於本人水平和時間有限,只能將玩法設計得儘量簡單。感謝另外兩位組員,他們的努力掩蓋了我水平上的不足。

玩法介紹

家控制一名角色在操場背景上移動,垃圾桶在操場邊上。撿起垃圾丟進相應的垃圾桶內,若全部正確投放則遊戲成功,否則遊戲失敗。遊戲期間,若有不清楚該作何分類的垃圾,則可以點選圖書館的按鈕,進入圖書館查詢。圖書館提供垃圾圖鑑和分類標準兩種資訊。垃圾圖鑑幫助玩家分辨自己撿到的垃圾,而分類標準指每種垃圾的定義及舉例。

專案成果

本專案在“兗州中材杯”武漢理工大學第十一屆環保創意作品大賽藝術理念組比賽中最終獲得了第五名、二等獎的成績,距第四名僅差0.5分。

專案實現

寫專案時本人僅自學了一個月的Python,且本人是大一新生,對電腦科學的基礎知識瞭解甚少,若程式碼風格幼稚、愚蠢,還望讀者見諒。

模組劃分

遊戲按場景分為以下幾個模組:開始遊戲介面遊戲說明介面人物選擇介面操場介面(主要遊戲場地)、圖書館外介面圖書館內介面遊戲結束介面

開始遊戲介面:背景(畫素化的學校建築),遊戲標題,三個按鈕(開始、遊戲說明、退出)。

開始遊戲介面

遊戲說明介面:背景(與開始介面相同),遊戲說明文字,返回按鈕。

遊戲說明介面

人物選擇介面:背景,提示(選擇人物),兩個可選人物。

任務選擇介面

操場介面:背景,人物,垃圾桶,隨機產生的垃圾,圖書館按鈕。

操場背景
遊戲中的操場介面

圖書館外介面:背景(我校圖書館的畫素風繪製)、操場按鈕(會到操場)、進入按鈕(進入圖書館內部)。

圖書館外介面

圖書館內介面:背景(我校圖書館內部),各類垃圾圖示按鈕(廚餘垃圾、可回收垃圾、有害垃圾、其他垃圾),垃圾圖鑑按鈕,返回按鈕。子介面:各類垃圾資訊介面,垃圾圖鑑介面,返回按鈕。

圖書館內介面
廚餘垃圾資訊
可回收物資訊
有害垃圾資訊
其他垃圾資訊
垃圾圖鑑介面

遊戲結束介面:勝利介面,失敗介面。

勝利介面
失敗介面

程式碼實現

直接上程式碼:

import pygame as py
import sys
import random
from pygame.locals import *
#===========================================================
#========================前期準備===========================
py.init()
#注:遊戲需要的所有檔案(圖片等)都放在同遊戲目錄的"Files"目錄下。
#定義一個按鈕類
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))
#===========================================================
#=========================圖書館內==========================

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()
 #進入事件迴圈
 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):
     selection = 0
     break
  if not selection:
   break

def inside_Liberary():
 ilib = py.image.load('Files\\inside_liberary\\Inside.jpg')
 ilib = py.transform.smoothscale(ilib,650))
 screen.blit(ilib,0))
 #退出圖書館的按鈕
 exits = py.image.load('Files\\inside_liberary\\exit.jpg')
 exits = py.transform.smoothscale(exits,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,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,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,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
 #進入事件迴圈
 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):
     selection = 0
     break
    #點選廚餘垃圾
    if rubbish1_button.has(pos):
     selection = 1
     break
    #點選可回收垃圾
    if rubbish2_button.has(pos):
     selection = 2
     break
    #點選有害垃圾
    if rubbish3_button.has(pos):
     selection = 3
     break
    #點選不可回收垃圾
    if rubbish4_button.has(pos):
     selection = 4
     break
    #點選圖鑑
    if rubbish5_button.has(pos):
     selection = 5
     break
  if selection != -1:
   break
 if selection:
  knowledge(selection)
  inside_Liberary()
#===========================================================
#=========================圖書館外==========================

def outside_Liberary():
 olib = py.image.load('Files\\outside_liberary\\Outside.jpg')
 olib = py.transform.smoothscale(olib,650))
 screen.blit(olib,0))
 #進入圖書館的按鈕
 enter = py.image.load('Files\\outside_liberary\\enter_lib.jpg')
 enter = py.transform.smoothscale(enter,72))
 enter_button = screen.blit(enter,(470,550))
 enter_button = Button(enter_button)
 #退出圖書館的按鈕
 exits = py.image.load('Files\\outside_liberary\\playground.jpg')
 exits = py.transform.smoothscale(exits,51))
 exit_button = screen.blit(exits,590))
 exit_button = Button(exit_button)
 py.display.flip()
 selection = -1
 #進入事件迴圈
 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):
     selection = 0
     break
    #點選進入圖書館
    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,650))
 screen.blit(background,0))
 #返回按鈕
 exits = py.image.load('Files\\help\\back.jpg')
 exits = py.transform.smoothscale(exits,57))
 exit_button = screen.blit(exits,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
    
#===========================================================
#==========================遊戲結束=========================

def game_over(result):
 path = 'Files\\game_over\\result' + str(result) + '.jpg'
 background = py.image.load(path)
 background = py.transform.smoothscale(background,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

#===========================================================
#==========================操場環節=========================

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,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,72))
  lib_button = screen.blit(lib,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,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'
    
#===========================================================
#========================開始遊戲介面========================

def start():
 background = py.image.load('Files\\start\\background.jpg')
 background = py.transform.smoothscale(background,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,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,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()

遊戲效果

遊戲演示如下:

使用pygame實現垃圾分類小遊戲功能(已獲校級二等獎)

點此觀看視訊:垃圾分類小遊戲

總結

這個遊戲是本人第一次寫出一百行以上的程式碼,寫完後沒來得及進行進一步的優化就提交了專案。

到此這篇關於使用pygame實現垃圾分類小遊戲功能(已獲校級二等獎)的文章就介紹到這了,更多相關pygame垃圾分類小遊戲內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!