[開始]cursor進行"情境式開發(Vibe Coding)"-篇之一

更新 發佈閱讀 47 分鐘

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

raw-image




建議可以先快速登入註冊

raw-image




Pro版價格參考

raw-image




下載並且安裝

raw-image




快速登入

raw-image

成功

raw-image




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

raw-image

Ctrl+I : 電腦情境寫程式

raw-image

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

raw-image

Ctrl+K: 電腦幫寫程式

raw-image




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

raw-image




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

AI輸入那個區域是核心(動口不動手的君子區)

AI輸入那個區域是核心(動口不動手的君子區)




安裝中文繁體包

raw-image

安裝好後點選search

raw-image

點選Show and Run Commands

raw-image

輸入display

raw-image

選擇configure........

raw-image

點選繁中

raw-image

按下重開......就會變成繁中了(看個人喜好各大語言任君選擇安裝與顯示........)




切換視窗(那些左下右的按鈕,按了就懂)

raw-image



變更AI的模式

raw-image

AI模式的比較

raw-image

以Vibe Coding的精神來看,Agent是最符合的,當然最終要掏腰包。其他的就是協助本來就程式基礎的人去寫程式。


使用Agent模式,來個出一張嘴就完成任務的體驗:
關鍵詞建議寫英文比較準確,底下是一個小範例


用python寫一個windows桌面應用的程式,功能包括:
1. 復刻任天堂的1943-中途島海戰(1943: Battle of Midway)
2. 需要像原遊戲一樣24個關卡(如果我記錯請上網確定他的全部有多少關卡)
3. 利用鍵盤的W為上、D為右、S為下、A為左的動作控制。
4. 飛彈可以自動發射,可以透過鍵盤的空白鍵作為開關(也就是說切換後可以改成手動發射)
5. 手動發射飛彈按鈕為鍵盤的P6. 普通攻擊為鍵盤的P鍵與Mega Crash為鍵盤的O
raw-image


第二輪輸入:

我們先試試看一關的簡易版,妳寫得出來我們再來討論寫出完整版本。
raw-image

第三輪輸入:

移動鍵,發射按鈕,大絕招都沒有功能,請修正。
raw-image

經過六輪修正後,完整程式碼如下:

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都可以在自行加上去,強化整體效果。


留言
avatar-img
留言分享你的想法!
avatar-img
iBonnie_愛邦尼
9會員
86內容數
記錄生活與技術的小細節
你可能也想看
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
在小小的租屋房間裡,透過蝦皮購物平臺採購各種黏土、模型、美甲材料等創作素材,打造專屬黏土小宇宙的療癒過程。文中分享多個蝦皮挖寶地圖,並推薦蝦皮分潤計畫。
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
小蝸和小豬因購物習慣不同常起衝突,直到發現蝦皮分潤計畫,讓小豬的購物愛好產生價值,也讓小蝸開始欣賞另一半的興趣。想增加收入或改善伴侶間的購物觀念差異?讓蝦皮分潤計畫成為你們的神隊友吧!
Thumbnail
這篇內容,將會講解什麼是表達式(Expression),什麼是陳述式(Statement)。有了這些概念,各位會更容易理解,要如何設計程式碼。
Thumbnail
這篇內容,將會講解什麼是表達式(Expression),什麼是陳述式(Statement)。有了這些概念,各位會更容易理解,要如何設計程式碼。
Thumbnail
程式設計與技術能力 在現代社會中的重要性越來越明顯,尤其是在人工智能(AI)和自動化技術迅速發展的背景下。理解編程語言,如Python、R等,以及熟悉相關技術架構和工具,能夠幫助個人在這樣的環境中更好地工作。這種能力不僅對技術專業人士至關重要,也對非技術領域的人士日益重要,因為基礎的程式設計知識已
Thumbnail
程式設計與技術能力 在現代社會中的重要性越來越明顯,尤其是在人工智能(AI)和自動化技術迅速發展的背景下。理解編程語言,如Python、R等,以及熟悉相關技術架構和工具,能夠幫助個人在這樣的環境中更好地工作。這種能力不僅對技術專業人士至關重要,也對非技術領域的人士日益重要,因為基礎的程式設計知識已
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
打開 jupyter notebook 寫一段 python 程式,可以完成五花八門的工作,這是玩程式最簡便的方式,其中可以獲得很多快樂,在現今這種資訊發達的時代,幾乎沒有門檻,只要願意,人人可享用。 下一步,希望程式可以隨時待命聽我吩咐,不想每次都要開電腦,啟動開發環境,只為完成一個重複性高
Thumbnail
這篇內容,將簡單介紹Asset Browser、Workspace、Inspector、Code Browser,作為入門的介面導覽。
Thumbnail
這篇內容,將簡單介紹Asset Browser、Workspace、Inspector、Code Browser,作為入門的介面導覽。
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
因為最近想嘗試編碼風格,於是就選了一套比較"不嚴格"的輔助工具來摸索。 編輯器 VS CODE 框架 VUE3 打包工具 VITE 編碼風格 Standard 環境 version { "nodejs":"v18.18.0", "npm":"9.8.1" }
Thumbnail
這篇文章分享如何透過免費電子郵件課程提供價值,建立信任,並引導訂閱者購買付費產品。透過豐富內容、獨特風格,以及AI的幫助,讓你的需求看起來更具吸引力。
Thumbnail
這篇文章分享如何透過免費電子郵件課程提供價值,建立信任,並引導訂閱者購買付費產品。透過豐富內容、獨特風格,以及AI的幫助,讓你的需求看起來更具吸引力。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News