我想为Python的简单文本游戏制作地图,我想将600*600个画布拆分为100*100*100象限,这些象限与2D列表中的坐标相对应。如果有人知道该怎么做,我想将我的画布分开,并将其分为几个部分作为坐标。谢谢
我的代码:
#dungos + dragos ver 0.1| #
import turtle
def main():
tina = turtle.Turtle()
screen = turtle.Screen()
Map = [[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]]
for row in Map:
for item in row:
print(item, end=' ')
print('n')
screen.setup(600,600)
tina.shape('arrow')
tina.speed(10)
main()
我现在将添加到此信息中,我现在只是在地图上工作。
这是您600x600像素画布顶部的6x6地图的副本。该坐标在四个地图角中,有四个拐角处的部分和画布的角落本身被标记。
您的问题是,如何识别四个角落的画布坐标地图正方形占据的画布广场。每个地图正方形在画布中占据100x100像素正方形。诀窍是找出画布坐标对于任意地图正方形的4个角(i,j)。
(0,0) (599,0)
+------+------+------+------+------+-----+
| | | | | | |
|(0,0) | | | | |(5,0)|
+------+------+------+------+------+-----+
| | | | | | |
| | | | | | |
+------+------+------+------+------+-----+
| | | | | | |
| | | | | | |
+------+------*------*------+------+-----+
| | |######| | | |
| | |######| | | |
+------+------*------*------+------+-----+
| | | | | | |
| | | | | | |
+------+------+------+------+------+-----+
| | | | | | |
| (0,5)| | | | |(5,5)|
+------+------+------+------+------+-----+
(0,599) (599,599)
考虑一些具体示例:
map square canvas square (upper left and lower right corners)
-----------------------------------------------------------------
(0,0) (0,0), (99,99)
(5,5) (500, 500), (599, 599)
不应该太难说服自己,这概括为
map square canvas square
---------------------------------------------------
(i,j) (100*i, 100*j), (100*i+99, 100*j+99)
相反,在MAP Square (x//100, y//100)
中找到了画布中的任意点(x,y)
。
以下是代码显示如何完成类似的事情。
将屏幕坐标值转换为表索引,在handle_clicks()
函数中也会打印最终结果。它显示为一系列单独的计算,使其更容易理解所涉及的内容 - 它们本来可以合并为一个计算,但这会隐藏其背后的数学推理)。
import turtle
SCREEN_MAP_SIZE = 600
SCREEN_QUAD_SIZE = 100
MAP_SIZE = int(SCREEN_MAP_SIZE/SCREEN_QUAD_SIZE)
def display_map(game_map):
""" Output contents of game map. """
for row in game_map:
for item in row:
print(item, end=' ')
print()
def handle_clicks(x, y):
""" Convert screen mouse clicks to game_map indices. """
# Convert coordinate values from range:
# -(SCREEN_MAP_SIZE/2)...(SCREEN_MAP_SIZE/2) -> 0..SCREEN_MAP_SIZE-1
x, y = int(x + SCREEN_MAP_SIZE/2), int(y + SCREEN_MAP_SIZE/2)
# Convert coordinate values from range
# 0..SCREEN_MAP_SIZE-1 -> 0..MAP_SIZE-1
x, y = int(x/SCREEN_MAP_SIZE * MAP_SIZE), int(y/SCREEN_MAP_SIZE * MAP_SIZE)
# Invert y coordinate value from range
# 0..MAP_SIZE-1 -> MAP_SIZE-1..0
y = MAP_SIZE-1 - y
print('clicked on game_map ({}, {})'.format(x, y))
def main():
tina = turtle.Turtle()
screen = turtle.Screen()
screen.onclick(handle_clicks)
game_map = [[0 for _ in range(MAP_SIZE)] for _ in range(MAP_SIZE)]
display_map(game_map)
screen.setup(SCREEN_MAP_SIZE, SCREEN_MAP_SIZE)
tina.shape('arrow')
tina.speed(10)
screen.mainloop()
main()