Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何找到资源的坐标?_Python_Pygame - Fatal编程技术网

Python 如何找到资源的坐标?

Python 如何找到资源的坐标?,python,pygame,Python,Pygame,我正在制作一个游戏,我开始制作一些框架,让我在游戏中学习和测试不同的东西。在这个游戏中,我有一个随机生成的tilemap,其中包含了泥土、草、水和煤等资源。在代码中,有一些其他不相关的资源,但我试图做的是找到游戏中特定资源的坐标。我打算做的是假设资源是一面墙,下面有一面墙,在它旁边,中间墙的纹理将变成一个角块。我的问题是我不知道如何找到坐标。有人能帮帮我吗,我真的不知道我在做什么,但我正在努力学习。 这是我的密码: import pygame, sys import Sprites import

我正在制作一个游戏,我开始制作一些框架,让我在游戏中学习和测试不同的东西。在这个游戏中,我有一个随机生成的tilemap,其中包含了泥土、草、水和煤等资源。在代码中,有一些其他不相关的资源,但我试图做的是找到游戏中特定资源的坐标。我打算做的是假设资源是一面墙,下面有一面墙,在它旁边,中间墙的纹理将变成一个角块。我的问题是我不知道如何找到坐标。有人能帮帮我吗,我真的不知道我在做什么,但我正在努力学习。 这是我的密码:

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()
import pygame,sys
进口雪碧
随机输入
从pygame.locals导入*
pygame.init()
fpscall=pygame.time.Clock()
cloudx=-200
多云=0
infoObject=pygame.display.Info()
污垢=0
草=1
水=2
煤=3
云=4
墙=5
控件={
污垢:49,
草地:50,
水:51,
煤炭:52,
墙:53
}
infoObject=pygame.display.Info()
w=infoObject.current\u w
h=infoObject.current\u h
TILESIZE=40
地图宽度=15
地图高度=15
白色=(255255)
黑色=(0,0,0)
资源=[泥土、草、水、煤]
纹理={
污垢:pygame.image.load('Sprites/DIRT.png'),
GRASS:pygame.image.load('Sprites/tile130.png'),
水:pygame.image.load('Sprites/WATER.png'),
COAL:pygame.image.load('Sprites/COAL.png'),
CLOUD:pygame.image.load('Sprites/CLOUD.png'),
墙:pygame.image.load('Sprites/Swall.png')
}
playerPos=[0,0]
存货={
污垢:0,
草:0,
水:0,
煤:0,,
墙:10,
}
tilemap=[[范围内w的污垢(贴图宽度)]范围内h的污垢(贴图高度)]
DISPLAYSURF=pygame.display.set_模式((MAPWIDTH*TILESIZE,MAPHEIGHT*TILESIZE+50))
pygame.display.set_标题('M I N E C R A F T--2D')
pygame.display.set_图标(pygame.image.load('Sprites/player.png'))
PLAYER=pygame.image.load('Sprites/PLAYER.png')。convert_alpha()
对于范围内的rw(地图高度):
对于范围内的cl(地图宽度):
randomNumber=random.randint(0,15)
如果randomNumber==0:
瓷砖=煤
elif randomNumber==1或randomNumber==2:
瓷砖=水
elif randomNumber>=3和randomNumber 0:
目录[键]-=1
库存[currentTile]+=1
tilemap[playerPos[1]][playerPos[0]]=key
如果(event.key==K_RIGHT)和playerPos[0]0:
playerPos[0]-=1
elif(event.key==K_DOWN)和playerPos[1]0:
玩家角色[1]-=1
如果event.key==K_空间:
currentTile=tilemap[playerPos[1]][playerPos[0]]
库存[currentTile]+=1
tilemap[playerPos[1]][playerPos[0]]=污垢
对于范围内的行(贴图高度):
对于范围内的列(MAPWIDTH):
blit(纹理[tilemap[行][列]],(列*TILESIZE,行*TILESIZE,TILESIZE,TILESIZE))
DISPLAYSURF.blit(PLAYER,(playerPos[0]*TILESIZE,playerPos[1]*TILESIZE))
blit(纹理[CLOUD].convert_alpha(),(cloudx,cloudy))
cloudx+=1
如果cloudx>MAPWIDTH*TILESIZE:
cloudy=random.randint(0,贴图高度*TILESIZE)
cloudx=-200
位置=10
对于资源中的项目:
DISPLAYSURF.blit(纹理[项目],(位置,贴图高度*TILESIZE+10))
位置+=50
textObj=INVFONT.render(str(库存[项目]),真,白,黑)
DISPLAYSURF.blit(textObj,(placePosition,MAPHEIGHT*TILESIZE+20))
位置+=50
pygame.display.update()
时钟。滴答(24)
对于范围内的x(贴图宽度):
对于范围内的y(贴图高度):
如果tilemap[x][y]==墙:
pos=tilemap[x][y]
如果tilemap[pos[1][pos[0]-1]==墙:
打印(‘我做到了’)
pygame.display.update()

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

如果您想找到特定磁贴的坐标,那么需要做一些工作。也就是说,您的程序必须搜索每个磁贴并进行比较,以查看它是否是
磁贴。 i、 e

然而,这是非常低效的。虽然当你的地图只有15乘15时可能不会有问题,但如果你扩展地图,它会开始消耗你的性能

只检查屏幕上显示的区域可能更明智。毕竟,你只是想弄清楚瓷砖应该如何显示——否则没关系

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\u UPPER\u 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\u TILES[0][2]
来解决类似于
WALL\u右上方的问题。当您有多个墙瓷砖时,只要在瓷砖或其旁边的瓷砖发生更改时更改瓷砖的类型即可

添加:


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

@user123非常感谢。你帮了我大忙,你能给我指引正确的方向吗?如何检查它旁边是否有墙式建筑?我也不知道你上一个列表示例的意思。我是新手
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