gpt4 book ai didi

python - 如何找到资源的坐标?

转载 作者:太空宇宙 更新时间:2023-11-03 21:30:36 24 4
gpt4 key购买 nike

我正在制作一款游戏,我首先制作了一些框架,供我学习和测试游戏中的不同内容。在这个游戏中,我有一个随机生成的图 block map ,其中包含资源泥土、草、水和煤炭。在代码中,还有一些其他不相关的资源,但我想做的是找到游戏中特定资源的坐标。我打算做的是说资源是一堵墙,它下面有一堵墙,旁边的中间墙的纹理将变成一个角 block 。我的问题是我不知道如何找到坐标。有人可以帮助我吗,老实说,我不确定我在做什么,但我正在努力学习。这是我的代码:

import pygame, sys
import Sprites
import random

from pygame.locals import *

pygame.init()


fpsClock = pygame.time.Clock()

cloudx = -200
cloudy = 0

infoObject = pygame.display.Info()

DIRT = 0
GRASS = 1
WATER = 2
COAL = 3
CLOUD = 4
WALL = 5

controls = {
DIRT : 49,
GRASS: 50,
WATER: 51,
COAL : 52,
WALL : 53
}

infoObject = pygame.display.Info()

w = infoObject.current_w
h = infoObject.current_h

TILESIZE = 40
MAPWIDTH = 15
MAPHEIGHT = 15

WHITE = (255,255,255)
BLACK = (0,0,0)

resources = [DIRT, GRASS, WATER, COAL]

textures = {
DIRT : pygame.image.load('Sprites/Dirt.png'),
GRASS : pygame.image.load('Sprites/tile130.png'),
WATER : pygame.image.load('Sprites/Water.png'),
COAL : pygame.image.load('Sprites/Coal.png'),
CLOUD : pygame.image.load('Sprites/Cloud.png'),
WALL : pygame.image.load('Sprites/Swall.png')
}

playerPos = [0,0]

inventory = {
DIRT : 0,
GRASS : 0,
WATER : 0,
COAL : 0,
WALL : 10,
}

tilemap = [[DIRT for w in range(MAPWIDTH)] for h in range(MAPHEIGHT)]



DISPLAYSURF = pygame.display.set_mode((MAPWIDTH*TILESIZE,MAPHEIGHT*TILESIZE + 50))

pygame.display.set_caption('M I N E C R A F T -- 2D')
pygame.display.set_icon(pygame.image.load('Sprites/player.png'))

PLAYER = pygame.image.load('Sprites/Player.png').convert_alpha()

for rw in range(MAPHEIGHT):
for cl in range(MAPWIDTH):
randomNumber = random.randint(0,15)
if randomNumber == 0:
tile = COAL
elif randomNumber == 1 or randomNumber == 2:
tile = WATER
elif randomNumber >= 3 and randomNumber <=7:
tile = GRASS
else:
tile = DIRT

tilemap[rw][cl] = tile

INVFONT = pygame.font.Font('freesansbold.ttf', 18)

print(tilemap)

while True:

currentTile = tilemap[playerPos[1]][playerPos[0]]

DISPLAYSURF.fill(BLACK)

for event in pygame.event.get():
# print(event)
if event.type == QUIT:

pygame.quit()
sys.exit()

elif event.type == KEYDOWN:

for key in controls:


if (event.key == controls[key]):

if inventory[key] > 0:

inventory[key] -=1

inventory[currentTile] += 1

tilemap[playerPos[1]][playerPos[0]] = key

if(event.key == K_RIGHT) and playerPos[0] < MAPWIDTH - 1:
playerPos[0]+=1

elif(event.key == K_LEFT) and playerPos[0] > 0:
playerPos[0]-=1

elif(event.key == K_DOWN) and playerPos[1] < MAPHEIGHT - 1:
playerPos[1]+=1

elif(event.key == K_UP) and playerPos[1] > 0:
playerPos[1]-=1

if event.key == K_SPACE:
currentTile = tilemap[playerPos[1]][playerPos[0]]
inventory[currentTile] += 1
tilemap[playerPos[1]][playerPos[0]] = DIRT

for row in range(MAPHEIGHT):
for column in range(MAPWIDTH):
DISPLAYSURF.blit(textures[tilemap[row][column]],(column*TILESIZE, row*TILESIZE, TILESIZE, TILESIZE))
DISPLAYSURF.blit(PLAYER,(playerPos[0]*TILESIZE,playerPos[1]*TILESIZE))


DISPLAYSURF.blit(textures[CLOUD].convert_alpha(),(cloudx,cloudy))
cloudx +=1

if cloudx > MAPWIDTH*TILESIZE:
cloudy = random.randint(0, MAPHEIGHT*TILESIZE)
cloudx = -200


placePosition = 10
for item in resources:
DISPLAYSURF.blit(textures[item],(placePosition, MAPHEIGHT*TILESIZE+10))
placePosition+=50
textObj = INVFONT.render(str(inventory[item]), True, WHITE, BLACK)
DISPLAYSURF.blit(textObj,(placePosition, MAPHEIGHT*TILESIZE+20))
placePosition += 50

pygame.display.update()
fpsClock.tick(24)

for x in range(MAPWIDTH):
for y in range(MAPHEIGHT):
if tilemap[x][y] == WALL:
pos = tilemap[x][y]
if tilemap[pos[1]][pos[0]-1] == WALL:
print('I DID IT')

pygame.display.update()

编辑:我当前的代码已更新,添加的部分在最后

最佳答案

如果你想找到特定图 block 的坐标,那么这将需要一些工作。也就是说,您的程序必须搜索每个图 block 并进行比较以查看它是否是WALL图 block 。即

for x in range(MAPWIDTH):
for y in range(MAPHEIGHT):
if tilemap[y][x] == WALL:
# Do something here...

但是,这是极其效率低下的。虽然当你的 map 只有 15 x 15 时这可能不是问题,但如果你扩大 map ,它就会开始消耗你的性能。

仅检查屏幕上显示的区域可能是更明智的做法。毕竟,您只是想弄清楚图 block 应该如何显示 - 否则并不重要。

for x in range(30): # Replace with whatever number of tiles is displayed horizontally on the screen, times two
for y in range(30): # Do the same here
if tilemap[y][x] == WALL:
# Do something here

不过,请注意 - 如果这仅用于显示,则更好的解决方案是定义多个 WALL 图 block 。您可以通过创建像 WALL_UPPER_RIGHT 这样的常量来做到这一点,但以列表的形式制作它会是一个更好的主意。

WALL_TILES = [[5, 6, 7],
[8, 9, 10],
[11, 12, 13]]
# WALL_TILES is a 2D list in the format:
# upper left upper middle upper right
# middle left middle middle middle right
# lower left lower middle lower right

然后,您可以使用 WALL_TILES[0][2] 来解决类似 WALL_UPPER_RIGHT 的问题。当您有多个墙砖时,只要墙砖或其旁边的砖发生变化,您只需更改墙砖的类型即可。

添加:

要检查周围的瓷砖是否也是墙砖,您可以检查 x 位置和 y 位置都在中心瓷砖 1 以内的瓷砖。例如,您可以检查tilemap[pos[1]][pos[0]-1]

关于python - 如何找到资源的坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53550275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com