Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan python untuk melaksanakan permainan ular mudah

Cara menggunakan python untuk melaksanakan permainan ular mudah

WBOY
WBOYke hadapan
2023-05-11 19:37:192581semak imbas

Permainan "Ular" yang ditulis oleh pygame:

Cara menggunakan python untuk melaksanakan permainan ular mudah

Permainan "Ular" digunakan dalam pengaturcaraan yang mempelajari pengunjung yang kerap, kerana :

Mudah, elemen permainan yang paling asas hanya memerlukan dua ekor ular dan makanan. (Anda memerlukan tiga lagi elemen untuk melancap. Fikirkan apakah itu?) Bagi arah, anda hanya memerlukan empat arah tetap: atas, bawah, kiri dan kanan. Terdapat struktur data asas dan idea berorientasikan objek di dalamnya. Pembangunan permainan itu sendiri menggunakan banyak konsep berorientasikan objek, dan badan ular adalah struktur "senarai terpaut" semula jadi, yang sangat sesuai untuk mempraktikkan struktur data. Satu lagi perkara yang menarik ialah perkataan Python bermaksud python dalam bahasa Inggeris, dan Snake boleh dianggap sebagai "permainan dengan nama yang sama". Banyak sekolah mempunyai tugasan kursus pembangunan program yang merangkumi topik ular, dan pelajar sering bertanya kepada kami tentang kod yang berkaitan. (Telefon mudah alih Nokia juga mempunyai kelemahan untuk permainan ini.) Saya sebelum ini telah membuat versi Python "Perang Ular", dibangunkan berdasarkan cocos2d-python. Tetapi itu agak rumit untuk pemula.
Di sini kami memberikan pengenalan ringkas:
Kod ini dibangunkan berdasarkan pygame, jadi sila pastikan pygame telah berjaya dipasang dalam Python anda sebelum dijalankan. Kemudian jalankan game2.py terus dalam kod untuk memulakan permainan. Sebagai tambahan kepada kod akhir, kami juga menguraikan khas beberapa fail py dalam proses untuk rujukan oleh pelajar yang ingin membangunkan mereka sendiri.
Mari kita analisa dahulu perkara yang perlu diberi perhatian semasa menulis permainan ini.

1. Bagaimanakah ular itu mewakili?

Kita boleh membahagikan keseluruhan kawasan permainan kepada grid kecil, dan sekumpulan grid kecil yang disambungkan bersama membentuk "ular". menggunakan warna gelap untuk latar belakang dan warna terang untuk "ular".
Kita boleh menggunakan koordinat untuk mewakili setiap petak kecil, dan julat paksi-X dan paksi-Y boleh ditetapkan. Gunakan senarai untuk menyimpan koordinat "badan ular", maka "ular" akan keluar Akhirnya, ia hanya perlu dipaparkan dalam warna yang berbeza.

2. Bagaimana ular itu bergerak?

Reaksi pertama ialah menggerakkan setiap petak kecil ke hadapan seperti cacing tanah, tetapi ini sangat menyusahkan untuk dilaksanakan. Saya terperangkap di sini dari awal.
Bayangkan ular rakus yang telah kita mainkan Setiap kali "ular" itu bergerak, rasanya seluruh badan telah bergerak ke hadapan satu ruang Hapuskan "pergerakan" "ular" dalam fikiran anda, dan fikirkan dengan teliti sebelum dan selepas pergerakan, kedudukan "ular" telah berubah. Itu mudah, tambahkan koordinat grid seterusnya ke permulaan senarai dan alih keluar elemen terakhir senarai, yang bersamaan dengan ular yang bergerak ke hadapan satu grid.

3. Bagaimana untuk menentukan penghujung permainan?

Jika "ular" bergerak di luar skop kawasan permainan atau menyentuh dirinya sendiri, julat koordinat paksi telah ditentukan terlebih dahulu, dan mudah untuk menilai jika ia melebihi julat. Jadi bagaimana anda menilai apabila anda menghadapi diri sendiri?
Jika anda berfikir tentang gambar "ular" yang bergerak dalam fikiran anda, ia benar-benar sukar, tetapi dalam kod, "ular" kami adalah senarai, maka kami hanya perlu menentukan sama ada koordinat seterusnya grid sudah disertakan dalam Bukankah "ular" berada dalam senarai?
Dengan masalah ini diselesaikan, kita boleh mula mengekod.

Tentukan elemen permainan dan antara muka:

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

Inisialisasikan ular dan makanan:

 # 初始化蛇
    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()

Kod penuh:

"""
贪吃蛇小游戏
"""
import random
import sys
import time
import pygame
from pygame.locals import *
from collections import deque
SCREEN_WIDTH = 600
SCREEN_HEIGHT = 480
SIZE = 20
def 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&#39;速度: {score // 100}&#39;)
        print_text(screen, font1, 450, 7, f&#39;得分: {score}&#39;)
        pygame.display.update()
if __name__ == &#39;__main__&#39;:
    main()

Atas ialah kandungan terperinci Cara menggunakan python untuk melaksanakan permainan ular mudah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam