進入cursor官方網頁(Cursor - The AI Code Editor)

建議可以先快速登入註冊

Pro版價格參考

下載並且安裝

快速登入

成功

知道幾個快速開始的快捷鍵

Ctrl+I : 電腦情境寫程式

Tab: 電腦幫你看蝦一步該寫啥

Ctrl+K: 電腦幫寫程式

語言設定(哪種自然語言進行情境開發)

介面介紹(基本上跟VSCode一樣,熟悉的就跳過)

AI輸入那個區域是核心(動口不動手的君子區)
安裝中文繁體包

安裝好後點選search

點選Show and Run Commands

輸入display

選擇configure........

點選繁中

按下重開......就會變成繁中了(看個人喜好各大語言任君選擇安裝與顯示........)
切換視窗(那些左下右的按鈕,按了就懂)

變更AI的模式

AI模式的比較

以Vibe Coding的精神來看,Agent是最符合的,當然最終要掏腰包。其他的就是協助本來就程式基礎的人去寫程式。
使用Agent模式,來個出一張嘴就完成任務的體驗:
關鍵詞建議寫英文比較準確,底下是一個小範例
用python寫一個windows桌面應用的程式,功能包括:
1. 復刻任天堂的1943-中途島海戰(1943: Battle of Midway)
2. 需要像原遊戲一樣24個關卡(如果我記錯請上網確定他的全部有多少關卡)
3. 利用鍵盤的W為上、D為右、S為下、A為左的動作控制。
4. 飛彈可以自動發射,可以透過鍵盤的空白鍵作為開關(也就是說切換後可以改成手動發射)
5. 手動發射飛彈按鈕為鍵盤的P鍵6. 普通攻擊為鍵盤的P鍵與Mega Crash為鍵盤的O鍵

第二輪輸入:
我們先試試看一關的簡易版,妳寫得出來我們再來討論寫出完整版本。

第三輪輸入:
移動鍵,發射按鈕,大絕招都沒有功能,請修正。

