贪吃蛇(python的pygame)

该代码实现了一个简单的贪吃蛇游戏,利用pygame库进行窗口和图形操作。游戏中,蛇会根据用户键盘输入的方向移动,当蛇头碰到食物则增长,碰到墙壁或自身身体则游戏结束。游戏使用了随机生成食物位置、碰撞检测以及帧频控制等技术。
摘要由CSDN通过智能技术生成
import pygame
import random
class Point:
    def __init__(self, row=0, col=0):
        self.row = row
        self.col = col
    def copy(self):
        return Point(self.row, self.col)
# 定义显示窗口的W(宽) H(高)
W = 800
H = 600
snakes = [] #定义蛇身列表
def ge_food():
    while True:
        pos = Point(random.randint(0, ROW - 1), random.randint(0, COL - 1))
        is_collide = False
        if pos.row == head.row and pos.col == head.col:  # 与蛇头重合
            is_collide = True
        # 与蛇身碰撞
        for snake in snakes:
            if (snake.row == pos.row and snake.col == pos.col):
                is_collide = True
                break
        if not is_collide:
            return pos
ROW = 100 #行数
COL = 100 #列数
size = (W, H)
pygame.init() # 初始化界面
window = pygame.display.set_mode(size)
pygame.display.set_caption("贪吃蛇大作战")
bak_color = (255, 255, 255)
# 定义蛇头
head = Point(row=int(ROW/2), col=int(COL/2))
head_color = (0, 128, 128)
# 定义食物
food = ge_food()
food_color = (255, 255, 0)

snake_color = (128, 128, 128)
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)
    )

showWindow = True
clock = pygame.time.Clock() #时钟控制
while showWindow:
    # 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            showWindow = False
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                if direct=='left' or direct=='right':
                    direct = "top"
            elif event.key == pygame.K_DOWN:
                if direct == 'left' or direct == 'right':
                    direct = "down"
            elif event.key == pygame.K_LEFT:
                if direct=='top' or direct=='down':
                    direct = 'left'
            elif event.key == pygame.K_RIGHT:
                if direct == 'top' or direct == 'down':
                    direct = 'right'
    # 判断蛇是否吃到东西
    eat = False
    if head.row == food.row and head.col == food.col:# 蛇吃到食物
        eat = True
    if eat:# 吃到食物就要产生新的食物
        food = ge_food()
    # 将蛇头插入到snakes列表中
    snakes.insert(0, head.copy())
    # 将最后一个元素删除
    if not eat:
        snakes.pop()
    # 移动蛇头
    if direct == 'left':
        head.col-=1  # 注意 direct = 'left'与head.col-=1不能写在一起 因为蛇头要一直移动
    elif direct == 'right':
        head.col+=1
    elif direct == 'top':
        head.row-=1
    else:
        head.row+=1
    # 判断蛇是否死亡
    dead = False
    # 判断蛇是否撞墙
    if head.col<0 or head.row<0 or head.row>=ROW or head.col>=COL:
        dead = True
    # 判断蛇是否撞蛇身
    for snake in snakes:
        if snake.row==head.row and snake.col==head.col:
            dead = True
            break
    if dead:
        showWindow = False
    # 页面渲染
    pygame.draw.rect(window, bak_color, (0, 0, W, H))
    # 这里需要注意 绘制食物与蛇头要在绘制背景之后 因为黑色的背景颜色会覆盖一切
    # 画蛇头
    rect(head, head_color)
    # 画蛇身
    for snake in snakes:
        rect(snake, snake_color)
    # 画食物
    rect(food, food_color)
    pygame.display.flip() #更新整个待显示的Surface对象到屏幕上

    clock.tick(15)# 设置帧频 可以用来控制蛇头移动的速度

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值