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

黑窗游戏

翁昊乾
2023-03-14

我正在用pyplay写一个蛇游戏,但我只是提示一个黑色的窗口没有任何错误。

我检查了类似的问题,他们错误地使用了screen对象。然而,这里的情况似乎不是这样,因为它只创建了一次?

知道我做错了什么吗?因为我没有收到任何错误信息,所以我不明白为什么只显示一个黑屏。按键输入事件工作正常。

import pygame
import random
import sys


# Define colors
GRAY = (240, 240, 245)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLACK = (50, 50, 50)

# Field size
width = 400
height = 400



# Calculate the distance between two points
def calculate_distance(x1, x2, y1, y2):
    return (x2 - x1)**2 + (y1 - y2)**2 ** 1/2

# Draws a label showing the current score in the top mid of the window
def draw_score_text(surface, text, font_size, x, y):
    font_name = pygame.font.match_font('arial')
    font = pygame.font.Font(font_name, font_size)
    text_surface = pygame.font.render(text, True, WHITE)
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    surf.blit(text_surface, text_rect)


class Snake(pygame.sprite.Sprite):

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((12,12))
        self.image.fill(WHITE)
        self.rect=self.image.get_rect()
        self.rect.center = (100,100)
        self.speedx=0
        self.speedy=0
        self.score=0
        self.tail=[]

    def update(self):
        if self.score == len(self.tail):
            self.tail.append((self.rect.x, self.rect.y))
        else:
            self.tail.append((self.rect.x, self.rect.y))
            self.tail.pop(0)

        self.rect.x += self.speedx
        self.rect.y += self.speedy

        keys = pygame.key.get_pressed()

        if(keys[pygame.K_RIGHT] and self.speedx >=0):
            self.speedx = 10
            self.speedy = 0
        if(keys[pygame.K_LEFT] and self.speedx <=0):
            self.speedx = -10
            self.speedy = 0
        if(keys[pygame.K_UP] and self.speedy <=0):
            self.speedx = 0
            self.speedy = -10
        if(keys[pygame.K_DOWN] and self.speedy >=0):
            self.speedx = 0
            self.speedy = 10

        if self.rect.left >= width:
            self.rect.left = 1

        if self.rect.top >= height:
            self.rect.top = 0

        if self.rect.bottom <= 0:
            self.rect.bottom = height

        if self.rect.left <= 0:
            self.rect.left = width

    def exit(self):
        for i in range(1, len(self.tail)):
            if dist(self.rect.x, self.rect.y, self.tail[i][0], self.tail[i][1]) < 1:
                sys.exit()

class Food(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((12,12))
        self.image.fill(RED)
        self.rect=self.image.get_rect()
        self.rect.center = (x, y)


# Start dah game
pygame.init()
screen = pygame.display.set_mode([width,height])
clock = pygame.time.Clock()
running = True

print("ok?")
all_sprites = pygame.sprite.Group()
player = Snake()
food = Food(random.randrange(20, width - 20), random.randrange(20, height - 20))
all_sprites.add(player)
all_sprites.add(food)

while running:

    clock.tick(3)
    #pygame.display.update()
    keys_pressed = pygame.event.get()
    print(keys_pressed)
    for i in keys_pressed:
        if i.type == pygame.QUIT:
            print("quit")
            running = False
    if pygame.sprite.collide_rect(player, food):

        food.kill()
        player.score += 1
        food = Food(random.randrange(20, width - 20), random.randrange(20, height - 20)) 
        all_sprites.add(food)

    all_sprites.update()
    screen.fill(BLACK)
    player.exit()

    for i in range(1, len(player.tail)):
        pygame.draw.rect(screen, WHITE, (player.tail[i][0], player.tail[i][2], 12, 12))
        #draw_score_text(screen, str(player.score), 18, width/2, 10)
        all_sprites.draw(screen)
        pygame.display.flip()


pygame.quit()

共有1个答案

戚研
2023-03-14

显示的更新和精灵的绘制必须在主循环中完成,而不是在循环的内部中完成:

while running:

    # [...]

    for i in range(1, len(player.tail)):
        pygame.draw.rect(screen, WHITE, (player.tail[i][0], player.tail[i][2], 12, 12))

    # <--
    all_sprites.draw(screen)
    pygame.display.flip()

注意,如果snake仅由一个头部组成,则不执行内部循环。如果尾巴的长度是

我收到一个超出范围的异常

Traceback (most recent call last): File "snake.py", line 132, in <module> > 
pygame.draw.rect(screen, WHITE, (player.tail[i][0], player.tail[i][2], 12, 12)) 
IndexError: tuple index out of range `

第二(y)坐标的索引是1而不是2。Ist必须是玩家。尾部[i][1]

for i in range(1, len(player.tail)):
    pygame.draw.rect(screen, WHITE, (player.tail[i][0], player.tail[i][1], 12, 12))

 类似资料:
  • 我正在写一个简单的mandelbrot渲染器。在程序计算并绘制所有内容后,它将保存曲面并进行blits。这很好,但在我添加了更新显示功能后,它只显示一个黑屏。我需要更新每次迭代,因为我将添加一些文本和其他内容。我只包括了节目的重要部分。有人知道为什么会这样吗?

  • 我对glfw有一个小问题。 我的代码非常简单,我只想创建一个空窗口。 } 此代码编译,但当我运行它时,我只有一个白色窗口。窗口的标题是正确的,但里面的一切都是白色的......我尝试像那样使用glClearColor。 但是我的窗户仍然是白色的....我用的是visual studio 2015。 怎么弄个黑窗? 编辑: 忘了补充这个:glfwMakeContextCurrent(window);

  • 我目前正在编写一个游戏,你必须避免小行星。我不得不处理一些混乱的坐标,我不得不猜测精灵的坐标。我现在有了描述我的世界的任意单位。不幸的是,我的游戏屏幕不能完全工作。当我想渲染我的小行星时,游戏屏幕会显示一个黑屏。 上面显示的代码工作正常,并向我展示了以下内容: 当我在GameScreen类中添加小行星的渲染方法时,GameScreen只是黑色的: 小行星等级: 小行星等级:

  • 我正在为平台游戏做教程,但我的Pygame窗口显示一个黑屏。 我不知道怎么解决这个问题。 我尝试再次关闭和打开Visual Studio Code,但没有任何结果。

  • 柠檬微趣-已凉(投递简历前玩了玩他家游戏,发现两个bug) 1.自我介绍 2.如何理解测试 3如何测试5%这种概率问题 4.web测试和app测试的区别 5.你有什么优点和缺点 6.笔试题回顾(全是逻辑思维题) 7.select语句,现场口述排序和条件查询8.消消乐某一关如何测试 9.查日志用什么工具,怎么查,什么时候查10.-个好的测试用例应该有什么特点 11.有什么印象深刻的bug

  • 这是我的代码,请记住,我在几天前学习了python,所以我的代码可能制作不正确,等等。我正在尝试制作一个窗口,该窗口将显示一些文本(测试版),并将显示两个小矩形,我想成为按钮。