# 自己做遊戲 - 青蛙與蒼蠅
###### 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
```