經過六輪修正後,完整程式碼如下:
import pygame
import sys
import random
# 遊戲參數
WIDTH, HEIGHT = 480, 640
FPS = 60
PLAYER_SPEED = 5
BULLET_SPEED = 10
ENEMY_SPEED = 2
ENEMY_SPAWN_RATE = 30 # 幀數
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("1943: Battle of Midway - 簡易版")
clock = pygame.time.Clock()
# 顏色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 128, 255)
BLACK = (0, 0, 0)
# 主角飛機
class Player(pygame.sprite.Sprite):
def __init__(self, *groups):
super().__init__(*groups)
try:
self.image = pygame.image.load("player.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (40, 40))
except Exception:
self.image = pygame.Surface((40, 40))
self.image.fill(BLUE)
pygame.draw.polygon(self.image, WHITE, [(20, 0), (0, 40), (40, 40)])
self.rect = self.image.get_rect(center=(WIDTH//2, HEIGHT-60))
self.speed = PLAYER_SPEED
self.auto_fire = True
self.last_shot = 0
self.shot_delay = 200 # 毫秒
self.max_hp = 100
self.hp = self.max_hp
def update(self, keys):
if keys[pygame.K_w] and self.rect.top > 0:
self.rect.y -= self.speed
if keys[pygame.K_s] and self.rect.bottom < HEIGHT:
self.rect.y += self.speed
if keys[pygame.K_a] and self.rect.left > 0:
self.rect.x -= self.speed
if keys[pygame.K_d] and self.rect.right < WIDTH:
self.rect.x += self.speed
def shoot(self):
now = pygame.time.get_ticks()
if now - self.last_shot > self.shot_delay:
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
self.last_shot = now
def hit(self, damage):
self.hp -= damage
if self.hp < 0:
self.hp = 0
# 子彈
class Bullet(pygame.sprite.Sprite):
def __init__(self, x, y):
super().__init__()
self.image = pygame.Surface((5, 15))
self.image.fill(WHITE)
self.rect = self.image.get_rect(center=(x, y))
def update(self):
self.rect.y -= BULLET_SPEED
if self.rect.bottom < 0:
self.kill()
# 敵方子彈
class EnemyBullet(pygame.sprite.Sprite):
def __init__(self, x, y, speed=5):
super().__init__()
self.image = pygame.Surface((5, 15), pygame.SRCALPHA)
self.image.fill((255, 255, 0, 200))
self.rect = self.image.get_rect(center=(x, y))
self.speed = speed
def update(self):
self.rect.y += self.speed
if self.rect.top > HEIGHT:
self.kill()
# 敵機
class Enemy(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
try:
self.image = pygame.image.load("enemy.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (30, 30))
except Exception:
self.image = pygame.Surface((30, 30))
self.image.fill(RED)
pygame.draw.rect(self.image, BLACK, (5, 5, 20, 20))
self.rect = self.image.get_rect(center=(random.randint(20, WIDTH-20), -20))
self.speed = ENEMY_SPEED
self.shoot_enable = random.random() < 0.3 # 30% 機率會發射
self.shoot_delay = random.randint(500, 2000) # 0.5~2秒
self.last_shot = pygame.time.get_ticks()
self.score = 1
def update(self):
self.rect.y += self.speed
if self.rect.top > HEIGHT:
self.kill()
# 隨機發射子彈
if self.shoot_enable:
now = pygame.time.get_ticks()
if now - self.last_shot > self.shoot_delay:
bullet = EnemyBullet(self.rect.centerx, self.rect.bottom, speed=random.randint(5, 10))
all_sprites.add(bullet)
enemy_bullets.add(bullet)
self.last_shot = now
self.shoot_delay = random.randint(500, 2000)
# 大型敵機
class BossEnemy(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
try:
self.image = pygame.image.load("boss.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (60, 60))
except Exception:
self.image = pygame.Surface((60, 60))
self.image.fill((200, 50, 50))
pygame.draw.rect(self.image, (0,0,0), (10, 10, 40, 40))
self.rect = self.image.get_rect(center=(random.randint(40, WIDTH-40), -30))
self.speed = ENEMY_SPEED // 2 + 1
self.max_hp = 100
self.hp = self.max_hp
self.shoot_delay = random.randint(400, 1200)
self.last_shot = pygame.time.get_ticks()
self.score = 5
def update(self):
self.rect.y += self.speed
if self.rect.top > HEIGHT:
self.kill()
# 發射子彈
now = pygame.time.get_ticks()
if now - self.last_shot > self.shoot_delay:
bullet = EnemyBullet(self.rect.centerx, self.rect.bottom, speed=random.randint(7, 12))
all_sprites.add(bullet)
enemy_bullets.add(bullet)
self.last_shot = now
self.shoot_delay = random.randint(400, 1200)
def hit(self, damage):
self.hp -= damage
if self.hp < 0:
self.hp = 0
# 超級敵機(追蹤玩家)
class SuperEnemy(pygame.sprite.Sprite):
def __init__(self, player):
super().__init__()
try:
self.image = pygame.image.load("super_enemy.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (70, 70))
except Exception:
self.image = pygame.Surface((70, 70))
self.image.fill((50, 50, 200))
pygame.draw.rect(self.image, (0,0,0), (15, 15, 40, 40))
self.rect = self.image.get_rect(center=(random.randint(60, WIDTH-60), -35))
self.speed = 3
self.max_hp = 200
self.hp = self.max_hp
self.player = player
self.shoot_delay = random.randint(300, 900)
self.last_shot = pygame.time.get_ticks()
self.score = 20
def update(self):
# 追蹤玩家
if self.player.rect.centerx > self.rect.centerx:
self.rect.x += self.speed
elif self.player.rect.centerx < self.rect.centerx:
self.rect.x -= self.speed
self.rect.y += self.speed
if self.rect.top > HEIGHT:
self.kill()
# 發射子彈
now = pygame.time.get_ticks()
if now - self.last_shot > self.shoot_delay:
bullet = EnemyBullet(self.rect.centerx, self.rect.bottom, speed=random.randint(8, 14))
all_sprites.add(bullet)
enemy_bullets.add(bullet)
self.last_shot = now
self.shoot_delay = random.randint(300, 900)
def hit(self, damage):
self.hp -= damage
if self.hp < 0:
self.hp = 0
# 補血包
class HealthPack(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
try:
self.image = pygame.image.load("health.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (25, 25))
except Exception:
self.image = pygame.Surface((25, 25), pygame.SRCALPHA)
pygame.draw.circle(self.image, (0,255,0), (12,12), 12)
pygame.draw.line(self.image, (255,255,255), (12,5), (12,19), 3)
pygame.draw.line(self.image, (255,255,255), (5,12), (19,12), 3)
self.rect = self.image.get_rect(center=(random.randint(20, WIDTH-20), -20))
self.speed = 2
def update(self):
self.rect.y += self.speed
if self.rect.top > HEIGHT:
self.kill()
# 大絕招補充包
class MegaPack(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
try:
self.image = pygame.image.load("megapack.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (25, 25))
except Exception:
self.image = pygame.Surface((25, 25), pygame.SRCALPHA)
pygame.draw.circle(self.image, (0,0,255), (12,12), 12)
pygame.draw.line(self.image, (255,255,255), (12,5), (12,19), 3)
pygame.draw.line(self.image, (255,255,255), (5,12), (19,12), 3)
self.rect = self.image.get_rect(center=(random.randint(20, WIDTH-20), -20))
self.speed = 2
def update(self):
self.rect.y += self.speed
if self.rect.top > HEIGHT:
self.kill()
# 大絕招炸彈
class MegaBomb(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
try:
self.image = pygame.image.load("megabomb.png").convert_alpha()
self.image = pygame.transform.scale(self.image, (30, 30))
except Exception:
self.image = pygame.Surface((30, 30), pygame.SRCALPHA)
pygame.draw.circle(self.image, (255,255,0), (15,15), 15)
pygame.draw.circle(self.image, (255,128,0), (15,15), 10)
self.rect = self.image.get_rect(center=(player.rect.centerx, player.rect.top-20))
self.speed = 8
self.explode_time = pygame.time.get_ticks() + random.randint(10, 1000) # 0.01~1秒
self.exploded = False
self.explosion_frame = 0
self.explosion_max_frame = 15
self.explosion_center = None
self.enemies_destroyed = 0
self.counted = False
def update(self):
if not self.exploded:
self.rect.y -= self.speed
now = pygame.time.get_ticks()
if now >= self.explode_time or self.rect.bottom < 0:
self.explode()
else:
# 爆炸動畫顯示幀
self.explosion_frame += 1
if self.explosion_frame > self.explosion_max_frame:
self.kill()
def explode(self):
self.exploded = True
self.explosion_center = self.rect.center
# 統計被毀滅的敵機數
destroyed = 0
for group in [enemies, bosses, super_enemies]:
destroyed += len(group)
for e in group:
e.kill()
for b in enemy_bullets:
b.kill()
self.enemies_destroyed = destroyed
# 變成爆炸動畫
self.image = pygame.Surface((120, 120), pygame.SRCALPHA)
pygame.draw.circle(self.image, (255,255,0,180), (60,60), 60)
pygame.draw.circle(self.image, (255,80,0,120), (60,60), 40)
self.rect = self.image.get_rect(center=self.explosion_center)
# 群組
all_sprites = pygame.sprite.Group()
bullets = pygame.sprite.Group()
enemies = pygame.sprite.Group()
bosses = pygame.sprite.Group()
super_enemies = pygame.sprite.Group()
enemy_bullets = pygame.sprite.Group()
healthpacks = pygame.sprite.Group()
megabombs = pygame.sprite.Group()
megapacks = pygame.sprite.Group()
player = Player(all_sprites)
# 遊戲狀態
score = 0
game_over = False
auto_fire = True
mega_crash_cooldown = 0
spawn_timer = 0
defeated_enemies = 0
healthpack_timer = 0
mega_bomb_count = 6
# 主要迴圈
def main():
global auto_fire, mega_crash_cooldown, spawn_timer, score, game_over, defeated_enemies, healthpack_timer, mega_bomb_count
megapack_timer = 0
while True:
clock.tick(FPS)
keys = pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
auto_fire = not auto_fire
player.auto_fire = auto_fire
if event.key == pygame.K_p and not auto_fire:
player.shoot()
if event.key == pygame.K_o and mega_crash_cooldown == 0 and mega_bomb_count > 0:
# 丟出大絕招炸彈
bomb = MegaBomb()
all_sprites.add(bomb)
megabombs.add(bomb)
mega_crash_cooldown = FPS * 2 # 2秒冷卻
mega_bomb_count -= 1
if not game_over:
player.update(keys)
if auto_fire:
player.shoot()
bullets.update()
enemies.update()
bosses.update()
super_enemies.update()
enemy_bullets.update()
healthpacks.update()
megabombs.update()
megapacks.update()
# MegaBomb 爆炸時計入毀滅敵機數
for bomb in list(megabombs):
if bomb.exploded and not bomb.counted:
defeated_enemies += bomb.enemies_destroyed
bomb.counted = True
# 產生敵機
spawn_timer += 1
if spawn_timer >= ENEMY_SPAWN_RATE:
# 10% 機率產生 BossEnemy
if random.random() < 0.1:
boss = BossEnemy()
all_sprites.add(boss)
bosses.add(boss)
else:
enemy = Enemy()
all_sprites.add(enemy)
enemies.add(enemy)
spawn_timer = 0
# 隨機產生補血包
healthpack_timer += 1
if healthpack_timer > random.randint(180, 600): # 約3~10秒
healthpack = HealthPack()
all_sprites.add(healthpack)
healthpacks.add(healthpack)
healthpack_timer = 0
# 隨機產生大絕招補充包
megapack_timer += 1
if megapack_timer > random.randint(600, 1800): # 約10~30秒
megapack = MegaPack()
all_sprites.add(megapack)
megapacks.add(megapack)
megapack_timer = 0
# 擊落100台敵機出現超級敵機
if defeated_enemies > 0 and defeated_enemies % 100 == 0 and not super_enemies:
super_enemy = SuperEnemy(player)
all_sprites.add(super_enemy)
super_enemies.add(super_enemy)
# 子彈擊中敵機
for group, is_boss, is_super in [(enemies, False, False), (bosses, True, False), (super_enemies, False, True)]:
hits = pygame.sprite.groupcollide(group, bullets, False, True)
for target, bullet_list in hits.items():
if is_boss or is_super:
target.hit(10 * len(bullet_list))
if target.hp <= 0:
target.kill()
if is_boss:
score_add = target.score
else:
score_add = target.score
score += score_add
defeated_enemies += 1
else:
target.kill()
score += target.score
defeated_enemies += 1
# 敵方子彈擊中玩家
hits = pygame.sprite.spritecollide(player, enemy_bullets, True)
for _ in hits:
player.hit(20)
# 補血包被玩家吃到
hits = pygame.sprite.spritecollide(player, healthpacks, True)
for _ in hits:
player.hp += 30
if player.hp > player.max_hp:
player.hp = player.max_hp
# 敵機/大型敵機/超級敵機碰到玩家
for group, damage in [(enemies, 30), (bosses, 50), (super_enemies, 100)]:
if pygame.sprite.spritecollide(player, group, True):
player.hit(damage)
# MegaPack 被玩家吃到
hits = pygame.sprite.spritecollide(player, megapacks, True)
if hits:
mega_bomb_count += len(hits)
if player.hp <= 0:
game_over = True
if mega_crash_cooldown > 0:
mega_crash_cooldown -= 1
# 畫面
screen.fill(BLACK)
all_sprites.draw(screen)
# 生命條
draw_bar(screen, player.hp, player.max_hp, WIDTH//2-100, 20, 200, 15, (0,255,0), (255,0,0))
draw_text(screen, f"分數: {score}", 24, WIDTH//2, 50)
draw_text(screen, f"自動發射: {'開' if auto_fire else '關'} (空白鍵切換)", 18, WIDTH//2, 80)
draw_text(screen, f"大絕招剩餘: {mega_bomb_count}", 18, WIDTH//2, 110)
# Boss 生命條
for boss in bosses:
draw_bar(screen, boss.hp, boss.max_hp, boss.rect.centerx-30, boss.rect.top-10, 60, 8, (255,128,0), (80,0,0))
for super_enemy in super_enemies:
draw_bar(screen, super_enemy.hp, super_enemy.max_hp, super_enemy.rect.centerx-35, super_enemy.rect.top-12, 70, 10, (0,255,255), (0,0,80))
if game_over:
draw_text(screen, "遊戲結束! 按ESC離開", 36, WIDTH//2, HEIGHT//2)
pygame.display.flip()
if game_over:
if keys[pygame.K_ESCAPE]:
pygame.quit()
sys.exit()
def draw_text(surf, text, size, x, y):
font = pygame.font.SysFont("msjh.ttc", size) if pygame.font.get_init() else pygame.font.Font(None, size)
text_surface = font.render(text, True, WHITE)
text_rect = text_surface.get_rect(center=(x, y))
surf.blit(text_surface, text_rect)
def draw_bar(surf, val, max_val, x, y, w, h, color, bg_color):
ratio = max(val, 0) / max_val
pygame.draw.rect(surf, bg_color, (x, y, w, h))
pygame.draw.rect(surf, color, (x, y, int(w*ratio), h))
pygame.draw.rect(surf, WHITE, (x, y, w, h), 2)
if __name__ == "__main__":
main()
請將副檔名命為.py,執行他就可以看到遊戲畫面。以上簡易的介紹,希望可以幫(bonnie)到你。自訂的遊戲美化例如health.png、megabomb.png等等等,所有的png都可以在自行加上去,強化整體效果。