python中的平铺游戏

python中的平铺游戏,python,python-3.x,pygame,tile,Python,Python 3.x,Pygame,Tile,我使用PyGame库用python制作了一个tile游戏。游戏的本质是:有一个我们控制的正方形,敌人会出现在四面八方。我有一个敌人的外观问题,我不能使敌人沿X坐标出现在瓷砖上。现在,它们出现在X坐标上的一个随机点上,但它们必须位于平铺上。 代码如下: 导入系统 导入pygame作为pg 随机输入 白色=(255,255,255,) 黑色=(0,0,0) 暗灰色=(40,40,40) 浅灰色=(100100100) 绿色=(0,255,0) 红色=(255,0,0) 黄色=(255,255,0)

我使用PyGame库用python制作了一个tile游戏。游戏的本质是:有一个我们控制的正方形,敌人会出现在四面八方。我有一个敌人的外观问题,我不能使敌人沿X坐标出现在瓷砖上。现在,它们出现在X坐标上的一个随机点上,但它们必须位于平铺上。
代码如下:

导入系统 导入pygame作为pg 随机输入 白色=(255,255,255,) 黑色=(0,0,0) 暗灰色=(40,40,40) 浅灰色=(100100100) 绿色=(0,255,0) 红色=(255,0,0) 黄色=(255,255,0) 宽度=1008#16*64аааа32*32аааа64*16 高度=768#16*48аааа32*24аааа64*12 FPS=60 TITLE=“标题游戏” BGCOLOR=DARKGREY TILESIZE=48 GRIDWIDTH=宽度/瓷砖大小 GRIDHEIGHT=高度/平铺尺寸 职业玩家(第三页精灵): 定义初始化(self,game,x,y): self.groups=game.all\u精灵 pg.sprite.sprite.\uuuu init\uuuu(self,self.groups) self.game=游戏 self.image=pg.Surface((瓷砖大小,瓷砖大小)) self.image.fill(黄色) self.rect=self.image.get_rect() self.x=x self.y=y def移动(自,dx=0,dy=0): 如果不是自墙,则用墙(dx,dy)固定: self.x+=dx self.y+=dy 带墙的def colide_(自,dx=0,dy=0): 对于self.game.walls中的墙: 如果wall.x==self.x+dx和wall.y==self.y+dy: 返回真值 返回错误 def更新(自我): self.rect.x=self.x*TILESIZE self.rect.y=self.y*TILESIZE 类墙(第页雪碧、雪碧): 定义初始化(self,game,x,y): self.groups=game.all_精灵,game.walls pg.sprite.sprite.\uuuu init\uuuu(self,self.groups) self.game=游戏 self.image=pg.Surface((瓷砖大小,瓷砖大小)) self.image.fill(绿色) self.rect=self.image.get_rect() self.x,self.y=x,y self.rect.x=x*TILESIZE self.rect.y=y*TILESIZE 类移动(第页精灵,精灵): 定义初始化(自): 精灵精灵。精灵。精灵初始(自我) self.image=pg.Surface((瓷砖大小,瓷砖大小)) self.image.fill(红色) self.rect=self.image.get_rect() self.rect.x=random.randrange(宽度-self.rect.WIDTH) self.rect.y=random.randrange(-100,-40) self.speedy=random.randrange(6,9) def更新(自我): self.rect.y+=自加速 如果self.rect.top>HEIGHT+TILESIZE: self.rect.x=random.randrange(宽度-self.rect.WIDTH) self.rect.y=random.randrange(-100,-40) self.speedy=random.randrange(6,9) 班级游戏: 定义初始化(自): 第init页() self.screen=pg.display.set_模式((宽度、高度)) pg.display.set_标题(标题) self.clock=pg.time.clock() pg.key.set_重复(1,15) def新(自我): self.all_sprite=pg.sprite.Group() self.walls=pg.sprite.Group() self.mobs=pg.sprite.Group() self.player=player(self,10,10) 对于范围(10)内的i: m=Mob() self.all_sprite.add(m) self.mobs.add(m) 对于范围(-1,22)内的x: 墙(自,x,-1) 对于范围(-1,22)内的x: 墙(自,x,16) 对于范围(-1,17)内的x: 墙(自-1,x) 对于范围(-1,17)内的x: 墙(自身,21,x) def运行(自): 自弹=真 自娱自乐时: self.dt=self.clock.tick(FPS)/1000 self.events() self.update() self.draw() def退出(自我): 第页退出 sys.exit() def更新(自我): self.all_sprites.update() def绘制网格(自): 对于范围内的x(0,宽度,平铺): pg.绘制线(自屏幕,浅灰色,(x,0),(x,高度)) 对于范围内的y(0,高度,平铺): pg.绘制线(自屏幕,浅灰色,(0,y),(宽度,y)) def牵引(自): self.screen.fill(BGCOLOR) self.draw_grid() self.all_sprite.draw(self.screen) pg.display.flip() def事件(自): 对于pg.event.get()中的事件: 如果event.type==pg.QUIT: self.quit() 如果event.type==pg.KEYDOWN: 如果event.key==pg.K_转义: self.quit() 如果event.key==pg.K_左: self.player.move(dx=-1) 如果event.key==pg.K_RIGHT: self.player.move(dx=1) 如果event.key==pg.K_UP: self.player.move(dy=-1) 如果event.key==pg.K_向下: self.player.move(dy=1) g=游戏() 尽管如此: g、 新的() g、 运行()
您可以使用
randrange
的第三个参数,即
步骤
。在
Mob
类中,按如下方式设置rect对象的x值:

self.rect.x = random.randrange(0, WIDTH, TILESIZE) 

它们将与瓷砖完美对齐。

将步骤
瓷砖大小添加到
self.rect.x()
在这里:


不公平!我在XD之前发布了这个答案。@AnnZen对不起,你错了。“阿索西亚是第一名,我是第二名,你是第三名。”拉比76现在我明白了。
class Mob(pg.sprite.Sprite):
    def __init__(self):
        pg.sprite.Sprite.__init__(self)
        self.image = pg.Surface((TILESIZE, TILESIZE))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(0,WIDTH-self.rect.width,48)
        self.rect.y = random.randrange(-100, -40)
        self.speedy = random.randrange(6, 9)

    def update(self):
        self.rect.y += self.speedy
        if self.rect.top > HEIGHT + TILESIZE:
            self.rect.x = random.randrange(0,WIDTH-self.rect.width,48)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(6, 9)