Python 用snake中的图像替换立方体

Python 用snake中的图像替换立方体,python,image,pygame,Python,Image,Pygame,我正在尝试创建一个蛇游戏,其中包含与我被赋予的任务相关的拾取,我用网格和立方体创建了这段代码,需要帮助用图片替换立方体 我已经尝试添加一个“pygame.image.load(“”)”行,但没有成功,我尝试将代码更改为我认为可行的代码,但我得到的是一个红色的立方体,而不是图像 import math import random import pygame import tkinter as tk from tkinter import messagebox class cube(object)

我正在尝试创建一个蛇游戏,其中包含与我被赋予的任务相关的拾取,我用网格和立方体创建了这段代码,需要帮助用图片替换立方体

我已经尝试添加一个“pygame.image.load(“”)”行,但没有成功,我尝试将代码更改为我认为可行的代码,但我得到的是一个红色的立方体,而不是图像

import math
import random
import pygame
import tkinter as tk
from tkinter import messagebox

class cube(object):
    rows = 20
    w = 500
    def __init__(self,start,dirnx=1,dirny=0,color=(255,0,0)):
        self.pos = start
        self.dirnx = 1
        self.dirny = 0
        self.color = color


    def move(self, dirnx, dirny):
        self.dirnx = dirnx
        self.dirny = dirny
        self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny)

    def draw(self, surface, eyes=False):
        dis = self.w // self.rows
        i = self.pos[0]
        j = self.pos[1]

        pygame.draw.rect(surface, self.color, (i*dis+1,j*dis+1, dis-2, 
dis-2))
        if eyes:
            centre = dis//2
            radius = 3
            circleMiddle = (i*dis+centre-radius,j*dis+8)
            circleMiddle2 = (i*dis + dis -radius*2, j*dis+8)
            pygame.draw.circle(surface, (0,0,0), circleMiddle, radius)
            pygame.draw.circle(surface, (0,0,0), circleMiddle2, radius)




class snake(object):
    body = []
    turns = {}
    def __init__(self, color, pos):
        self.color = color
        self.head = cube(pos)
        self.body.append(self.head)
        self.dirnx = 0
        self.dirny = 1

    def move(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()

            keys = pygame.key.get_pressed()

            for key in keys:
                if keys[pygame.K_LEFT]:
                    self.dirnx = -1
                    self.dirny = 0
                    self.turns[self.head.pos[:]] = [self.dirnx, 
self.dirny]

                elif keys[pygame.K_RIGHT]:
                    self.dirnx = 1
                    self.dirny = 0
                    self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]

                elif keys[pygame.K_UP]:
                    self.dirnx = 0
                    self.dirny = -1
                    self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]

                elif keys[pygame.K_DOWN]:
                    self.dirnx = 0
                    self.dirny = 1
                    self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]

        for i, c in enumerate(self.body):
            p = c.pos[:]
            if p in self.turns:
                turn = self.turns[p]
                c.move(turn[0],turn[1])
                if i == len(self.body)-1:
                    self.turns.pop(p)
            else:
                if c.dirnx == -1 and c.pos[0] <= 0: c.pos = (c.rows-1, c.pos[1])
                elif c.dirnx == 1 and c.pos[0] >= c.rows-1: c.pos = (0,c.pos[1])
                elif c.dirny == 1 and c.pos[1] >= c.rows-1: c.pos = (c.pos[0], 0)
                elif c.dirny == -1 and c.pos[1] <= 0: c.pos = (c.pos[0],c.rows-1)
                else: c.move(c.dirnx,c.dirny)


    def reset(self, pos):
        self.head = cube(pos)
        self.body = []
        self.body.append(self.head)
        self.turns = {}
        self.dirnx = 0
        self.dirny = 1


    def addCube(self):
        tail = self.body[-1]
        dx, dy = tail.dirnx, tail.dirny

        if dx == 1 and dy == 0:
            self.body.append(cube((tail.pos[0]-1,tail.pos[1])))
        elif dx == -1 and dy == 0:
            self.body.append(cube((tail.pos[0]+1,tail.pos[1])))
        elif dx == 0 and dy == 1:
            self.body.append(cube((tail.pos[0],tail.pos[1]-1)))
        elif dx == 0 and dy == -1:
            self.body.append(cube((tail.pos[0],tail.pos[1]+1)))

        self.body[-1].dirnx = dx
        self.body[-1].dirny = dy


    def draw(self, surface):
        for i, c in enumerate(self.body):
            if i ==0:
                c.draw(surface, True)
            else:
                c.draw(surface)


def drawGrid(w, rows, surface):
    sizeBtwn = w // rows

    x = 0
    y = 0
    for l in range(rows):
        x = x + sizeBtwn
        y = y + sizeBtwn

        pygame.draw.line(surface, (255,255,255), (x,0),(x,w))
        pygame.draw.line(surface, (255,255,255), (0,y),(w,y))




def redrawWindow(surface):
    global rows, width, s, snack
    surface.fill((0,0,0))
    s.draw(surface)
    snack.draw(surface)
    drawGrid(width,rows, surface)
    pygame.display.update()





def randomSnack(rows, item):

    positions = item.body

    while True:
        x = random.randrange(rows)
        y = random.randrange(rows)
        if len(list(filter(lambda z:z.pos == (x,y), positions))) > 0:
            continue
        else:
            break

    return (x,y)


def message_box(subject, content):
    root = tk.Tk()
    root.attributes("-topmost", True)
    root.withdraw()
    messagebox.showinfo(subject, content)
    try:
        root.destroy()
    except:
        pass


