-- coding: utf-8 --
import pygame
import random
import sys
1. 初始化 Pygame
pygame.init()
視窗大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("VIP Games: AI 機械人保衛戰")
顏色定義
WHITE = (255, 255, 255)
BLACK = (15, 15, 25)
GOLD = (255, 215, 0) # VIP 的尊貴金色
RED = (255, 50, 50) # AI 機械人的危險紅色
BLUE = (50, 150, 255) # 保鏢/玩家的科技藍色
LASER_COLOR = (0, 255, 200) # 雷射子彈顏色
幀率控制
clock = pygame.time.Clock()
FPS = 60
2. 遊戲角色設定
玩家 (保鏢)
player_width = 40
player_height = 40
player_x = SCREEN_WIDTH // 2
player_y = SCREEN_HEIGHT - 80
player_speed = 6
VIP (目標:需要保護的人)
vip_width = 50
vip_height = 50
vip_x = SCREEN_WIDTH // 2 - vip_width // 2
vip_y = SCREEN_HEIGHT - 150 # VIP 待在後方
vip_hp = 100
子彈列表
bullets = []
bullet_speed = 8
bullet_radius = 5
AI 機械人 (敵人) 列表
enemies = []
enemy_width = 35
enemy_height = 35
enemy_speed_min = 2
enemy_speed_max = 4
spawn_counter = 0
spawn_rate = 30 # 每30幀(約0.5秒)有機會生一隻
分數
score = 0
使用系統預設字型
pygame.font.init()
font = pygame.font.SysFont("arial", 26)
over_font = pygame.font.SysFont("arial", 50)
def draw_text(text, font, color, surface, x, y):
textobj = font.render(text, 1, color)
textrect = textobj.get_rect()
textrect.topleft = (x, y)
surface.blit(textobj, textrect)
3. 遊戲主循環
running = True
game_over = False
while running:
# 背景
screen.fill(BLACK)
# 處理事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
pygame.quit()
sys.exit()
# 按空白鍵射擊雷射
if event.type == pygame.KEYDOWN and not game_over:
if event.key == pygame.K_SPACE:
# 子彈從玩家頭頂射出
bullets.append([player_x + player_width // 2, player_y])
if not game_over:
# 鍵盤操控玩家移動
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and player_x > 0:
player_x -= player_speed
if keys[pygame.K_RIGHT] and player_x < SCREEN_WIDTH - player_width:
player_x += player_speed
if keys[pygame.K_UP] and player_y > SCREEN_HEIGHT // 2: # 限制玩家只能在下半部移動
player_y -= player_speed
if keys[pygame.K_DOWN] and player_y < SCREEN_HEIGHT - player_height:
player_y += player_speed
# AI 機械人生成邏輯
spawn_counter += 1
if spawn_counter >= spawn_rate:
spawn_counter = 0
# 隨機在頂部不同位置出生
enemy_x = random.randint(0, SCREEN_WIDTH - enemy_width)
enemy_y = -enemy_height
enemy_speed = random.uniform(enemy_speed_min, enemy_speed_max)
enemies.append([enemy_x, enemy_y, enemy_speed])
# 隨著分數增加,難度慢慢提升
if score > 0 and score % 10 == 0 and spawn_rate > 15:
spawn_rate -= 1
# 更新子彈位置
for bullet in bullets[:]:
bullet[1] -= bullet_speed
if bullet[1] < 0:
bullets.remove(bullet)
# 更新機械人位置
for enemy in enemies[:]:
enemy[1] += enemy[2] # 往下移動
# 建立機械人的碰撞矩形
enemy_rect = pygame.Rect(enemy[0], enemy[1], enemy_width, enemy_height)
# 檢查機械人有沒有撞到 VIP
vip_rect = pygame.Rect(vip_x, vip_y, vip_width, vip_height)
if enemy_rect.colliderect(vip_rect):
vip_hp -= 20
if vip_hp <= 0:
vip_hp = 0
game_over = True
enemies.remove(enemy)
continue
# 檢查機械人有沒有撞到玩家 (保鏢)
player_rect = pygame.Rect(player_x, player_y, player_width, player_height)
if enemy_rect.colliderect(player_rect):
# 撞到保鏢,機械人被摧毀
score += 1
enemies.remove(enemy)
continue
# 如果機械人掉出螢幕底,代表防線失守,VIP 也會扣血
if enemy[1] > SCREEN_HEIGHT:
vip_hp -= 10
if vip_hp <= 0:
vip_hp = 0
game_over = True
enemies.remove(enemy)
# 碰撞檢測:子彈打中機械人
for bullet in bullets[:]:
bullet_rect = pygame.Rect(bullet[0] - bullet_radius, bullet[1] - bullet_radius, bullet_radius * 2, bullet_radius * 2)
for enemy in enemies[:]:
enemy_rect = pygame.Rect(enemy[0], enemy[1], enemy_width, enemy_height)
if bullet_rect.colliderect(enemy_rect):
# 命中!移除子彈同機械人,加分
if bullet in bullets:
bullets.remove(bullet)
enemies.remove(enemy)
score += 1
break
# 4. 繪製畫面上所有物件
# 畫 VIP (金色寶箱/盾牌形狀的保護目標)
pygame.draw.rect(screen, GOLD, (vip_x, vip_y, vip_width, vip_height), border_radius=10)
# 畫 VIP 內核
pygame.draw.rect(screen, WHITE, (vip_x + 15, vip_y + 15, 20, 20))
# 畫玩家 (藍色保鏢)
pygame.draw.rect(screen, BLUE, (player_x, player_y, player_width, player_height), border_radius=5)
# 畫子彈
for bullet in bullets:
pygame.draw.circle(screen, LASER_COLOR, (bullet[0], bullet[1]), bullet_radius)
# 畫 AI 機械人 (紅色方塊)
for enemy in enemies:
pygame.draw.rect(screen, RED, (enemy[0], enemy[1], enemy_width, enemy_height), border_radius=3)
pygame.draw.rect(screen, BLACK, (enemy[0] + 10, enemy[1] + 10, enemy_width - 20, 5)) # 機械人眼睛
# 顯示 UI 資訊
draw_text(f"SCORE: {score}", font, WHITE, screen, 20, 20)
draw_text(f"VIP HP: {vip_hp}%", font, GOLD, screen, 20, 55)
# 畫一條防線提示
pygame.draw.line(screen, (50, 50, 50), (0, vip_y + vip_height + 20), (SCREEN_WIDTH, vip_y + vip_height + 20), 2)
# 如果 Game Over 顯示結束畫面
if game_over:
draw_text("GAME OVER", over_font, RED, screen, SCREEN_WIDTH // 2 - 140, SCREEN_HEIGHT // 2 - 50)
draw_text("VIP Has Been Destroyed!", font, WHITE, screen, SCREEN_WIDTH // 2 - 130, SCREEN_HEIGHT // 2 + 10)
draw_text("Press ESC to Quit", font, GOLD, screen, SCREEN_WIDTH // 2 - 90, SCREEN_HEIGHT // 2 + 50)
keys = pygame.key.get_pressed()
if keys[pygame.K_ESCAPE]:
running = False
# 更新螢幕
pygame.display.flip()
clock.tick(FPS)
-- coding: utf-8 --
import pygame
import random
import sys
1. 初始化 Pygame
pygame.init()
視窗大小
SCREEN_WIDTH = 800
SCREEN_HEIGHT = 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption("VIP Games: AI 機械人保衛戰")
顏色定義
WHITE = (255, 255, 255)
BLACK = (15, 15, 25)
GOLD = (255, 215, 0) # VIP 的尊貴金色
RED = (255, 50, 50) # AI 機械人的危險紅色
BLUE = (50, 150, 255) # 保鏢/玩家的科技藍色
LASER_COLOR = (0, 255, 200) # 雷射子彈顏色
幀率控制
clock = pygame.time.Clock()
FPS = 60
2. 遊戲角色設定
玩家 (保鏢)
player_width = 40
player_height = 40
player_x = SCREEN_WIDTH // 2
player_y = SCREEN_HEIGHT - 80
player_speed = 6
VIP (目標:需要保護的人)
vip_width = 50
vip_height = 50
vip_x = SCREEN_WIDTH // 2 - vip_width // 2
vip_y = SCREEN_HEIGHT - 150 # VIP 待在後方
vip_hp = 100
子彈列表
bullets = []
bullet_speed = 8
bullet_radius = 5
AI 機械人 (敵人) 列表
enemies = []
enemy_width = 35
enemy_height = 35
enemy_speed_min = 2
enemy_speed_max = 4
spawn_counter = 0
spawn_rate = 30 # 每30幀(約0.5秒)有機會生一隻
分數
score = 0
使用系統預設字型
pygame.font.init()
font = pygame.font.SysFont("arial", 26)
over_font = pygame.font.SysFont("arial", 50)
def draw_text(text, font, color, surface, x, y):
textobj = font.render(text, 1, color)
textrect = textobj.get_rect()
textrect.topleft = (x, y)
surface.blit(textobj, textrect)
3. 遊戲主循環
running = True
game_over = False
while running:
# 背景
screen.fill(BLACK)