通过传递坐标 Blit 棋盘上的白色方块
Blit white squares on a chessboard by passing coordinates
我的问题是我无法正确blit
几个方块在正确的位置。
我写了一些代码来显示棋盘。方块不是精灵,而是 pygame.Surface 个对象。
我的项目目前包含两个 .py 文件:
- display.py
- coordinator.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 BlackSquare
和 WhiteSquare
中添加构造函数并将其移动到主游戏循环之前。例如:
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
移动到主游戏循环之前,并添加一个构造函数,其中包含白色方块、黑色方块和白色列的参数(稍后您必须添加黑色列也是)。
添加一个Method(draw
),可以在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()
我的问题是我无法正确blit
几个方块在正确的位置。
我写了一些代码来显示棋盘。方块不是精灵,而是 pygame.Surface 个对象。
我的项目目前包含两个 .py 文件:
- display.py
- coordinator.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 BlackSquare
和 WhiteSquare
中添加构造函数并将其移动到主游戏循环之前。例如:
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
移动到主游戏循环之前,并添加一个构造函数,其中包含白色方块、黑色方块和白色列的参数(稍后您必须添加黑色列也是)。
添加一个Method(draw
),可以在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()