def main():
    global width, rows, s, snack
    width = 500
    rows = 20
    win = pygame.display.set_mode((width, width))
    s = snake((255,0,0), (10,10))
    snack = cube(randomSnack(rows, s), color=(0,255,0))
    flag = True

    clock = pygame.time.Clock()

    while flag:
        pygame.time.delay(50)
        clock.tick(10)
        s.move()
        if s.body[0].pos == snack.pos:
            s.addCube()
            snack = cube(randomSnack(rows, s), color=(0,255,0))


        for x in range(len(s.body)):
            if s.body[x].pos in list(map(lambda z:z.pos,s.body[x+1:])):
                print('Score: ', len(s.body))
                message_box('You Lost!', 'Play again...')
                s.reset((10,10))
                break


        redrawWindow(win)

main()
导入数学
随机输入
导入pygame
将tkinter作为tk导入
从tkinter导入消息框
类多维数据集(对象):
行=20
w=500
定义初始化(self,start,dirnx=1,dirny=0,color=(255,0,0)):
self.pos=开始
self.dirnx=1
self.dirny=0
self.color=颜色
def移动(自身、dirnx、dirny):
self.dirnx=dirnx
self.dirny=dirny
self.pos=(self.pos[0]+self.dirnx,self.pos[1]+self.dirny)
def绘制(自身、表面、眼睛=假):
dis=self.w//self.rows
i=自身位置[0]
j=自身位置[1]
pygame.draw.rect(曲面,self.color,(i*dis+1,j*dis+1,dis-2,
dis-2)
如果眼睛:
中心=dis//2
半径=3
圆心=(i*dis+中心半径,j*dis+8)
圆IDDLE2=(i*dis+dis-半径*2,j*dis+8)
pygame.draw.circle(曲面,(0,0,0),圆中间,半径)
pygame.draw.circle(曲面,(0,0,0),circleMiddle2,半径)
类(对象):
正文=[]
圈数={}
定义初始(自身、颜色、位置):
self.color=颜色
self.head=立方体(位置)
self.body.append(self.head)
self.dirnx=0
self.dirny=1
def移动(自我):
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
pygame.quit()
keys=pygame.key.get_pressed()
对于键入键:
如果键[pygame.K_左]:
self.dirnx=-1
self.dirny=0
self.turns[self.head.pos[:]=[self.dirnx,
赛尔夫·迪尼]
elif keys[pygame.K_RIGHT]:
self.dirnx=1
self.dirny=0
self.turns[self.head.pos[:]=[self.dirnx,self.dirny]
elif keys[pygame.K_UP]:
self.dirnx=0
self.dirny=-1
self.turns[self.head.pos[:]=[self.dirnx,self.dirny]
elif keys[pygame.K_DOWN]:
self.dirnx=0
self.dirny=1
self.turns[self.head.pos[:]=[self.dirnx,self.dirny]
对于枚举中的i,c(self.body):
p=c.pos[:]
如果p在self.turns中:
旋转=自旋转[p]
c、 移动(转动[0],转动[1])
如果i==len(self.body)-1:
自转.弹出(p)
其他:
如果c.dirnx==-1和c.pos[0]=c.rows-1:c.pos=(0,c.pos[1])
elif c.dirny==1和c.pos[1]>=c.rows-1:c.pos=(c.pos[0],0)
elif c.dirny==-1和c.pos[1]0:
持续
其他:
打破
返回(x,y)
def消息框(主题、内容):
root=tk.tk()
属性(“-top”,True)
root.draw()
messagebox.showinfo(主题、内容)
尝试:
root.destroy()
除:
通过
def main():
全局宽度、行数、行数
宽度=500
行=20
win=pygame.display.set_模式((宽度,宽度))
s=蛇((255,0,0),(10,10))
零食=立方体(随机零食(行,s),颜色=(0255,0))
flag=True
clock=pygame.time.clock()
而国旗:
pygame。时间。延迟(50)
时钟滴答(10)
s、 移动()
如果s.body[0].pos==snack.pos:
s、 addCube()
零食=立方体(随机零食(行,s),颜色=(0255,0))
对于范围内的x(透镜体):
如果列表中的s.body[x].pos(映射(lambda z:z.pos,s.body[x+1:]):
打印('Score:',len(s.body))
消息框(“你输了!”,“再次播放…”)
s、 重置((10,10))
打破
重画窗口(win)
main()
用于将图像加载到对象。
通过以下方式将
pygame.Surface
缩放至适当大小:

self.image=pygame.transform.smoothscale(pygame.image.load(“myimage.png”),(dis-2,dis-2))
通过以下方式在屏幕上绘制图像:

surface.blit(self.image,(i*dis+1,j*dis+1))
图像或图像名称可以是类
cube
的constrator的可选参数。如果给定图像名称,则绘制图像,否则绘制矩形:

e、 g

类多维数据集(对象):
行=20
w=500
def uuu init uuuu(self,start,imagename=None,dirnx=1,dirny=0,color=(255,0,0)):
self.pos=开始
self.dirnx=1
self.dirny=0
self.color=颜色
尝试:
dis=self.w//self.rows
self.image=pygame.transform.smoothscale(pygame.image.load(imagename),(dis-2,dis-2))
除:
self.image=None
# [...]
def绘制(自身、表面、眼睛=假):
dis=self.w//self.rows
i=自身位置[0]
j=自身位置[1]
如果自我形象:
blit(自映像,(i*dis+1,j*dis+1))
其他:
pygame.draw.rect(曲面,self.color,(i*dis+1,j*dis+1,dis-2,dis-2))
# [...]

使用
pygame.image.load显示代码
谢谢,这非常有帮助,非常感谢