<p>从评论来看,我不确定问题出在哪里。。。让我告诉你我会怎么做,这样我们可以在需要时进一步讨论:</p>
<pre><code>for x in range(MAPWIDTH):
for y in range(MAPHEIGHT):
if tilemap[x][y] == WALL:
# there is a wall at indices x and y
# get neighbouring tiles (check for limits)
go_left = x > 1
go_right = x < MAPWIDTH - 1
go_up = y > 1
go_down = y < MAPHEIGHT - 1
if go_left:
# you can use x-1
tilemap[x-1][y] = WALL # set left tile to WALL
if go_up:
# do something in the diagonal with x-1 y-1?
pass
if go_right:
# you can use x+1
tilemap[x+1][y] = WALL # set right tile to WALL
if go_up:
pass # same story
if go_down:
pass # and again
</code></pre>
<p><strong>编辑</strong>这里有一个简单(因此希望容易理解)的方法</p>
<p>为了使纹理干净,我首先必须旋转墙和角,以获得所有可能的配置(垂直/水平的墙,所有四种可能的角落)</p>
^{pr2}$
<p>我创建了一个wall dict,用<code>in walls</code>快速检查墙的所有6种可能性</p>
<pre><code>walls = {
VWALL : None,
HWALL : None,
CORNERLD: None,
CORNERRD: None,
CORNERLU: None,
CORNERRU: None,
}
</code></pre>
<p>然后我检查地图</p>
<pre><code>for x in range(MAPWIDTH):
for y in range(MAPHEIGHT):
if tilemap[x][y] in walls:
# there is a wall at indices x and y
# get neighbouring tiles (check for limits)
go_left = x > 1
go_right = x < MAPWIDTH - 1
go_up = y > 1
go_down = y < MAPHEIGHT - 1
l_wall = False
r_wall = False
u_wall = False
d_wall = False
if go_left and tilemap[x-1][y] in walls:
# left tile is WALL
l_wall = True
if go_right and tilemap[x+1][y] in walls:
# right tile is WALL
r_wall = True
if go_up and tilemap[x][y-1] in walls:
u_wall = True
if go_down and tilemap[x][y+1] in walls:
d_wall = True
if l_wall and u_wall:
# upper left corner
tilemap[x][y] = CORNERLU
elif l_wall and d_wall:
# down left corner
tilemap[x][y] = CORNERRU
elif r_wall and u_wall:
# upper left corner
tilemap[x][y] = CORNERLD
elif r_wall and d_wall:
# down left corner
tilemap[x][y] = CORNERRD
elif (l_wall or r_wall) and not (u_wall or d_wall):
# tiles in a vertical wall, use VWALL
tilemap[x][y] = VWALL
elif (u_wall or d_wall) and not (l_wall or r_wall):
# tiles in a horizontal wall, use HWALL
tilemap[x][y] = HWALL
</code></pre>
<p>我们得到了</p>
<p><a href="https://i.stack.imgur.com/kvu4Z.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/kvu4Z.png" alt="Your new Minecraft 2D"/></a></p>
<p>请注意,有一些随机的墙壁配置看起来不太好,尽管(T形…),但这些将需要额外的精灵。在</p>
<p>我使用的完整代码可以找到<a href="https://pastebin.com/GKYdRGKw" rel="nofollow noreferrer">here</a></p>
<p><strong>EDIT2</strong>请注意,为了使一切顺利进行,您还需要更新一些内容(例如库存中的墙摄取)
另外,运行这个check every循环的代价很高,因此您应该声明一个<code>env_changed</code>布尔值,以便只在环境发生更改时进行测试。在</p>
<p>对于库存,您需要</p>
<pre><code>if currentTile in walls:
inventory[VWALL] += 1
</code></pre>
<p>这使得VWALL成为库存中的默认墙,并且循环负责将其切换到一个合适的墙以供显示。
剩下的,嗯。。。这是你的游戏,所以我让你想办法;)</p>