Python 用snake中的图像替换立方体
我正在尝试创建一个蛇游戏,其中包含与我被赋予的任务相关的拾取,我用网格和立方体创建了这段代码,需要帮助用图片替换立方体 我已经尝试添加一个“pygame.image.load(“”)”行,但没有成功,我尝试将代码更改为我认为可行的代码,但我得到的是一个红色的立方体,而不是图像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)
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显示代码
谢谢,这非常有帮助,非常感谢