>  기사  >  백엔드 개발  >  Python을 사용하여 간단한 뱀 게임을 구현하는 방법

Python을 사용하여 간단한 뱀 게임을 구현하는 방법

WBOY
WBOY앞으로
2023-05-11 19:37:192584검색

pygame이 제작한 "Snake" 미니 게임:

Python을 사용하여 간단한 뱀 게임을 구현하는 방법

"Snake"는 프로그래밍 학습에서 자주 방문하는 이유는 다음과 같습니다.

간단함, 가장 기본적인 게임 요소는 뱀 두 마리만 있으면 됩니다. 그리고 계속할 음식. (자위를 하려면 세 가지 요소가 더 필요합니다. 그것이 무엇인지 생각해 보세요.) 방향은 고정된 방향인 위, 아래, 왼쪽, 오른쪽 네 가지만 있으면 됩니다. 기본적인 데이터 구조와 객체지향 아이디어가 담겨있습니다. 게임 개발 자체는 객체지향 개념을 많이 사용하는데, 뱀의 몸은 자연스러운 '연결 리스트' 구조이므로 데이터 구조를 연습하는 데 매우 적합하다. 또 다른 흥미로운 점은 Python이라는 단어가 영어로 Python을 의미하며 Snake는 "동명의 게임"이라고 볼 수 있다는 점입니다. 많은 학교에는 뱀 주제를 포함하는 프로그램 개발 과정 과제가 있으며 학생들은 종종 관련 코드에 대해 질문합니다. (Nokia 휴대폰도 이 게임에 애착을 갖고 있습니다.) 저는 이전에 cocos2d-python을 기반으로 개발된 "Snake Fight"의 Python 버전을 만든 적이 있습니다. 하지만 초보자에게는 다소 복잡합니다.
여기서 간략한 소개를 하겠습니다:
이 코드는 pygame을 기반으로 개발되었으므로 실행하기 전에 pygame이 Python에 성공적으로 설치되었는지 확인하세요. 그런 다음 코드에서 game2.py를 직접 실행하여 게임을 시작합니다. 최종 코드 외에도 자신만의 코드를 개발하려는 학생들이 참조할 수 있도록 프로세스에서 여러 py 파일을 특별히 분해했습니다.
먼저 이 게임을 작성할 때 주의해야 할 점을 분석해 보겠습니다.

1. 뱀은 어떻게 표현되나요?

게임 영역 전체를 작은 그리드로 나눌 수 있습니다. 연결된 작은 그리드의 그룹은 다양한 색상을 사용하여 표현할 수 있습니다. 위 그림과 같이 배경을 표현하기 위해 어두운 색상을 사용합니다. , 밝은 색상은 "뱀"을 의미합니다.
좌표를 이용하여 각각의 작은 사각형을 표현할 수 있고, X축과 Y축의 범위를 설정할 수 있습니다. 목록을 사용하여 "뱀 몸체"의 좌표를 저장하면 "뱀"이 나올 것입니다. 마지막으로 다른 색상으로 표시하기만 하면 됩니다.

2. 뱀은 어떻게 움직이나요?

첫 번째 반응은 지렁이처럼 작은 사각형 하나하나를 앞으로 이동시키는 것인데, 구현하기가 매우 번거롭습니다. 나는 처음부터 여기에 갇혀 있었다.
우리가 연기한 탐욕스러운 뱀을 상상해 보세요. "뱀"이 움직일 때마다 몸 전체가 한 칸 앞으로 이동한 것처럼 느껴집니다. 마음 속 "뱀"의 "움직임"을 제거하고 "뱀"에 대해 신중하게 생각해 보세요. 이동 전과 후입니다. 사실 머리와 꼬리를 제외하면 다른 부분은 전혀 바뀌지 않았습니다. 그것은 간단합니다. 목록의 시작 부분에 다음 그리드의 좌표를 추가하고 목록의 마지막 요소를 제거합니다. 이는 뱀이 한 그리드 앞으로 이동하는 것과 같습니다.

3. 게임이 끝나는 시점을 어떻게 알 수 있나요?

"뱀"이 게임 영역의 범위를 벗어나거나 자신과 접촉할 경우 축 좌표의 범위가 미리 정해져 있어 범위를 초과하는지 쉽게 판단할 수 있습니다. 그렇다면 자신을 만났을 때 어떻게 판단합니까?
"뱀"이 움직이는 그림을 생각하고 있다면 정말 어렵지만 코드에서 "뱀"은 목록이므로 다음 그리드의 좌표가 이미 목록에 포함되어 있는지 확인하면 됩니다. "뱀" "목록에 넣는 것만으로도 충분하지 않을까요?
이러한 문제가 해결되면 코딩을 시작할 수 있습니다.

게임 요소 및 인터페이스 정의:

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()

전체 코드:

"""
贪吃蛇小游戏
"""
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()

위 내용은 Python을 사용하여 간단한 뱀 게임을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제