(飛機為迷你亞索,外星人為迷你小諾手,由於時間關係和圖片素材較難尋找,僅僅做了簡易版,沒有貼上背景圖片。由於篇幅原因,對於函式講解較為簡略,可以自行搜尋相應函式的用法)主要利用pygame內建庫進行圖形化處理
主要遊戲介面如下:
基礎操作:匯入pygame模組首先利用screen=pygame.display.set_mode()建立一個pygame遊戲視窗,引數為(width,height)然後使用pygame.display.set_caption(),引數為你想要設定的遊戲名的字串,例如:“飛機大戰”找到圖片素材,並將其繪製到螢幕上,在此需使用blit()函式將其繪製到視窗上,例如:之前的視窗為screen,則screen.blit(image,rect),其中image為需要繪製到螢幕上的影象,rect為繪製的位置的矩形,需要在之前透過pygame.Rect進行建立rect,並且設定好rect的位置。對於螢幕上的字型,在pygame中字型的顯示都是透過將字型轉換為圖形,然後用blit()函式繪製,首先設定字型font=pygame.font.Font(NONE,48),其中none指的是文字的字型,48指文字的大小,然後透過render函式進行轉換為圖形,例如,image=font.render(text,TRUE,font_color,bg_color),其中text是文字的內容,同樣是字串;TRUE指的是文字的鋸齒開關;font_color是文字顏色的RGB值,bg_color為繪製處的背景顏色的RGB值,然後將image透過blit繪製出來就可以設定主迴圈,對於遊戲的執行,剛才所設定的所有執行後只會出現一瞬間,所以必須要將其放在while TRUE:的主迴圈中不停迴圈才能維持遊戲介面關於爆炸效果的製作,任何看起來連續的圖片其實都是一幀幀圖片快速播放,因為人眼的視覺停留看起來才連續,所以對於爆炸效果,只需要在子彈與外星人發生碰撞時,在外星人的位置,以一定的速度依次繪製爆炸圖片就可以了; 爆炸圖片如下:以上是基礎操作主檔案程式碼如下:
import pygameimport sysfrom time import sleepfrom random import randintfrom settings import Settingsfrom ship_mod_blit import Shipfrom bullet import Bulletfrom alien import Alienfrom button import Buttonfrom bullet import Skillfrom game_information import Informationfrom bomp import Bompgame_state=0menu=0game=1over=2score=0randnum=1class Alienwar_game: def __init__(self): pygame.init() self.settings=Settings() self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height)) self.ship=Ship(self) self.button=Button(self,"start play") self.bullets=pygame.sprite.Group() self.aliens=pygame.sprite.Group() self.skills=pygame.sprite.Group() pygame.display.set_caption('諾克薩斯入侵') self.creat_alien() self.move=list() self.lives=self.settings.ship_lives self.information=Information(self) self.bomp=Bomp(self) self.clock=pygame.time.Clock() self.time=60 self.speed_x=self.settings.alien_speed self.speed_y=self.settings.alien_speed_y def creat_alien(self): available_space_x=self.settings.screen_width-2*40 avaliable_space_y=self.settings.screen_height-2*40 number_alien_x=available_space_x//80 for alien_number in range(number_alien_x): new_alien=Alien(self) new_alien.rect.x=randint(0,1000) new_alien.rect.y=randint(0,200) self.aliens.add(new_alien) def fire(self): if len(self.bullets)<self.settings.bullet_maxnum: new_bullet=Bullet(self) self.bullets.add(new_bullet) def fire_skill(self): newskill=Skill(self) self.skills.add(newskill) def event_check(self): global score global game_state for event in pygame.event.get(): if(event.type==pygame.QUIT): sys.exit() if(event.type==pygame.KEYDOWN): if(event.key==pygame.K_a or event.key==pygame.K_LEFT ): self.ship.lstate=1 if(event.key==pygame.K_d or event.key ==pygame.K_RIGHT): self.ship.rstate=1 if event.key==pygame.K_j: self.fire() if event.key==pygame.K_k: self.fire_skill() if(event.type==pygame.KEYUP): if(event.key==pygame.K_a or event.key==pygame.K_LEFT): self.ship.lstate=0 if(event.key==pygame.K_d or event.key==pygame.K_RIGHT): self.ship.rstate=0 if(event.type==pygame.MOUSEBUTTONDOWN): mouse_pos=pygame.mouse.get_pos() if game_state==2: if self.screen.get_rect().collidepoint(mouse_pos): game_state=menu score=0 elif game_state==0: if self.button.rect.collidepoint(mouse_pos): game_state = game self.lives=self.settings.ship_lives self.speed_y=self.settings.alien_speed_y self.speed_x=self.settings.alien_speed def run_game(self): global game_state global score global randnum count=0 count1=0 count2=0 while True: count2+=1 self.clock.tick(self.time) self.screen.fill(self.settings.bg_color) self.event_check() if game_state==menu: self.screen.blit(self.button.msg_image,self.button.rect) elif game_state==game: for number in range(self.lives): self.screen.blit(self.ship.image,pygame.Rect(number*40,0,40,40)) self.button.label1() i=0 if self.ship.rect.x>=self.settings.ship_speed: if self.ship.lstate == 1: self.ship.rect.x -= self.settings.ship_speed if self.ship.rect.x<=self.settings.screen_width-self.settings.ship_speed-40: if self.ship.rstate==1: self.ship.rect.x+=self.settings.ship_speed self.bullets.update() self.ship.blitme() for bullet in self.bullets.sprites(): bullet.drawit() if bullet.y<=0: self.bullets.remove(bullet) for skill in self.skills.sprites(): skill.skill_update() skill.blitit() if skill.rect.y<=0: self.skills.remove(skill) for num in range(len(self.aliens)): self.move.append(1) for alien in self.aliens.sprites(): if alien.rect.left==self.screen.get_rect().left or alien.rect.right==self.screen.get_rect().right: self.move[i]=-self.move[i] if alien.rect.right<self.screen.get_rect().right and alien.rect.left>self.screen.get_rect().left: if count2%50==0: randnum=randint(0,1) print(f"{randnum}") if randnum==0: self.move[i] = -self.move[i] alien.rect.x+=self.speed_x*self.move[i] alien.rect.y+=self.speed_y i+=1 if alien.rect.left<self.screen.get_rect().left: alien.rect.left=self.screen.get_rect().left if alien.rect.right>self.screen.get_rect().right: alien.rect.right=self.screen.get_rect().right if alien.rect.centery>=self.screen.get_rect().bottom: print("諾手打進你家了!!!") sleep(1.5) self.bullets.empty() self.aliens.empty() self.creat_alien() self.lives-=1 break for alien_self in self.aliens.sprites(): for bullet_self in self.bullets.sprites(): if pygame.sprite.collide_rect(alien_self,bullet_self): x=alien_self.rect.x y=alien_self.rect.y if pygame.sprite.collide_rect(alien_self,bullet_self) or count!=0 and count<=100: self.bomp.draw_image(x,y,count1%5) count+=1 if(count%20==0): count1+=1 if count>100: count=0 collision=pygame.sprite.groupcollide(self.bullets,self.aliens,True,True) collision2=pygame.sprite.groupcollide(self.skills,self.aliens,False,True) if collision: score+=self.settings.alien_score if collision2: score+=self.settings.alien_score*len(collision2.values()) self.information.draw_score('score: '+str(score)) self.screen.blit(self.information.score_image,self.information.score_image_rect) if not self.aliens: self.bullets.empty() self.skills.empty() self.creat_alien() self.speed_x+=0.5 if(score!=0 and score%10000==0): self.speed_y+=0.01 if pygame.sprite.spritecollideany(self.ship,self.aliens): print("亞索被諾手打死了 !!!") sleep(1.5) self.ship.rect.midbottom=self.screen.get_rect().midbottom self.bullets.empty() self.aliens.empty() self.creat_alien() self.lives-=1 if self.lives==0: game_state=over count2=0 self.aliens.draw(self.screen) elif game_state == over: self.button.label2() self.button.label3(str(score)) pygame.display.flip()if __name__=='__main__': ai_game=Alienwar_game() ai_game.run_game()
這只是主檔案的程式碼,由於程式碼匯入了其他檔案的函式,所以無法整成執行, 具體的操作可以透過程式碼來看,由於程式碼放在多個檔案中,不便全部複製貼上到這裡,以免導致程式碼無法執行,完整的程式碼及圖片素材都存放在GitHub或gitee碼雲上,想要看的朋友可以訪問,這是我的網址: