小編寫這篇文章的一個主要目的,主要是用來給大家去做個相關的介紹,介紹的內容主要是涉及到相關的游戲實現,比如怎么去做游戲呢?比如說,怎么去做打豆豆的游戲呢?關于這方面的內容,下面就給大家詳細解答下。
序言
前天晚上,玩起了在我們的學生時代經常玩的一些游戲,“吃豆豆”,但是我發現,在一局游戲當中,我們命的條數是比較少的,我根本不能吃完所有的豆豆,總是被敵人吃掉
于是,我在想怎么能夠保證我達到吃完所有豆豆的目標,然后我就想到了一個辦法:
所以我自己找資料,找素材,學習仿寫了一款吃豆豆的小游戲,然后給我自己無限開掛!
把這個游戲做成功之后,我就完全可以進行無限的躺平了,哈哈哈,這個游戲真的太好玩了。
一、首先
1)素材
首先找到吃豆豆游戲的界面按照上面的素材找找準備下相似的圖片!如下:
2)環境
本文的環境都跟之前的差不多:Python3、Pycharm、Pygame模塊。
模塊安裝:
pip install-i https://pypi.douban.com/simple/pygame
二、正式開始
這款吃豆豆的小游戲:主要分為4塊主要內容,分別是。Levels.py、Sprites.py、cfg.py、Game.py
1)配置文件:cfg.py
import os '''定義一些顏色''' BLACK=(0,0,0) WHITE=(255,255,255) BLUE=(0,0,255) GREEN=(0,255,0) RED=(255,0,0) YELLOW=(255,255,0) PURPLE=(255,0,255) SKYBLUE=(0,191,255) '''游戲素材路徑''' BGMPATH=os.path.join(os.getcwd(),'resources/sounds/bg.mp3') ICONPATH=os.path.join(os.getcwd(),'resources/images/icon.png') FONTPATH=os.path.join(os.getcwd(),'resources/font/ALGER.TTF') HEROPATH=os.path.join(os.getcwd(),'resources/images/pacman.png') BlinkyPATH=os.path.join(os.getcwd(),'resources/images/Blinky.png') ClydePATH=os.path.join(os.getcwd(),'resources/images/Clyde.png') InkyPATH=os.path.join(os.getcwd(),'resources/images/Inky.png') PinkyPATH=os.path.join(os.getcwd(),'resources/images/Pinky.png')
2)定義一些精靈類:Sprites.py
import random import pygame '''墻類''' class Wall(pygame.sprite.Sprite): def __init__(self,x,y,width,height,color,**kwargs): pygame.sprite.Sprite.__init__(self) self.image=pygame.Surface([width,height]) self.image.fill(color) self.rect=self.image.get_rect() self.rect.left=x self.rect.top=y '''食物類''' class Food(pygame.sprite.Sprite): def __init__(self,x,y,width,height,color,bg_color,**kwargs): pygame.sprite.Sprite.__init__(self) self.image=pygame.Surface([width,height]) self.image.fill(bg_color) self.image.set_colorkey(bg_color) pygame.draw.ellipse(self.image,color,[0,0,width,height]) self.rect=self.image.get_rect() self.rect.left=x self.rect.top=y '''角色類''' class Player(pygame.sprite.Sprite): def __init__(self,x,y,role_image_path): pygame.sprite.Sprite.__init__(self) self.role_name=role_image_path.split('/')[-1].split('.')[0] self.base_image=pygame.image.load(role_image_path).convert() self.image=self.base_image.copy() self.rect=self.image.get_rect() self.rect.left=x self.rect.top=y self.prev_x=x self.prev_y=y self.base_speed=[30,30] self.speed=[0,0] self.is_move=False self.tracks=[] self.tracks_loc=[0,0] '''改變速度方向''' def changeSpeed(self,direction): if direction[0]<0: self.image=pygame.transform.flip(self.base_image,True,False) elif direction[0]>0: self.image=self.base_image.copy() elif direction[1]<0: self.image=pygame.transform.rotate(self.base_image,90) elif direction[1]>0: self.image=pygame.transform.rotate(self.base_image,-90) self.speed=[direction[0]*self.base_speed[0],direction[1]*self.base_speed[1]] return self.speed '''更新角色位置''' def update(self,wall_sprites,gate_sprites): if not self.is_move: return False x_prev=self.rect.left y_prev=self.rect.top self.rect.left+=self.speed[0] self.rect.top+=self.speed[1] is_collide=pygame.sprite.spritecollide(self,wall_sprites,False) if gate_sprites is not None: if not is_collide: is_collide=pygame.sprite.spritecollide(self,gate_sprites,False) if is_collide: self.rect.left=x_prev self.rect.top=y_prev return False return True '''生成隨機的方向''' def randomDirection(self): return random.choice([[-0.5,0],[0.5,0],[0,0.5],[0,-0.5]])
3)定義關卡:Levels.py
import pygame from.Sprites import* '''關卡數量''' NUMLEVELS=1 '''關卡一''' class Level1(): def __init__(self): self.info='level1' '''創建墻''' def setupWalls(self,wall_color): self.wall_sprites=pygame.sprite.Group() wall_positions=[ [0,0,6,600],[0,0,600,6],[0,600,606,6],[600,0,6,606],[300,0,6,66],[60,60,186,6], [360,60,186,6],[60,120,66,6],[60,120,6,126],[180,120,246,6],[300,120,6,66], [480,120,66,6],[540,120,6,126],[120,180,126,6],[120,180,6,126],[360,180,126,6], [480,180,6,126],[180,240,6,126],[180,360,246,6],[420,240,6,126],[240,240,42,6], [324,240,42,6],[240,240,6,66],[240,300,126,6],[360,240,6,66],[0,300,66,6], [540,300,66,6],[60,360,66,6],[60,360,6,186],[480,360,66,6],[540,360,6,186], [120,420,366,6],[120,420,6,66],[480,420,6,66],[180,480,246,6],[300,480,6,66], [120,540,126,6],[360,540,126,6] ] for wall_position in wall_positions: wall=Wall(*wall_position,wall_color) self.wall_sprites.add(wall) return self.wall_sprites '''創建門''' def setupGate(self,gate_color): self.gate_sprites=pygame.sprite.Group() self.gate_sprites.add(Wall(282,242,42,2,gate_color)) return self.gate_sprites '''創建角色''' def setupPlayers(self,hero_image_path,ghost_images_path): self.hero_sprites=pygame.sprite.Group() self.ghost_sprites=pygame.sprite.Group() self.hero_sprites.add(Player(287,439,hero_image_path)) for each in ghost_images_path: role_name=each.split('/')[-1].split('.')[0] if role_name=='Blinky': player=Player(287,199,each) player.is_move=True player.tracks=[ [0,-0.5,4],[0.5,0,9],[0,0.5,11],[0.5,0,3],[0,0.5,7],[-0.5,0,11],[0,0.5,3], [0.5,0,15],[0,-0.5,15],[0.5,0,3],[0,-0.5,11],[-0.5,0,3],[0,-0.5,11],[-0.5,0,3], [0,-0.5,3],[-0.5,0,7],[0,-0.5,3],[0.5,0,15],[0,0.5,15],[-0.5,0,3],[0,0.5,3], [-0.5,0,3],[0,-0.5,7],[-0.5,0,3],[0,0.5,7],[-0.5,0,11],[0,-0.5,7],[0.5,0,5] ] self.ghost_sprites.add(player) elif role_name=='Clyde': player=Player(319,259,each) player.is_move=True player.tracks=[ [-1,0,2],[0,-0.5,4],[0.5,0,5],[0,0.5,7],[-0.5,0,11],[0,-0.5,7], [-0.5,0,3],[0,0.5,7],[-0.5,0,7],[0,0.5,15],[0.5,0,15],[0,-0.5,3], [-0.5,0,11],[0,-0.5,7],[0.5,0,3],[0,-0.5,11],[0.5,0,9] ] self.ghost_sprites.add(player) elif role_name=='Inky': player=Player(255,259,each) player.is_move=True player.tracks=[ [1,0,2],[0,-0.5,4],[0.5,0,10],[0,0.5,7],[0.5,0,3],[0,-0.5,3], [0.5,0,3],[0,-0.5,15],[-0.5,0,15],[0,0.5,3],[0.5,0,15],[0,0.5,11], [-0.5,0,3],[0,-0.5,7],[-0.5,0,11],[0,0.5,3],[-0.5,0,11],[0,0.5,7], [-0.5,0,3],[0,-0.5,3],[-0.5,0,3],[0,-0.5,15],[0.5,0,15],[0,0.5,3], [-0.5,0,15],[0,0.5,11],[0.5,0,3],[0,-0.5,11],[0.5,0,11],[0,0.5,3],[0.5,0,1] ] self.ghost_sprites.add(player) elif role_name=='Pinky': player=Player(287,259,each) player.is_move=True player.tracks=[ [0,-1,4],[0.5,0,9],[0,0.5,11],[-0.5,0,23],[0,0.5,7],[0.5,0,3], [0,-0.5,3],[0.5,0,19],[0,0.5,3],[0.5,0,3],[0,0.5,3],[0.5,0,3], [0,-0.5,15],[-0.5,0,7],[0,0.5,3],[-0.5,0,19],[0,-0.5,11],[0.5,0,9] ] self.ghost_sprites.add(player) return self.hero_sprites,self.ghost_sprites '''創建食物''' def setupFood(self,food_color,bg_color): self.food_sprites=pygame.sprite.Group() for row in range(19): for col in range(19): if(row==7 or row==8)and(col==8 or col==9 or col==10): continue else: food=Food(30*col+32,30*row+32,4,4,food_color,bg_color) is_collide=pygame.sprite.spritecollide(food,self.wall_sprites,False) if is_collide: continue is_collide=pygame.sprite.spritecollide(food,self.hero_sprites,False) if is_collide: continue self.food_sprites.add(food) return self.food_sprites 4)主程序Game.py import sys import cfg import pygame import modules.Levels as Levels '''開始某一關游戲''' def startLevelGame(level,screen,font): clock=pygame.time.Clock() SCORE=0 wall_sprites=level.setupWalls(cfg.SKYBLUE) gate_sprites=level.setupGate(cfg.WHITE) hero_sprites,ghost_sprites=level.setupPlayers(cfg.HEROPATH,[cfg.BlinkyPATH,cfg.ClydePATH,cfg.InkyPATH,cfg.PinkyPATH]) food_sprites=level.setupFood(cfg.YELLOW,cfg.WHITE) is_clearance=False while True: for event in pygame.event.get(): if event.type==pygame.QUIT: sys.exit(-1) pygame.quit() if event.type==pygame.KEYDOWN: if event.key==pygame.K_LEFT: for hero in hero_sprites: hero.changeSpeed([-1,0]) hero.is_move=True elif event.key==pygame.K_RIGHT: for hero in hero_sprites: hero.changeSpeed([1,0]) hero.is_move=True elif event.key==pygame.K_UP: for hero in hero_sprites: hero.changeSpeed([0,-1]) hero.is_move=True elif event.key==pygame.K_DOWN: for hero in hero_sprites: hero.changeSpeed([0,1]) hero.is_move=True if event.type==pygame.KEYUP: if(event.key==pygame.K_LEFT)or(event.key==pygame.K_RIGHT)or(event.key==pygame.K_UP)or(event.key==pygame.K_DOWN): hero.is_move=False screen.fill(cfg.BLACK) for hero in hero_sprites: hero.update(wall_sprites,gate_sprites) hero_sprites.draw(screen) for hero in hero_sprites: food_eaten=pygame.sprite.spritecollide(hero,food_sprites,True) SCORE+=len(food_eaten) wall_sprites.draw(screen) gate_sprites.draw(screen) food_sprites.draw(screen) for ghost in ghost_sprites: #幽靈隨機運動(效果不好且有BUG) ''' res=ghost.update(wall_sprites,None) while not res: ghost.changeSpeed(ghost.randomDirection()) res=ghost.update(wall_sprites,None) ''' #指定幽靈運動路徑 if ghost.tracks_loc[1]<ghost.tracks[ghost.tracks_loc[0]][2]: ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0:2]) ghost.tracks_loc[1]+=1 else: if ghost.tracks_loc[0]<len(ghost.tracks)-1: ghost.tracks_loc[0]+=1 elif ghost.role_name=='Clyde': ghost.tracks_loc[0]=2 else: ghost.tracks_loc[0]=0 ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0:2]) ghost.tracks_loc[1]=0 if ghost.tracks_loc[1]<ghost.tracks[ghost.tracks_loc[0]][2]: ghost.changeSpeed(ghost.tracks[ghost.tracks_loc[0]][0:2]) else: if ghost.tracks_loc[0]<len(ghost.tracks)-1: loc0=ghost.tracks_loc[0]+1 elif ghost.role_name=='Clyde': loc0=2 else: loc0=0 ghost.changeSpeed(ghost.tracks[loc0][0:2]) ghost.update(wall_sprites,None) ghost_sprites.draw(screen) score_text=font.render("Score:%s"%SCORE,True,cfg.RED) screen.blit(score_text,[10,10]) if len(food_sprites)==0: is_clearance=True break if pygame.sprite.groupcollide(hero_sprites,ghost_sprites,False,False): is_clearance=False break pygame.display.flip() clock.tick(10) return is_clearance '''顯示文字''' def showText(screen,font,is_clearance,flag=False): clock=pygame.time.Clock() msg='Game Over!'if not is_clearance else'Congratulations,you won!' positions=[[235,233],[65,303],[170,333]]if not is_clearance else[[145,233],[65,303],[170,333]] surface=pygame.Surface((400,200)) surface.set_alpha(10) surface.fill((128,128,128)) screen.blit(surface,(100,200)) texts=[font.render(msg,True,cfg.WHITE), font.render('Press ENTER to continue or play again.',True,cfg.WHITE), font.render('Press ESCAPE to quit.',True,cfg.WHITE)] while True: for event in pygame.event.get(): if event.type==pygame.QUIT: sys.exit() pygame.quit() if event.type==pygame.KEYDOWN: if event.key==pygame.K_RETURN: if is_clearance: if not flag: return else: main(initialize()) else: main(initialize()) elif event.key==pygame.K_ESCAPE: sys.exit() pygame.quit() for idx,(text,position)in enumerate(zip(texts,positions)): screen.blit(text,position) pygame.display.flip() clock.tick(10) '''初始化''' def initialize(): pygame.init() icon_image=pygame.image.load(cfg.ICONPATH) pygame.display.set_icon(icon_image) screen=pygame.display.set_mode([606,606]) pygame.display.set_caption('吃豆豆小游戲') return screen '''主函數''' def main(screen): pygame.mixer.init() pygame.mixer.music.load(cfg.BGMPATH) pygame.mixer.music.play(-1,0.0) pygame.font.init() font_small=pygame.font.Font(cfg.FONTPATH,18) font_big=pygame.font.Font(cfg.FONTPATH,24) for num_level in range(1,Levels.NUMLEVELS+1): level=getattr(Levels,f'Level{num_level}')() is_clearance=startLevelGame(level,screen,font_small) if num_level==Levels.NUMLEVELS: showText(screen,font_big,is_clearance,True) else: showText(screen,font_big,is_clearance) '''run''' if __name__=='__main__': main(initialize())
三、效果展示
截圖展示
綜上所述,這篇文章就給大家介紹到這里了,希望可以給大家帶來幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/128819.html
吃豆人和削蘋果這兩個游戲想必大家都知道吧,本文運用Python里的Pygame控制模塊編寫出一個融合吃豆人+切水果的新手游:玩命吃蘋果,有興趣的話可以認識一下 引言 哈哈哈!木木子今天浮現——早已來給大家看了不少具體內容啦~ 涉及到的人工智能、新手、網絡爬蟲、數據統計分析(這一塊的通常但是審批)手機游戲... PS: 吃豆人我寫過了哈 Python+Pygame實戰之吃豆豆游戲的實...
摘要:先看看最后效果圖片的話是從網上小魚兒那個案例里面拿的,實現的功能如下是通過方向鍵操作烏龜,進行吃魚吃魚的時候根據烏龜的坐標和魚的進行檢測,在碰撞區域則干掉這條魚背景音樂和吃魚音樂的播放分數累積魚的平滑游動控制幀頻實現代碼導入一些常用的函數烏 先看看最后效果 圖片的話是從網上小魚兒那個案例里面拿的,實現的功能如下: 是通過方向鍵操作烏龜,進行吃魚 吃魚的時候根據烏龜的x,y坐標和魚的x...
摘要:那在屆有哪些被封神的庫呢,今天就給大家介紹十個堪稱殺手級別的工具包。該庫是在之上完善的,自此請求就變得異常的簡單,一行代碼即可搞定。這是最流行的網絡爬蟲框架庫,沒有之一。最好用的框架。圖像處理,該庫是你的不二之選。 文 |?豆豆 來源:Python 技術「ID: pythonall」 ...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:源碼分享主函數游戲初始化九歌播放背景音樂游戲主循環按鍵檢測更新貪吃蛇和食物判斷游戲是否結束顯示游戲里必要的元素屏幕更新普普通通玩法詳細介紹源碼點小游戲玩法通過加減乘除操作小學生都沒問題的。 大家好,我是辣條。 今天給大家帶來30個py小游戲,一定要收藏...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02