项目简介
本项目报名参加了“兖州中材杯”武汉理工大学第十一届环保创意作品大赛艺术理念组比赛。组员共三名,本人负责代码实现部分,其余两人分别负责项目策划与场景人物绘制。
项目背景
小组中负责策划的同学经过一定的调研之后发现,我校在校学生普遍缺乏垃圾分类方面的知识。经过讨论后,我们把游戏方向定位于“垃圾分类”,游戏类型定位于像素风游戏,由于本人水平和时间有限,只能将玩法设计得尽量简单。感谢另外两位组员,他们的努力掩盖了我水平上的不足。
玩法介绍
家控制一名角色在操场背景上移动,垃圾桶在操场边上。捡起垃圾丢进相应的垃圾桶内,若全部正确投放则游戏成功,否则游戏失败。游戏期间,若有不清楚该作何分类的垃圾,则可以点击图书馆的按钮,进入图书馆查询。图书馆提供垃圾图鉴和分类标准两种信息。垃圾图鉴帮助玩家分辨自己捡到的垃圾,而分类标准指每种垃圾的定义及举例。
项目成果
本项目在“兖州中材杯”武汉理工大学第十一届环保创意作品大赛艺术理念组比赛中最终获得了第五名、二等奖的成绩,距第四名仅差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,(1000,650)) screen.blit(ilib,(0,0)) #退出图书馆的按钮 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 #进入事件循环 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,(1000,650)) screen.blit(olib,(0,0)) #进入图书馆的按钮 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) #退出图书馆的按钮 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 #进入事件循环 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,(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 #=========================================================== #==========================游戏结束========================= 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 #=========================================================== #==========================操场环节========================= 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' #=========================================================== #========================开始游戏界面======================== 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()
游戏效果
游戏演示如下:
点此观看视频:垃圾分类小游戏
总结
这个游戏是本人第一次写出一百行以上的代码,写完后没来得及进行进一步的优化就提交了项目。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 《暗喻幻想》顺风耳作用介绍
- 崔健1985-梦中的倾诉[再版][WAV+CUE]
- 黄子馨《追星Xin的恋人们2》HQ头版限量编号[WAV+CUE]
- 孟庭苇《情人的眼泪》开盘母带[低速原抓WAV+CUE]
- 孙露《谁为我停留HQCD》[低速原抓WAV+CUE][1.1G]
- 孙悦《时光音乐会》纯银CD[低速原抓WAV+CUE][1.1G]
- 任然《渐晚》[FLAC/分轨][72.32MB]
- 英雄联盟新英雄安蓓萨上线了吗 新英雄安蓓萨技能介绍
- 魔兽世界奥杜尔竞速赛什么时候开启 奥杜尔竞速赛开启时间介绍
- 无畏契约CGRS准星代码多少 CGRS准星代码分享一览
- 张靓颖.2012-倾听【少城时代】【WAV+CUE】
- 游鸿明.1999-五月的雪【大宇国际】【WAV+CUE】
- 曹方.2005-遇见我【钛友文化】【WAV+CUE】
- Unity6引擎上线:稳定性提升、CPU性能最高提升4倍
- 人皇Sky今日举行婚礼!电竞传奇步入新篇章