通过传递坐标 Blit 棋盘上的白色方块

Blit white squares on a chessboard by passing coordinates

我的问题是我无法正确blit几个方块在正确的位置。

我写了一些代码来显示棋盘。方块不是精灵,而是 pygame.Surface 个对象。

我的项目目前包含两个 .py 文件:

协调器是一个函数,它 returns 一个包含两个元组列表的列表,一个用于偶数列,一个用于奇数列。元组是我传递给 blit 方法的实际坐标。

在这个阶段,我只处理白色方块。

display.py 文件是实际显示,目前还包含正方形 classes 和棋盘 class。

这是我的 coordinator.py:

# Returns a list containing two lists of tuples, one for even columns (white squares), and
# one for odd columns (white squares).

# Needs to be implemented to achieve the same for black squares.

def coordinator():
    odd_columns = white_odd_columns()
    even_columns = white_even_columns()
    columns = [odd_columns, even_columns]
    # print(columns)
    return columns
    # print('odd_columns: ' + str(odd_columns))
    # print('even_columns: ' + str(even_columns))

# Returns a list with coordinates
# for white squares in odd columns
def white_odd_columns():
    odd_coordinates = []
    for x in range(0, 800, 200):
        y = 0
        for first_column in range(0, 5):
            odd_coordinates.append((x, y))
            y += 200
    # print('This should be the complete list of odd coordinates' + str(odd_coordinates))
    return odd_coordinates

# Returns a list with coordinates
# for white squares in even columns
def white_even_columns():
    even_coordinates = []
    for x in range(100, 800, 200):
        y = 100
        for first_column in range(0, 4):
            even_coordinates.append((x, y))
            y += 200
    # print('This should be the complete list of even coordinates' + str(even_coordinates))
    return even_coordinates

# white_even_columns()
# white_odd_columns()
coordinator()

这是我的 display.py:

import pygame
import sys
from coordinator import coordinator

# Sets up the display

pygame.init()
window_size = (800, 800)
game_window = pygame.display.set_mode(size=window_size)
pygame.display.set_caption('My Game')

# Event loop (outer)
while 1:

    white_columns = coordinator()
    # print(white_columns)
    odd_white_columns = white_columns[0]
    # print(odd_white_columns)
    even_white_columns = white_columns[1]
    # print(even_white_columns)
    l = len(even_white_columns)
    # print(l)
    n = 0
    for n in range(l + 1):
        x = odd_white_columns[n]
        print(x)

    # Event loop (inner)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    class WhiteSquare:
        height = int(window_size[0] / 8)
        width = int(window_size[1] / 8)
        a = height
        b = width
        white_square = pygame.Surface((a, b))
        white_square.fill((255, 255, 255), )

    ws = WhiteSquare()

    class BlackSquare:
        height = int(window_size[0] / 8)
        width = int(window_size[1] / 8)
        a = height
        b = width
        black_square = pygame.Surface((a, b))
        black_square.fill((0, 0, 255), )

    bs = BlackSquare()

    class ChessBoard:
        game_window.blit(ws.white_square, x)  # test
        game_window.blit(bs.black_square, (0, 100))  # test

    cb = ChessBoard()
    pygame.display.update()

请不要考虑以下内容:

game_window.blit(bs.black_square, (0, 100))

这只是为了确保我在传递一些坐标时实际上可以 blit 正方形。

令我困扰的是第 61 行的以下内容:

game_window.blit(ws.white_square, x)

事实上,我想做的是访问协调器返回的每个元组,使用以下代码从第 21 行开始:

l = len(even_white_columns)
# print(l)
n = 0
for n in range(l + 1):
    x = odd_white_columns[n]
    print(x)

我正在打印元组只是为了确保它们是正确的并且它们都是。嗯,都还好。

我不明白的是,为什么当 运行 代码时,显示的唯一白色方块看起来是 (200, 600) 处的那个。

我觉得它与存储元组或更新显示有关,但目前它看起来超出了我的范围。

有人可以向我解释我做错了什么吗?我也可能通过实际迭代并尝试传递坐标来做错事。

或者可能是我必须使用 blit 而不是 blit,以便我可以传递一系列 blit。如果是这样,我实际上无法弄清楚如何使用此方法,因为在 Stack Overflow 上的示例中它只是作为一个函数显示。

感谢您的帮助。

我建议阅读 Instance Objects and Method Objects 的概念。

无论如何,在 classes BlackSquareWhiteSquare 中添加构造函数并将其移动到主游戏循环之前。例如:

class BlackSquare:
    def __init__(self):
        self.height = int(window_size[0] / 8)
        self.width = int(window_size[1] / 8)
        self.black_square = pygame.Surface((self.width, self.height))
        self.black_square.fill((0, 0, 255))

class WhiteSquare:
    def __init__(self):
        self.height = int(window_size[0] / 8)
        self.width = int(window_size[1] / 8)
        self.white_square = pygame.Surface((self.width, self.height))
        self.white_square.fill((255, 255, 255))

将 class ChessBoard 移动到主游戏循环之前,并添加一个构造函数,其中包含白色方块、黑色方块和白色列的参数(稍后您必须添加黑色列也是)。
添加一个Methoddraw),可以在2个嵌套循环中绘制白色方块(self.ws)和存储在self.white_columns中的位置。例如:

class ChessBoard:
      def __init__(self, ws, bs, white_columns):
          self.ws = ws
          self.bs = bs
          self.white_columns = white_columns

      def draw(self):
          for colums in self.white_columns:
              for p in colums: 
                  game_window.blit(self.ws.white_square, p)

在游戏循环之前创建对象并通过调用cb.draw()在循环中绘制棋盘。例如:

pygame.init()
window_size = (800, 800)
game_window = pygame.display.set_mode(window_size)
pygame.display.set_caption('My Game')

white_columns = coordinator()
# print(white_columns)
odd_white_columns = white_columns[0]
# print(odd_white_columns)
even_white_columns = white_columns[1]

ws = WhiteSquare()
bs = BlackSquare()
cb = ChessBoard(ws, bs, white_columns)

# Event loop (outer)
while 1:

    # Event loop (inner)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()

    game_window.fill(0)
    cb.draw()
    pygame.display.update()