# 自己做遊戲 - 青蛙與蒼蠅 ###### tags: `自己玩` 想下載嗎? 點<font size = 5>[這裡](https://drive.google.com/file/d/1JMBF-OtdZoQ-YJ-oqVFh5-KK3M0Vh3xD/view?usp=sharing)</font>可以下載喔 ```python= import pygame import random import os pygame.init()#遊戲初始化 WIDTH = 550 HIGHT = 600 screen = pygame.display.set_mode((WIDTH,HIGHT))#視窗大小 寬度500高度600 pygame.display.set_caption("The War Between Frog & Fly")#更改視窗名字 clock = pygame.time.Clock()#可管理時間 picture = pygame.image.load(os.path.join("一堆圖","fuck.jpg")).convert() pygame.display.set_icon(picture)#更改視窗名字旁邊的圖案 background_img = pygame.image.load(os.path.join("一堆圖","S__79536158.jpg")).convert() #os.path 是檔案位置 一堆圖為資料夾名稱, 套套2.png為照片名稱 convert為將圖轉為pygame比較好讀的格式 bullet_img = pygame.image.load(os.path.join("一堆圖","messageImage_1627553551506.jpg")).convert() rock_img = pygame.image.load(os.path.join("一堆圖","messageImage_1627553997196.jpg")).convert() player_img = pygame.image.load(os.path.join("一堆圖","messageImage_1627553769436.jpg")).convert() font_name = pygame.font.match_font('arial')#引入字體 arial不支援中文 def draw_health(surf, hp,x,y):#畫東西的函示 (哪個平面, 內容,大小,x,y) if hp < 0 : hp = 0 BAR_LENGHT = 150 BAR_HIGHT = 10 fill= (hp /100)*BAR_LENGHT outline_rect = pygame.Rect(x,y,BAR_LENGHT,BAR_HIGHT)#化矩形 fill_rect = pygame.Rect(x,y,fill,BAR_HIGHT) pygame.draw.rect(surf, (124,252,0),fill_rect) pygame.draw.rect(surf, (255,255,255), outline_rect, 2)#(哪個平面,顏色,哪個東西,像素) (外框) def draw_text(surf, text, size ,x,y):#畫東西的函示 (哪個平面, 內容,大小,x,y) font = pygame.font.Font(font_name, size) text_surface = font.render(text, True, (0,0,205)) text_rect = text_surface.get_rect() text_rect.centerx = x text_rect.top = y surf.blit(text_surface, text_rect) def draw_text1(surf, text, size ,x,y):#畫東西的函示 (哪個平面, 內容,大小,x,y) font = pygame.font.Font(font_name, size) text_surface = font.render(text, True, (255,255,205)) text_rect = text_surface.get_rect() text_rect.centerx = x text_rect.top = y surf.blit(text_surface, text_rect) def draw_init(): draw_text1(screen, "Frog V.S. Fly",64,WIDTH/2,HIGHT/4) draw_text1(screen, "← → move the Frog ",22,WIDTH/2,HIGHT/2) draw_text1(screen, "press space shoot the tongue ~ ",22,WIDTH/2,HIGHT/2+50) draw_text1(screen, "press any fey for start the game",22,WIDTH/2,HIGHT*(3/4)) pygame.display.update() watting = True while watting: clock.tick(FPS)#1秒鐘之內最多只能執行 FPS 次 for event in pygame.event.get():#全部事件列出來 if event.type == pygame.QUIT:#如果按x讓視窗關閉 pygame.quit() return True elif event.type == pygame.KEYUP:#按下鍵盤建 (KEYUP 是按下再拿起案件才開始) watting = False return False class Player(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self)#運行Sprite初始化程序 self.image =pygame.transform.scale(player_img,(50,38))#更改圖大小 self.image.set_colorkey((0,0,0)) #把黑色變透明 self.rect = self.image.get_rect()#定位 把圖片框起來 self.rect.x = WIDTH/2 self.rect.bottom = HIGHT-10 #self 初始位置(250,底部為600-10) self.speedx = 8 self.health = 100 def update(self):#讓圖案跑動 key_pressed = pygame.key.get_pressed()#如果按鍵有被按回傳布林值True if key_pressed[pygame.K_RIGHT]: self.rect.x+= self.speedx if key_pressed[pygame.K_LEFT]: self.rect.x -= self.speedx if self.rect.right > WIDTH: self.rect.right = WIDTH if self.rect.left < 0: self.rect.left = 0 def shoot(self): bullet = Bullet(self.rect.centerx,self.rect.top) all_sprites.add(bullet) bullets.add(bullet) class Rock(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self)#運行Sprite初始化程序 self.image = rock_img self.image =pygame.transform.scale(rock_img,(35,35)) self.image.set_colorkey((255,255,255)) self.rect = self.image.get_rect()#定位 把圖片框起來 self.rect.x = random.randrange(0 , WIDTH - self.rect.width) self.rect.y = random.randrange(-50,-40) #上下動 self.speedy = random.randrange(2,8) self.speedx = random.randrange(-3,3)#左右跑 def update(self):#讓圖案跑動 self.rect.y += self.speedy self.rect.x += self.speedx if self.rect.top > HIGHT or self.rect.left > WIDTH or self.rect.right <0: self.rect.x = random.randrange(0 , WIDTH - self.rect.width) self.rect.y = random.randrange(-50,-40) self.speedy = random.randrange(2,8) self.speedx = random.randrange(-3,3) class Bullet(pygame.sprite.Sprite): def __init__(self, x, y): pygame.sprite.Sprite.__init__(self) self.image = bullet_img self.image.set_colorkey((0,0,0)) self.rect = self.image.get_rect()#定位 把圖片框起來 self.rect.centerx = x self.rect.bottom = y self.speedy = -10 def update(self):#讓圖案跑動 self.rect.y += self.speedy if self.rect.bottom < 0: self.kill()#把bullet從全部的sprite群組刪掉 all_sprites = pygame.sprite.Group() rocks = pygame.sprite.Group() bullets = pygame.sprite.Group()#創建sprit屬性的群駔 player = Player() all_sprites.add(player)#將player物件加入群組 rock = Rock() all_sprites.add(rock) for i in range(8):#創造很多個石頭 r = Rock() all_sprites.add(r) rocks.add(r) score = 0 FPS = 60 show_init = True running = True while running: if show_init: close = draw_init() if close: break draw_init() show_init = False clock.tick(FPS)#1秒鐘之內最多只能執行 FPS 次 for event in pygame.event.get():#全部事件列出來 if event.type == pygame.QUIT:#如果按x讓視窗關閉 running = False elif event.type == pygame.KEYDOWN:#按下鍵盤建 (KEYDOWN 是按下案件就開始) if event.key == pygame.K_SPACE: player.shoot() all_sprites.update()#執行所有update hits = pygame.sprite.groupcollide(rocks, bullets,True,True)#groupcollide可以判斷有沒有碰撞 第一個True 為刪除rocks for hit in hits:#因為hits會刪光石頭 所以要補新的石頭 score += 1 r = Rock() all_sprites.add(r) rocks.add(r) hits = pygame.sprite.spritecollide(player, rocks,True) #撞到要不要把石頭刪掉 for hit in hits: player.health -= 20 r = Rock() all_sprites.add(r) rocks.add(r) if player.health == 0: running = False screen.fill((255,193,193)) #底色設定 screen.blit(background_img,(-120,-350))#blit就是畫 (圖案,(位置)) all_sprites.draw(screen) #將物件放到畫面上 draw_text(screen, "score:"+str(score),25,WIDTH/2-20,10) draw_health(screen, player.health,5,20) pygame.display.update()#更新畫面 pygame.QUIT ``` ![](https://i.imgur.com/uBdVmHW.png) ![](https://i.imgur.com/MMpyslP.png)