# 進階程式設計 期末 Project ### (1/3、1/8、1/10 present ) 1.小組成員 : 班級208座號7姓名林琮旂 班級208座號14姓名黃莨期 2.設計理念: 小時候有玩過雷霆戰機的經驗,加上這次老師教的程式碼,可以運用在類似的射擊遊戲上,於是就想復刻童年回憶。 3.遊戲說明 我們的遊戲為操空一台穿梭在太空中的飛行器,在前進的途中需要時刻注意從上方飛來的隕石,並使用上下左右鍵來控制飛機移動,藉此躲避隕石,此外飛機頂部也會發射出雷射光將隕石粉碎,亦可利用這個方式來讓自己存活。 4.遊戲目標: 採擊殺積分制,殺越多得分越高。 5.遊戲方式: 三條命,擊殺一名敵人得十分,殺越多得越多,分數高者勝。 6.開發時遭遇的困難(實例): 要將很多種程式碼結合,放錯位置就會沒辦法動 本來是要設計成讓子彈按按鍵才開始射擊,但由於時間不足的緣故,只好放棄。 7.透過什麼方式解決(實例): 上網查資料、詢問老師、查看之前上課時的筆記、詢問AI 8.工作分配: a:林琮旂 遊戲開發(75%)、遊戲架構 b:黃莨期 遊戲開發(25%)、圖片整理、簡報製作 # 程式碼 ```python import pygame import random import time pygame.init() WIDTH, HEIGHT = 800, 600 font = pygame.font.SysFont(None, 40) #創建字型系統 class Fighter(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((50, 50)) self.image.fill((255, 255, 255)) self.rect = self.image.get_rect() self.rect.center = (WIDTH // 2, HEIGHT // 2) self.speed = 8 self.lives = 3 def update(self): keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and self.rect.left > 0: self.rect.x -= self.speed if keys[pygame.K_RIGHT] and self.rect.right < WIDTH: self.rect.x += self.speed if keys[pygame.K_UP] and self.rect.top > 0: self.rect.y -= self.speed if keys[pygame.K_DOWN] and self.rect.bottom < HEIGHT: self.rect.y += self.speed class Bullet(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.Surface((10, 30)) self.image.fill((255, 255, 255)) self.rect = self.image.get_rect() self.rect.centerx = x self.rect.bottom = y self.speed = -15 def update(self): self.rect.y += self.speed if self.rect.bottom < 0: self.kill() class Enemy(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((50, 50)) self.image.fill((255, 0, 0)) self.rect = self.image.get_rect() self.rect.x = random.randint(0, WIDTH - 50) self.rect.y = 0 self.speed = random.randint(3, 7) def update(self): self.rect.y += self.speed if self.rect.top > HEIGHT: self.rect.x = random.randint(0, WIDTH - 50) self.rect.y = 0 self.speed = random.randint(3, 7) def restart_game(player, enemies, bullets, all_sprites, score): player.lives = 3 enemies.empty() #清空敵人 bullets.empty() #清空子彈 all_sprites.empty() all_sprites.add(player) score = 0 return player, enemies, bullets, all_sprites, score def show_game_over_screen(): screen.fill((0, 0, 0)) game_over_text = font.render("Game Over", True, (255, 255, 255)) score_text = font.render(f"Score: {score}", True, (255, 255, 255)) # 創建兩個文字 Surface,分別為 "Game Over" 和 "Score: {score}"。 screen.blit(game_over_text, (WIDTH // 2 - 100, HEIGHT // 2 - 50)) screen.blit(score_text, (WIDTH // 2 - 60, HEIGHT // 2)) pygame.display.flip() time.sleep(5) #停留五秒 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("戰鬥機射擊遊戲") player = Fighter() all_sprites = pygame.sprite.Group() all_sprites.add(player) bullets = pygame.sprite.Group() enemies = pygame.sprite.Group() score = 0 clock = pygame.time.Clock() bullet_timer = pygame.time.get_ticks()#子彈發射頻率 running = True game_over = False while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN and event.key == pygame.K_r and game_over:#pygame.KEYDOWN按下按鍵pygame.K_r 按R鍵 player, enemies, bullets, all_sprites, score = restart_game(player, enemies, bullets, all_sprites, score)#restart_game設定為初始狀態 game_over = False game_over = False now = pygame.time.get_ticks() #獲取當時的時間 if now - bullet_timer > 200: bullet_timer = now bullet1 = Bullet(player.rect.centerx, player.rect.top) bullet2 = Bullet(player.rect.centerx - 15, player.rect.top) bullet3 = Bullet(player.rect.centerx + 15, player.rect.top) all_sprites.add(bullet1, bullet2, bullet3) bullets.add(bullet1, bullet2, bullet3) if random.randint(0, 100) < 2: enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy) all_sprites.update() hits = pygame.sprite.groupcollide(bullets, enemies, True, True)#碰撞偵測 for bullet, enemy_list in hits.items(): for enemy in enemy_list: score += 10 if not enemies: pass hits = pygame.sprite.spritecollide(player, enemies, False) for hit in hits: player.lives -= 1 hit.kill() if player.lives == 0: show_game_over_screen() game_over = True screen.fill((0, 0, 0)) # 黑色 all_sprites.draw(screen) enemies.draw(screen) score_text = font.render(f"Score: {score}", True, (255, 255, 255)) # 白色 screen.blit(score_text, (10, 10)) lives_text = font.render(f"Lives: {player.lives}", True, (255, 255, 255)) # 白色 screen.blit(lives_text, (WIDTH - 100, 10)) if game_over: game_over_text = font.render("Press 'R' to Restart", True, (255, 255, 255)) # 白色 screen.blit(game_over_text, (WIDTH // 2 - 120, HEIGHT // 2 + 50)) pygame.display.flip() clock.tick(60) pygame.quit() ```