m0_66857188 2022-02-07 10:13 采纳率: 60%
浏览 35
已结题

python写贪吃蛇问题解决方法(重发)

不知道是什么问题吃食物没反应,这是代码:
import pygame
from sys import exit
import random

class Point():
row = 0
clo = 0

def __init__(self, row, clo):
    self.row = row
    self.clo = clo

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

初始化

pygame.init()
width = 800
hight = 400

ROW = 30
CLO = 40

direct = 'left'
window = pygame.display.set_mode((width, hight))
pygame.display.set_caption('贪吃蛇游戏')

蛇头坐标定在中间

head = Point(row=int(ROW / 2), clo=int(CLO / 2))

初始化蛇身的元素数量

snake = [
Point(row=head.row, clo=head.clo + 1),
Point(row=head.row, clo=head.clo + 2),
Point(row=head.row, clo=head.clo + 3)
]

生成食物并且不让食物生成在蛇的身体里面

def gen_food():
while 1:
position = Point(row=random.randint(0, ROW - 1), clo=random.randint(0, CLO - 1))
is_coll = False
if head.row == position.row and head.clo == position.clo:
is_coll = True
for body in snake:
if body.row == position.row and body.clo == position.clo:
is_coll = True
break
if not is_coll:
break
return position

定义坐标

蛇头颜色可以自定义

head_color = (0, 158, 128)

食物坐标

snakeFood = gen_food()

食物颜色

snakeFood_color = (255, 255, 0)

snake_color = (200, 147, 158)

需要执行很多步画图操作 所以定义一个函数

def rect(point, color):
# 定位 画图需要left和top
left = point.clo * width / CLO
top = point.row * hight / ROW
# 将方块涂色
pygame.draw.rect(window, color, (left, top, width / CLO, hight / ROW))

quit = True

设置帧频率

clock = pygame.time.Clock()
while quit:
# 处理帧频 锁帧
clock.tick(30)
# pygame.event.get()获取当前事件的队列 可以同时发生很多事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit = False
elif event.type == pygame.KEYDOWN:
# 这里小细节蛇不可以直接左右上下 要判断当前是在什么状态下前行
if event.key == 273 or event.key == 119:
if direct == 'left' or direct == 'right':
direct = 'top'
if event.key == 274 or event.key == 115:
if direct == 'left' or direct == 'right':
direct = 'bottom'
if event.key == 276 or event.key == 97:
if direct == 'top' or direct == 'bottom':
direct = 'left'
if event.key == 275 or event.key == 100:
if direct == 'top' or direct == 'bottom':
direct = 'right'
# 吃东西
eat = (head.row == snakeFood.row and head.clo == snakeFood.clo)

# 处理蛇的身子
# 1.把原来的头插入到snake的头上
# 2.把最后一个snake删掉
if eat:
    snakeFood = Point(row=random.randint(0, ROW - 1), clo=random.randint(0, CLO - 1))
snake.insert(0, head.copy())
if not eat:
    snake.pop()

# 移动一下
if direct == 'left':
    head.clo -= 1
if direct == 'right':
    head.clo += 1
if direct == 'top':
    head.row -= 1
if direct == 'bottom':
    head.row += 1
dead = False
if head.clo < 0 or head.row < 0 or head.clo >= CLO or head.row >= ROW:
    dead = True
for body in snake:
    if head.clo == body.clo and head.row == body.row:
        dead = True
        break
if dead:
    print('Game Over')
    quit = False
# 背景画图
pygame.draw.rect(window, (245, 135, 155), (0, 0, width, hight))

# 蛇头
rect(head, head_color)
# 绘制食物
rect(snakeFood, snakeFood_color)
# 绘制蛇的身子
for body in snake:
    rect(body, snake_color)

# 交还控制权
pygame.display.flip()

import pygame
from sys import exit
import random

class Point():
row = 0
clo = 0

def __init__(self, row, clo):
    self.row = row
    self.clo = clo

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

初始化

pygame.init()
width = 800
hight = 400

ROW = 30
CLO = 40

direct = 'left'
window = pygame.display.set_mode((width, hight))
pygame.display.set_caption('贪吃蛇游戏')

蛇头坐标定在中间

head = Point(row=int(ROW / 2), clo=int(CLO / 2))

初始化蛇身的元素数量

snake = [
Point(row=head.row, clo=head.clo + 1),
Point(row=head.row, clo=head.clo + 2),
Point(row=head.row, clo=head.clo + 3)
]

生成食物并且不让食物生成在蛇的身体里面

def gen_food():
while 1:
position = Point(row=random.randint(0, ROW - 1), clo=random.randint(0, CLO - 1))
is_coll = False
if head.row == position.row and head.clo == position.clo:
is_coll = True
for body in snake:
if body.row == position.row and body.clo == position.clo:
is_coll = True
break
if not is_coll:
break
return position

定义坐标

蛇头颜色可以自定义

head_color = (0, 158, 128)

食物坐标

snakeFood = gen_food()

食物颜色

snakeFood_color = (255, 255, 0)

snake_color = (200, 147, 158)

需要执行很多步画图操作 所以定义一个函数

def rect(point, color):
# 定位 画图需要left和top
left = point.clo * width / CLO
top = point.row * hight / ROW
# 将方块涂色
pygame.draw.rect(window, color, (left, top, width / CLO, hight / ROW))

quit = True

设置帧频率

clock = pygame.time.Clock()
while quit:
# 处理帧频 锁帧
clock.tick(30)
# pygame.event.get()获取当前事件的队列 可以同时发生很多事件
for event in pygame.event.get():
if event.type == pygame.QUIT:
quit = False
elif event.type == pygame.KEYDOWN:
# 这里小细节蛇不可以直接左右上下 要判断当前是在什么状态下前行
if event.key == 273 or event.key == 119:
if direct == 'left' or direct == 'right':
direct = 'top'
if event.key == 274 or event.key == 115:
if direct == 'left' or direct == 'right':
direct = 'bottom'
if event.key == 276 or event.key == 97:
if direct == 'top' or direct == 'bottom':
direct = 'left'
if event.key == 275 or event.key == 100:
if direct == 'top' or direct == 'bottom':
direct = 'right'
# 吃东西
eat = (head.row == snakeFood.row and head.clo == snakeFood.clo)

# 处理蛇的身子
# 1.把原来的头插入到snake的头上
# 2.把最后一个snake删掉
if eat:
    snakeFood = Point(row=random.randint(0, ROW - 1), clo=random.randint(0, CLO - 1))
snake.insert(0, head.copy())
if not eat:
    snake.pop()

# 移动一下
if direct == 'left':
    head.clo -= 1
if direct == 'right':
    head.clo += 1
if direct == 'top':
    head.row -= 1
if direct == 'bottom':
    head.row += 1
dead = False
if head.clo < 0 or head.row < 0 or head.clo >= CLO or head.row >= ROW:
    dead = True
for body in snake:
    if head.clo == body.clo and head.row == body.row:
        dead = True
        break
if dead:
    print('Game Over')
    quit = False
# 背景画图
pygame.draw.rect(window, (245, 135, 155), (0, 0, width, hight))

# 蛇头
rect(head, head_color)
# 绘制食物
rect(snakeFood, snakeFood_color)
# 绘制蛇的身子
for body in snake:
    rect(body, snake_color)

# 交还控制权
pygame.display.flip()
  • 写回答

1条回答 默认 最新

  • 陈年椰子 2022-02-07 14:46
    关注

    这样插入代码

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月16日
  • 已采纳回答 2月8日
  • 创建了问题 2月7日

悬赏问题

  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因