当前位置: 首页 > 知识库问答 >
问题:

pygame边界中的蛇游戏

许博达
2023-03-14

所以我对Python、PyGame和任何编程都是全新的。我遵循了在PyGame中制作蛇游戏的教程。现在一切都结束了,但为了给自己一个挑战,我正试图改变一下比赛。首先我想添加边界,但我真的迷路了。我试过看其他教程,但它们的图像似乎有所不同。这是我的代码(因为我不知道什么可以帮助你帮助我,所以我把它全部发送了):

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):
    rows_space = w // rows

    x = 0
    y = 0

    for l in range(rows):
        x += rows_space
        y += rows_space
        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, display_width, s, snack
    surface.fill((0,0,0))
    s.draw(surface)
    snack.draw(surface)
    drawGrid(display_width, rows, surface)
    pygame.display.update()

def randomSnack(rows,items):
    positions = items.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 rows, display_width, s, snack
    display_width = 500
    rows = 20
    win = pygame.display.set_mode((display_width, display_width))
    s = snake((255,0,0), (10,10))
    snack = cube(randomSnack(rows, s), color=(0,255,0))
    alive = True

    clock = pygame.time.Clock()

    while alive:
        pygame.time.delay(50)
        clock.tick(7)
        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()

基本上,我希望当我的蛇撞到边界时发生的事情和它撞到自己时发生的事情是一样的。如果你能帮助我,非常感谢!

共有1个答案

伏业
2023-03-14

让我们把窗户弄大一点,把它弄大一个立方体

win = pygame.display.set_mode((display_width + (500//20), display_width + (500//20)))

现在我们有了更多的空间,让我们把所有的东西都移过来,这样整个东西就有了一个均匀的边界

drawGrid()中,从一个立方体大小绘制

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

现在,如果你想要它的颜色,你可以画一个矩形围绕它的颜色你想要的

pygame.draw.rect(surface,(0,0,200),(0,0,w,rows_space)) #top
pygame.draw.rect(surface,(0,0,200),(0,0,rows_space,w)) #left
pygame.draw.rect(surface,(0,0,200),(0,w,w + rows_space,rows_space)) #bottom
pygame.draw.rect(surface,(0,0,200),(w,0,rows_space,w + rows_space)) #right

如果需要挑战,请执行相同的操作(可以使用该方法),但不要增加窗口,而是减小网格大小以生成边框。

另外,既然你已经制作了蛇,试着用尽可能少的线条制作它,我会先看看其他的,但这是一件好事。因为我个人认为你为身体的每个立方体使用一个类过于复杂了...

当蛇撞到边缘时,结束游戏的方法是,对蛇撞到它的身体做同样的事情,但是当蛇在边界上时,你有代码检查蛇是否离开屏幕并将其循环到另一边,这样你就可以在那里做

        else:
            #if snake off edge
            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) 

它没有很好地复制和粘贴

但是现在我们可以把这个代码从移动蛇改为结束游戏

        outside = False
            if c.pos[0] <= 1: outside = True
            elif c.pos[0] >= c.rows-1: outside = True
            elif c.pos[1] >= c.rows-1: outside = True
            elif c.pos[1] <= 1: outside = True
            else: c.move(c.dirnx,c.dirny) 
            if outside:
                print('Score: ', len(s.body))
                message_box('You Lost!', 'Play again!')
                s.reset((10,10))     

要修复蛇进入边界,请将上面的代码更改为

 类似资料:
  • 我是python新手,我正在尝试跟随一个教程,使用PyGame创建一个类似蛇的游戏。由于某种原因,我的界限不起作用。这可能很简单,但我看不出有什么理由不起作用。我没有犯任何错误,蛇只是越过了界限,比赛没有结束。

  • 使用Python 2.7制作一个基本的蛇游戏... 我设置了一个游戏结束事件,当蛇经过窗口屏幕时发生。但是,当它经过边界点时,什么也不会发生。有什么建议吗? 下面是我认为我需要更改的代码行,以及在我程序的其余部分中指向GitHub的要点的链接。

  • 我是pygame的新手,我做了一个屏幕边框检测,但它不起作用 并检查它是否接触到边缘 但如果我们使用它就会坏掉/播放器就会卡住 整个代码是

  • 本文向大家介绍使用Python第三方库pygame写个贪吃蛇小游戏,包括了使用Python第三方库pygame写个贪吃蛇小游戏的使用技巧和注意事项,需要的朋友参考一下 今天看到几个关于pygame模块的博客和视频,感觉非常有趣,这里照猫画虎写了一个贪吃蛇小游戏,目前还有待完善,但是基本游戏功能已经实现,下面是代码: 效果: 总结 到此这篇关于使用Python第三方库pygame写个贪吃蛇小游戏的文

  • 帖子底部的实际问题! 首先,我想解释我的问题。 我正在写一个基本的蛇游戏,我让蛇自动移动。当您执行代码时,它会自动移动到窗口的右侧,就像预期的那样。然而,我不能按我想要的方式控制我的蛇,它根本不会改变方向。 为了避免混淆,是类的一个实例。 为了解释蛇的运动: 对象有一个属性,它是一个包含对象的数组列表。每个对象都有和属性。使用此ArrayList,蛇通过在画布的y轴和x轴上使用和属性在画布上绘制小

  • 您好,我正在中制作一个游戏,我想知道如何以及最好的方式是在屏幕上添加游戏。以下是玩家健康状况小于或等于0的代码: 我不确定该怎么做,因为我试图使用另一个py呼叫游戏,但玩家死亡的时间被重置为0并返回,所以玩家死亡的地方可能发生任何事情吗?