用python实现贪吃蛇

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

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

import pygame
import random

pygame.init()
W = 800
H = 600
ROW = 60
COL = 80


size = (W, H)
window = pygame.display.set_mode(size)
pygame.display.set_caption('贪吃蛇')

bg_color = (255, 255, 255)
snake_color = (128, 128, 128)
head = Point(row=int(ROW/2), col=int(COL/2))
head_color = (0, 128, 128)
snakes = [
    Point(row=head.row, col=head.col+1),
    Point(row=head.row, col=head.col+2),
    Point(row=head.row, col=head.col+3),
]


#生成食物
def gen_food():
    while 1:
        pos = Point(row=random.randint(0, ROW-1), col=random.randint(0, COL-1))
        #是否碰到蛇了
        is_coll = False

        #碰到头
        if head.row == pos.row and head.col == pos.col:
            is_coll = True

        for snake in snakes:
            if snake.row == pos.row and snake.col == pos.col:
                is_coll = True
                break

        if not is_coll:
            break
    return pos

#定义坐标

food = gen_food()
food_color = (0, 0, 0)


direct = 'left'
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()
while quit:
    #处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            quit = False
        elif event.type == pygame.KEYDOWN:
            if event.key == 273:
                if direct == 'right' or direct == 'left':
                    direct = 'up'
            elif event.key == 274:
                if direct == 'right' or direct == 'left':
                    direct = 'down'
            elif event.key == 276:
                if direct == 'up' or direct == 'down':
                    direct = 'left'
            elif event.key == 275:
                if direct == 'up' or direct == 'down':
                    direct = 'right'

    #吃东西
    eat = (head.row == food.row and head.col == food.col)

    #重新产生食物
    if eat:
        food = gen_food()

    #处理身子
    #1,把原来的head插入到sneak的第一个位置
    snakes.insert(0, head.copy())
    #2,把sneak的最后一个数据删掉
    if not eat:
        snakes.pop()

    #移动
    if direct == 'left':
        head.col -= 1
    elif direct == 'right':
        head.col += 1
    elif direct == 'up':
        head.row -= 1
    elif direct == 'down':
        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()


    #fps,即蛇的速度
    clock.tick(18)

 

以下是用Python实现贪吃蛇游戏的一个简单示例: ```python import pygame import time # 初始化游戏 pygame.init() # 定义颜色 white = (255, 255, 255) black = (0, 0, 0) red = (255, 0, 0) # 设置游戏窗口的宽度和高度 window_width = 800 window_height = 600 # 创建游戏窗口 game_window = pygame.display.set_mode((window_width, window_height)) pygame.display.set_caption('贪吃蛇游戏') # 设置游戏速度 clock = pygame.time.Clock() snake_block_size = 20 snake_speed = 15 # 定义字体 font_style = pygame.font.SysFont(None, 50) score_font = pygame.font.SysFont(None, 35) # 定义显示分数的函数 def show_score(score): score_text = score_font.render("Score: " + str(score), True, black) game_window.blit(score_text, [10, 10]) # 定义绘制蛇的函数 def draw_snake(snake_block_size, snake_list): for x in snake_list: pygame.draw.rect(game_window, black, [x[0], x[1], snake_block_size, snake_block_size]) # 定义游戏主循环 def game_loop(): game_over = False game_close = False # 初始化蛇的位置和长度 x1 = window_width / 2 y1 = window_height / 2 x1_change = 0 y1_change = 0 snake_list = [] length_of_snake = 1 # 随机生成食物的位置 foodx = round((window_width / 2) / 10.0) * 10.0 foody = round((window_height / 2) / 10.0) * 10.0 while not game_over: while game_close == True: game_window.fill(white) game_over_text = font_style.render("Game Over", True, red) game_window.blit(game_over_text, [window_width / 2 - 100, window_height / 2 - 50]) show_score(length_of_snake - 1) pygame.display.update() # 游戏结束后,按下空格键重新开始游戏,按下q键退出游戏 for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: game_loop() if event.key == pygame.K_q: game_over = True game_close = False # 控制蛇的移动 for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: x1_change = -snake_block_size y1_change = 0 elif event.key == pygame.K_RIGHT: x1_change = snake_block_size y1_change = 0 elif event.key == pygame.K_UP: y1_change = -snake_block_size x1_change = 0 elif event.key == pygame.K_DOWN: y1_change = snake_block_size x1_change = 0 # 判断蛇是否撞墙 if x1 >= window_width or x1 < 0 or y1 >= window_height or y1 < 0: game_close = True # 更新蛇的位置 x1 += x1_change y1 += y1_change game_window.fill(white) pygame.draw.rect(game_window, red, [foodx, foody, snake_block_size, snake_block_size]) snake_head = [] snake_head.append(x1) snake_head.append(y1) snake_list.append(snake_head) if len(snake_list) > length_of_snake: del snake_list[0] # 判断蛇是否吃到食物 for x in snake_list[:-1]: if x == snake_head: game_close = True # 绘制蛇和食物 draw_snake(snake_block_size, snake_list) show_score(length_of_snake - 1) pygame.display.update() # 判断蛇是否吃到食物,如果吃到则生成新的食物 if x1 == foodx and y1 == foody: foodx = round((window_width / 2) / 10.0) * 10.0 foody = round((window_height / 2) / 10.0) * 10.0 length_of_snake += 1 # 控制游戏速度 clock.tick(snake_speed) pygame.quit() # 开始游戏 game_loop() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值