Как я могу реализовать эту функцию в моей программе Pygame? - PullRequest
0 голосов
/ 29 января 2019

Итак, я работаю над игрой с сокровищами в виде плитки / сетки, используя Pygame, и я изо всех сил пытаюсь придумать, как реализовать эту функцию.Поэтому, когда пользователь нажимает пробел, он проверяет конкретную плитку (например, с кораблем) и, используя случайное число (для вероятности), должен либо удалить все ваши монеты, либо ничего не делать.И всякий раз, когда вы используете пространство на плитке, вы не сможете снова использовать эту плитку снова.Так что это мои проблемы на данный момент.

import pygame, sys
import random
from pygame.locals import *

pygame.display.set_caption('My first game')

#colours
black = (0, 0, 0)
white = (255, 255, 255)
brown = (153, 76, 0)
blue  = (0, 0, 255)
grey  = (192,192,192)

#game dimensions
tilesize = 20
mapwidth = 30
mapheight = 20


coins = 0
ship = 1
water = 2
rock = 3
movesMade = 4

#dictionary for texture of the map
textures = { #the transform function scales the photo to the tile size
    ship : pygame.transform.smoothscale(pygame.image.load('ship.png'), (tilesize, tilesize)),
    water: pygame.transform.smoothscale(pygame.image.load('water.png'), (tilesize, tilesize)),
    rock: pygame.transform.smoothscale(pygame.image.load('rock.png'), (tilesize, tilesize)),
    coins: pygame.transform.smoothscale(pygame.image.load('chest.png'), (tilesize, tilesize)),
    movesMade: pygame.transform.smoothscale(pygame.image.load('player.png'), (tilesize, tilesize))
    }

inventory = {
    coins: 0,
    ship: 0,
    rock: 0,
    movesMade: 0
    }

#image that will represent player
PLAYER = pygame.transform.smoothscale(pygame.image.load('player.png'), (tilesize, tilesize))

#position of the player
playerPos = [0,0]

resources = [coins, movesMade]

#utilise list comprehension to create grid
tilemap = [[water for w in range(mapwidth)] for h in range(mapheight)]

pygame.init()

#set up display
displaysurf = pygame.display.set_mode((mapwidth*tilesize,mapheight*tilesize + 60))

invfont = pygame.font.Font('FreeSansBold.ttf', 18)

#loops through each row
for rw in range(mapheight):
    for cl in range(mapwidth):
        randomnumber = random.randint(0,15)
        if randomnumber == 0 or randomnumber == 1:
            tile = rock
        elif randomnumber == 2 or randomnumber == 3 :
            tile = ship
        else:
            tile = water
        #sets position in the grid
        tilemap[rw][cl] = tile

while True:
    #user events
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_RIGHT and playerPos[0] < mapwidth - 1:
                playerPos[0] += 1
            if event.key == K_LEFT and playerPos[0] > 0:
                playerPos[0] -= 1
            if event.key == K_UP and playerPos[1] > 0:
                playerPos[1] -= 1
            if event.key == K_DOWN and playerPos[1] < mapheight -1:
                playerPos[1] += 1
            if event.key == K_SPACE:
                currentTile = tilemap[playerPos[1]][playerPos[0]]
                if currentTile == rock:
                    p = 10
                    while p > 0:
                        ran1 = random.randint(0,p)
                        if ran1 % 2 == 0:
                            inventory[coins] == inventory[coins] - inventory[coins]
                            p = p - 1
                        else:
                            p = p - 1

                elif currentTile == ship:
                    inventory[coins] += 50
                    inventory[movesMade] += 1

    #loops through each row 
    for row in range(mapheight):
        #loops through each column in row
        for column in range(mapwidth):
            displaysurf.blit(textures[tilemap[row][column]], (column*tilesize,row*tilesize))

    displaysurf.blit(PLAYER,(playerPos[0]*tilesize,playerPos[1]*tilesize))

    placePosition = 10
    for item in resources:
        displaysurf.blit(textures[item],(placePosition, mapheight*tilesize + 20))
        placePosition += 30
        #text displays amount of coin
        textObj = invfont.render(str(inventory[item]), True, white, black)
        displaysurf.blit(textObj,(placePosition, mapheight*tilesize + 20))
        placePosition += 50

    #if inventory[coins] > 100:
    #    break
    pygame.display.update()

1 Ответ

0 голосов
/ 29 января 2019

Поэтому, когда пользователь нажимает пробел, он проверяет конкретный тайл (например, один с кораблем) и, используя случайное число (для вероятности), должен либо убрать все ваши монеты, либо ничего не делать [...]

== - оператор сравнения.Так что inventory[coins] == inventory[coins] - inventory[coins] сравнивает inventory[coins] с 0 (inventory[coins] - inventory[coins]), и результат не идет никуда.

Если вы исправили проблему, то цикл while будет делать 10 проверок.Вероятность того, что монеты будут потеряны, очень высока:

p = 10
while p > 0:
    ran1 = random.randint(0,p)
    if ran1 % 2 == 0:
        inventory[coins] = inventory[coins] - inventory[coins]
        p = p - 1
    else:
        p = p - 1

Определите процентное значение (percent), которое определяет, что монеты не потеряны, и проверьте, является ли случайное значениепревышает лимит:

percent = 30 # coins are kept with a probability of 30 percent and will be lost by 70 percent 
ran1 = random.randint(0,100) # random value in [0, 99]
    if ran1 >= percent:
    inventory[coins] = 0

[...] И всякий раз, когда вы используете пространство на плитке, вы не сможете снова использовать эту плитку снова.

Создать словарь, в котором будет храниться информация о «используемых» тайлах:

visit = {}

Пометить плитку как «использованную», если было пробел:

pos = (playerPos[1], playerPos[0])
visit[pos] = True

Проверьте, не использовалась ли плитка прямо перед этим:

pos = (playerPos[1], playerPos[0])
if not pos in visit:
    # [...]

Кстати, используйте pygame.Surface.fill(), чтобы очистить дисплей в начале каждого кадра.

displaysurf.fill(black) # choose background color 

Основной код петли listig:

visit = {}
while True:

    displaysurf.fill(black) # choose background color

    #user events
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == KEYDOWN:
            if event.key == K_RIGHT and playerPos[0] < mapwidth - 1:
                playerPos[0] += 1
            if event.key == K_LEFT and playerPos[0] > 0:
                playerPos[0] -= 1
            if event.key == K_UP and playerPos[1] > 0:
                playerPos[1] -= 1
            if event.key == K_DOWN and playerPos[1] < mapheight -1:
                playerPos[1] += 1
            if event.key == K_SPACE:
                pos = (playerPos[1], playerPos[0])
                if not pos in visit:
                    visit[pos] = True
                    currentTile = tilemap[playerPos[1]][playerPos[0]]
                    if currentTile == rock:
                        percent = 30 # coins are kept with a probability of 30 percent and will be lost by 70 percent 
                        ran1 = random.randint(0,100) # random value in [0, 99]
                        if ran1 >= percent:
                            inventory[coins] = 0

                    elif currentTile == ship:
                        inventory[coins] += 50
                        inventory[movesMade] += 1
    # [...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...