Python:遊戲:貪吃蛇(附源碼)

來源:互聯網
上載者:User

標籤:初始   src   splay   遊戲   方向   cal   span   foo   ret   

貪吃蛇是個非常簡單的遊戲,適合練手。

首先分析一下這個遊戲

1、蛇怎麼畫?

蛇是由一個個小方塊組成的,那麼我們可以用一個 list 記錄每一個小方塊的座標,顯示的時候將所有小方塊畫出來即可。

2、蛇怎麼移動?

第一反應就是想蚯蚓蠕動一樣,每一個方塊向前移動一格,但這樣做很麻煩,仔細想下,其實除了頭尾,蛇的其他部分根本就沒有動過,那就簡單了,將下一格的座標添加到 list 開頭,並移除 list 的最後一個元素,就相當於蛇向前移動了一格。

3、如何判定遊戲結束?

蛇移動超出了遊戲區的範圍或者碰到了自己就算輸了,超出範圍很容易判斷,碰到自己也容易,只要判斷下一格的座標是否已經包含在蛇的 list 中就可以了。

 

理清了這些問題,我們就可以開始編碼了。

先看一下我的遊戲

 

本例中,斷行符號鍵:開始遊戲,空格鍵:暫停 / 繼續,方向鍵 或 WSAD 鍵:控制移動方向。

每吃一個食物加10分,每增加100分速度加快一級,沒有設定關卡,我玩到1100分,速度太快了,然後就 GAME OVER 了

"""貪吃蛇"""import randomimport sysimport timeimport pygamefrom pygame.locals import *from collections import dequeSCREEN_WIDTH = 600SCREEN_HEIGHT = 480SIZE = 20def print_text(screen, font, x, y, text, fcolor=(255, 255, 255)):    imgText = font.render(text, True, fcolor)    screen.blit(imgText, (x, y))def main():    pygame.init()    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))    pygame.display.set_caption(‘貪吃蛇‘)    light = (100, 100, 100)  # 蛇的顏色    dark = (200, 200, 200)   # 食物顏色    font1 = pygame.font.SysFont(‘SimHei‘, 24)  # 得分的字型    font2 = pygame.font.Font(None, 72)  # GAME OVER 的字型    red = (200, 30, 30)                 # GAME OVER 的字型顏色    fwidth, fheight = font2.size(‘GAME OVER‘)    line_width = 1                      # 網格線寬度    black = (0, 0, 0)                   # 網格線顏色    bgcolor = (40, 40, 60)              # 背景色    # 方向,起始向右    pos_x = 1    pos_y = 0    # 如果蛇正在向右移動,那麼快速點擊向下向左,由於程式重新整理沒那麼快,向下事件會被向左覆蓋掉,導致蛇後退,直接GAME OVER    # b 變數就是用於防止這種情況的發生    b = True    # 範圍    scope_x = (0, SCREEN_WIDTH // SIZE - 1)    scope_y = (2, SCREEN_HEIGHT // SIZE - 1)    # 蛇    snake = deque()    # 食物    food_x = 0    food_y = 0    # 初始化蛇    def _init_snake():        nonlocal snake        snake.clear()        snake.append((2, scope_y[0]))        snake.append((1, scope_y[0]))        snake.append((0, scope_y[0]))    # 食物    def _create_food():        nonlocal food_x, food_y        food_x = random.randint(scope_x[0], scope_x[1])        food_y = random.randint(scope_y[0], scope_y[1])        while (food_x, food_y) in snake:            # 為了防止食物出到蛇身上            food_x = random.randint(scope_x[0], scope_x[1])            food_y = random.randint(scope_y[0], scope_y[1])    _init_snake()    _create_food()    game_over = True    start = False       # 是否開始,當start = True,game_over = True 時,才顯示 GAME OVER    score = 0           # 得分    orispeed = 0.5      # 原始速度    speed = orispeed    last_move_time = None    pause = False       # 暫停    while True:        for event in pygame.event.get():            if event.type == QUIT:                sys.exit()            elif event.type == KEYDOWN:                if event.key == K_RETURN:                    if game_over:                        start = True                        game_over = False                        b = True                        _init_snake()                        _create_food()                        pos_x = 1                        pos_y = 0                        # 得分                        score = 0                        last_move_time = time.time()                elif event.key == K_SPACE:                    if not game_over:                        pause = not pause                elif event.key in (K_w, K_UP):                    # 這個判斷是為了防止蛇向上移時按了向下鍵,導致直接 GAME OVER                    if b and not pos_y:                        pos_x = 0                        pos_y = -1                        b = False                elif event.key in (K_s, K_DOWN):                    if b and not pos_y:                        pos_x = 0                        pos_y = 1                        b = False                elif event.key in (K_a, K_LEFT):                    if b and not pos_x:                        pos_x = -1                        pos_y = 0                        b = False                elif event.key in (K_d, K_RIGHT):                    if b and not pos_x:                        pos_x = 1                        pos_y = 0                        b = False        # 填充背景色        screen.fill(bgcolor)        # 畫網格線 豎線        for x in range(SIZE, SCREEN_WIDTH, SIZE):            pygame.draw.line(screen, black, (x, scope_y[0] * SIZE), (x, SCREEN_HEIGHT), line_width)        # 畫網格線 橫線        for y in range(scope_y[0] * SIZE, SCREEN_HEIGHT, SIZE):            pygame.draw.line(screen, black, (0, y), (SCREEN_WIDTH, y), line_width)        if game_over:            if start:                print_text(screen, font2, (SCREEN_WIDTH - fwidth)//2, (SCREEN_HEIGHT - fheight)//2, ‘GAME OVER‘, red)        else:            curTime = time.time()            if curTime - last_move_time > speed:                if not pause:                    b = True                    last_move_time = curTime                    next_s = (snake[0][0] + pos_x, snake[0][1] + pos_y)                    if next_s[0] == food_x and next_s[1] == food_y:                        # 吃到了食物                        _create_food()                        snake.appendleft(next_s)                        score += 10                        speed = orispeed - 0.03 * (score // 100)                    else:                        if scope_x[0] <= next_s[0] <= scope_x[1] and scope_y[0] <= next_s[1] <= scope_y[1]                                 and next_s not in snake:                            snake.appendleft(next_s)                            snake.pop()                        else:                            game_over = True        # 畫食物        if not game_over:            # 避免 GAME OVER 的時候把 GAME OVER 的字給遮住了            pygame.draw.rect(screen, light, (food_x * SIZE, food_y * SIZE, SIZE, SIZE), 0)        # 畫蛇        for s in snake:            pygame.draw.rect(screen, dark, (s[0] * SIZE + line_width, s[1] * SIZE + line_width,                                            SIZE - line_width * 2, SIZE - line_width * 2), 0)        print_text(screen, font1, 30, 7, f‘速度: {score//100}‘)        print_text(screen, font1, 450, 7, f‘得分: {score}‘)        pygame.display.update()if __name__ == ‘__main__‘:    main()

 

Python:遊戲:貪吃蛇(附源碼)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.