pygame 貪喫蛇(簡易版)

**

pygame 貪喫蛇(簡易版)

**
趁着寒假的時間自學了Python,就在b站上找了個視頻做了一個貪喫蛇的小遊戲,用到了pygame,IDE用的是pycharm。
沒怎麼根據視頻做太大的改進,第一次接觸pygame,很多東西還不是很瞭解,就當是一個練手的小遊戲,以後再改進吧。

class Point():
    row = 0
    col = 0
    def __init__(self, row, col):
        self.row = row
        self.col = col

    def copy(self):
        return Point(self.row,self.col)

import pygame
import random

# 初始化
pygame.init()
W = 800  # 屏幕的寬
H = 600  # 屏幕的高

ROW = 30  # 幾行
COL = 40  # 幾列  每個格有多大

size = (W, H)
window = pygame.display.set_mode(size)
pygame.display.set_caption('貪喫蛇')

bg_color = (255, 255, 255)  # 背景顏色
snake_color = (150, 150, 150)  # 蛇身顏色

head = Point(int(ROW/2), int(COL/2))  # 蛇頭
head_color = (0, 128, 128)

snakes = [
    Point(head.row, head.col + 1),
    Point(head.row, head.col + 2)
]


# 生成食物
def get_food():
    while True:
        pos = Point(random.randint(0, ROW - 1), random.randint(0, COL - 1))
        # 是否跟蛇碰上
        is_col = False
        if head.row == pos.row and head.col == pos.col:
            is_col = True
        for snake in snakes:
            if snake.row == pos.row and snake.col == pos.col:
                is_col = True
                break
        if not is_col:
            break
    return pos

# 定義座標
food = get_food()
food_color = (255, 255, 0)


direct = 'left'  # 蛇移動方向  left, right, up, down

def rect(point, color):
    cell_width = W / COL  # 格子的寬度
    cell_height = H / ROW # 格子的高度

    left = point.col * cell_width
    top = point.row * cell_height
    pygame.draw.rect(window,color,(left,top,cell_width,cell_height))


# 遊戲循環
quit = True
clock = pygame.time.Clock()

# 設置幀頻,根據遊戲的進程逐漸變快
frequency = 3

while quit:
    # 處理事件
    events = pygame.event.get()
    for event in events:
        if event.type == pygame.QUIT:
            quit = False
        elif event.type == pygame.KEYDOWN:  # 按鍵  上下左右  對應鍵值可以通過print(event)打出來
            if event.key == 273 or event.key == 119:
                if direct == 'left' or direct == 'right':
                    direct = 'up'
            elif event.key == 274 or event.key == 115:
                if direct == 'left' or direct == 'right':
                    direct = 'down'
            elif event.key == 276 or event.key == 97:
                if direct == 'up' or direct == 'down':
                    direct = 'left'
            elif event.key == 275 or event.key == 100:
                if direct == 'up' or direct == 'down':
                    direct = 'right'

    # 做自己的事

    # 喫東西
    eat = head.row == food.row and head.col == food.col

    if eat:
        food = get_food()
        frequency += 1
    # 處理身子
    # 1、把原來的頭插入到snakes的頭上
    snakes.insert(0,head.copy())
    # 2、把snakes的最後一個格子刪掉
    if not eat:
        snakes.pop()
    # 移動
    if direct == 'left':
        head.col -= 1
    elif direct == 'right':
        head.col += 1
    elif direct == 'up':
        head.row -= 1
    else:
        head.row += 1

    # 檢測
    dead = False
    # 1、撞牆
    if head.col < 0 or head.row <0 or head.col >= COL or head.row >= ROW:
        dead = True
    # 2、撞自己
    for snake in snakes:
        if head.col == snake.col and head.row == snake.row:
            dead = True
            break
    if dead:
        print("遊戲結束")
        quit = False
    # 渲染--畫出來
    # 屏幕背景顏色繪製
    pygame.draw.rect(window,bg_color,(0,0,W,H))

    # 畫蛇頭
    for snake in snakes:
        rect(snake,snake_color)
    rect(head, head_color)

    # 畫食物
    rect(food, food_color)

    pygame.display.flip()    #  更新整個待顯示的Surface 對象到屏幕上

    # 設置幀頻
    clock.tick(frequency) # sleep(1000/60)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章