Почему экран не обновляется, несмотря на то, что я выложил инструкцию "pygame.display.flip ()"? - PullRequest
0 голосов
/ 30 декабря 2018

Я программирую в шахматы, но доска не обновляется, когда я делаю ход, несмотря на то, что я добавил инструкцию "pygame.display.flip ()".

Насколько я могу судить,массив, который я использую, обновляет положение фигуры, но по какой-то причине это не переносится на экран.

import pygame
import time
import os
import threading
import queue

pygame.init()

BLACK = (255, 0, 0)
WHITE = (255, 255, 255)
screen_width = 800
screen_height = 600
board_top_left_x = screen_width//5
board_top_left_y = screen_height//10
square_size = screen_height//10
screen = pygame.display.set_mode([screen_width, screen_height])
os.environ['SDL_VIDEO_WINDOWS_POS'] = '10, 10'
commands = queue.Queue


class Input(threading.Thread):
    def run(self):
        while True:
            command = input()
            commands.put(command)


class square(pygame.sprite.Sprite):
    def __init__(self, colour):
        super().__init__()
        self.image = pygame.Surface([square_size, square_size])
        self.rect = self.image.get_rect()
        pygame.draw.rect(self.image, colour, [0, 0, square_size, square_size])
        self.colour = colour


def load_image(name):
    f = pygame.image.load(name + ".png")
    return f


def set_up_board(board):
    board[0][0] = "Rw"
    board[1][0] = "Nw"
    board[2][0] = "Bw"
    board[3][0] = "Qw"
    board[4][0] = "Kw"
    board[5][0] = "Bw"
    board[6][0] = "Nw"
    board[7][0] = "Rw"
    board[0][7] = "Rb"
    board[1][7] = "Nb"
    board[2][7] = "Bb"
    board[3][7] = "Qb"
    board[4][7] = "Kb"
    board[5][7] = "Bb"
    board[6][7] = "Nb"
    board[7][7] = "Rb"
    for i in range(8):
        board[i][1] = "Pw"
        board[i][6] = "Pb"
    return board


def draw_board(board, squares):
    squares.draw(screen)
    for row in range(len(board)):
        for col in range(len(board)):
            if board[col][row] != " ":
                i = load_image(board[col][row])
                i = pygame.transform.scale(i, (square_size, square_size))
                i.set_colorkey(WHITE)
                screen.blit(i, [square_size*col + board_top_left_x, square_size*(7-row) + board_top_left_y])
    pygame.display.flip()


def main():
    squares = pygame.sprite.Group()
     col = BLACK
     I = Input()
     I.start()
     for i in range(8):
         for j in range(8):
             if col == BLACK:
                 col = WHITE
             else:
                 col = BLACK
             x = i*square_size + board_top_left_x
             y = j*square_size + board_top_left_y
             s = square(col)
             s.rect.x = x
             s.rect.y = y
             squares.add(s)
         if col == BLACK:
             col = WHITE
         else:
             col = BLACK
     board = []
     for i in range(8):
          a = []
          for j in range(8):
              a.append(' ')
          board.append(a)
     board = set_up_board(board)
     draw_board(board, squares)
     print("What move do you want to make?")
     answered = False
     while not answered:
         try:
             ans = commands.get(False)
             answered = True
         except queue.Empty:
             ans = None
     board[ord(ans[2]) - 97][int(ans[3]) - 1] = board[ord(ans[0]) - 97][int(ans[1]) - 1]
     board[ord(ans[0]) - 97][int(ans[1]) - 1] = " "
     draw_board(board, squares)
     time.sleep(5)


main()

Я бы ожидал, что это обновит экран с перемещением, покаэто законноИз моей проверки ошибок он выполняет второй оператор if и выдает мне правильные значения px и py после их изменения.Что я пропустил?

[White bishop image][1][Black bishop image][1][Black king image][1][White king image][1][Black knight image][1][White knight image][1][Black pawn image][1][White pawn image][1][Black queen image][1][White queen image][1][Black rook image][1][White rook image][1]

Примечание: ход ввода находится в форме "координаты фигуры, координаты движения", например: d2d4

Примечание2: я также пробовал это сpiece_list вместо board и инструкция piece_list.draw (screen) вместо вложенных циклов.Это дало мне точно такие же результаты.

Ответы [ 2 ]

0 голосов
/ 03 января 2019

У вас нет цикла обработки событий, а рисование на / обновление экрана недостаточно (в зависимости от вашей ОС / оконного менеджера).

Если вы хотите использовать pygame, вам нужно постоянно звонитьpygame.event.get() (или pygame.event.pump(), но просто используйте .get()), в противном случае окно не будет внутренне обрабатывать события из вашей ОС, например, событие, которое заставляет окно рисовать его содержимое.

Итаквам нужно будет создать цикл, в котором вы будете вызывать pygame.event.get().

Если вы хотите получать входные данные от терминала, взгляните на Есть ли способ, при котором я могу запустить Pygame?также запустить консоль тоже?

0 голосов
/ 30 декабря 2018

Хорошо, я посмотрел.Вы сказали:

Из моей проверки ошибок он выполняет второй оператор if и выдает мне правильные значения px и py после их изменения.Что я пропустил?

Но из моих проверок этого не происходит.Ваш piece_list пуст.Итак, здесь:

for p in piece_list:
    if p.x == ord(ans[0]) - 97 and p.y == int(ans[1]) - 1:
        if p.move_is_possible(board, ans, piece_list, squares) is True:

никогда не входит в оператор if s, а board остается без изменений.Если вы на самом деле редактируете board вне этого цикла между двумя вызовами на draw_board(board, squares), доска обновляется правильно.

Также у вас есть p.move_is_possible(board, ans, piece_list, squares), но я нигде не могу найти определение этого метода вваш код.Это в отдельном файле?Это метод спрайта, определенный в Pygame?Я не очень хорошо разбираюсь в pygame, но я не могу найти такой метод в документации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...