Уникальное значение в списке - PullRequest
0 голосов
/ 18 февраля 2020

Теперь я создаю игру, похожую на тральщика, в Pygame. Я пытаюсь создать бомбу, которая создает нумерацию, но, к сожалению, у меня нет индекса списка вне диапазона. Моя идея состоит в том, чтобы сгенерировать все 1 числа, а затем, когда координаты совпадают для i-го места в списке, изменить рисунок на 2 et c.

import sys, os
import pygame
import random
import time

from pygame import mixer

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

W, H = 400, 400

pygame.init()
screen = pygame.display.set_mode((W, H))
pygame.display.set_caption("mine")

emp_place_img = pygame.image.load('emp.png').convert_alpha()
emp_place_mask = pygame.mask.from_surface(emp_place_img)
bomb_img = pygame.image.load('bomb.png').convert_alpha()
bomb_mask = pygame.mask.from_surface(bomb_img)
mark1_img = pygame.image.load('mark1.png').convert_alpha()
mark2_img = pygame.image.load('mark2.png').convert_alpha()
mark3_img = pygame.image.load('mark3.png').convert_alpha()

kursor = pygame.image.load('coursor.png').convert_alpha()

kursor_mask = pygame.mask.from_surface(kursor)

emp_place_x = []
emp_place_y = []
emp_place_image = []
emp_place_masking = []

placex = 0
placey=0

bomb_image = []
bomb_masking = []
bomb_x = []
bomb_y = []

mark_image = []
mark_masking = []
mark_x = []
mark_y = []
mark_x_pos = [-25,-25,-25,0,0,0,25,25,25]
mark_y_pos = [-25,0,25,-25,0,25,-25,0,25]
mark_blit_number =0

boom = False
CLOCK = pygame.time.Clock()
def emp_place_blit(x, y, i):
    screen.blit(emp_place_image[i], (x, y))
def bomb_blit(x,y,i):
    screen.blit(bomb_image[i],(x,y))
def mark_blit(x,y,i):
    screen.blit(mark_image[i],(x,y))
def main():
    global boom, emp_place_image, emp_place_img, emp_place_x, emp_place_y, placex, placey,mark_blit_number
    running = True
    while running:
        pygame.mouse.set_visible(True)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        playerx1, playery1 = pygame.mouse.get_pos()

        for i in range(256):
            emp_place_image.append(emp_place_img)
            emp_place_masking.append(pygame.mask.from_surface(emp_place_image[i]))
            emp_place_x.append(placex*25)
            emp_place_y.append(placey)

            placex+=1
            if placex==16:
                placex=0
                placey+=25

        for i in range(256):
            distance = (playerx1 - int(emp_place_x[i])), ((playery1 - int(emp_place_y[i])))
            result = emp_place_masking[i].overlap(kursor_mask, distance)
            if result and pygame.mouse.get_pressed()[0]:
                emp_place_image[i] = pygame.image.load("fill.png")
                if boom == True:
                    sys.exit()
        for i in range(20):
            bomb_image.append(bomb_img)
            randomposx = (random.choice(emp_place_x))
            bomb_x.append(randomposx)
            randomposy = (random.choice(emp_place_y))
            bomb_y.append(randomposy)
            for x in range(9):
                mark_x.append(randomposx+mark_x_pos[x])
                mark_y.append(randomposy+mark_y_pos[x])
                mark_x_add = mark_x
                mark_y_add = mark_y
                mark_x_add_value = mark_x[i]
                mark_y_add_value = mark_y[i]
                mark_x_add.remove(mark_x[i])
                mark_y_add.remove(mark_y[i])
                if mark_x_add_value in mark_x_add and mark_y_add_value in mark_y_add:
                    mark_image.append(mark2_img)
                else:
                    mark_image.append(mark1_img)

        for i in range(20):
            distancebomb1, distancebomb2 = (playerx1 - int(bomb_x[i])), ((playery1 - int(bomb_y[i])))
            if 0<distancebomb1<25 and 0<distancebomb2<25 and pygame.mouse.get_pressed()[0]:
                boom = ""
        for i in range(256):
            emp_place_blit(emp_place_x[i], emp_place_y[i], i)
        for i in range(180):
            mark_blit(mark_x[i], mark_y[i], i)

        for i in range(20):
            bomb_blit(bomb_x[i], bomb_y[i], i)

        screen.blit(kursor,(playerx1, playery1))
        pygame.display.flip()
        pygame.display.update()
        CLOCK.tick(60)

main()

Я знаю, что это, вероятно, не лучший способ сделать эту мини-игру, но я хочу знать, что идет не так и как ее починить По сути, так работает игра (в финальной игре над ней просто будет слой)

[1]

1 Ответ

2 голосов
/ 18 февраля 2020

mark_x_add = mark_x не создает копию списка mark. Для создания мелкой копии списка вы можете использовать do mark_x_add = mark_x[:]. См. Операции мелкого и глубокого копирования .

Более того, управляющая переменная во внутренней l oop равна x, а не i:

mark_x_add = mark_x[:]
mark_y_add = mark_y[:]
mark_x_add_value = mark_x[x]
mark_y_add_value = mark_y[x]
mark_x_add.remove(mark_x[x])
mark_y_add.remove(mark_y[x])

В любом случае, вы все усложняете. Случайные положения для бомб должны быть вычислены до основного применения l oop. Таким образом, позиции для меток могут быть вычислены и до l oop. Используйте словарь для хранения позиций бомб и меток. Например:

grid_size = (16, 16)
field_size = (25, 25)
number_of_bombs = 20
bombs = {}
markpos = [(x, y) for x in range(-1, 2) for y in range(-1, 2) if x != 0 or y !=0]
marks = {}

def main():
    global bombs, marks

    # create random bombs
    while len(bombs) < number_of_bombs:
        bx, by = random.randint(0, grid_size[0]-1), random.randint(0, grid_size[1]-1)
        if (bx, by) not in bombs:
            bombs[(bx, by)] = bomb_img

    # find marks
    for pos in bombs:
        mposlist = [(p[0]+pos[0], p[1]+pos[1]) for p in markpos
                    if 0 <= p[0]+pos[0] < grid_size[0] and 
                       0 <= p[1]+pos[1] < grid_size[1] and
                       (p[0]+pos[0], p[1]+pos[1]) not in bombs]
        for mpos in mposlist:
            marks[mpos] = marks[mpos]+1 if mpos in marks else 1

    running = True
    while running:
        pygame.mouse.set_visible(True)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
        playerx1, playery1 = pygame.mouse.get_pos()

        for x in range(grid_size[0]):
            for y in range(grid_size[1]):
                screen.blit(emp_place_img, (x*field_size[0], y*field_size[1]))

        for pos, img in bombs.items():
            screen.blit(img, (pos[0]*field_size[0], pos[1]*field_size[1])) 

        for pos, count in marks.items():
            img = [mark1_img, mark2_img, mark3_img][min(count-1, 2)]
            screen.blit(img, (pos[0]*field_size[0], pos[1]*field_size[1])) 

        screen.blit(kursor,(playerx1, playery1))
        pygame.display.flip()
        pygame.display.update()
        CLOCK.tick(60)

как я могу добавить больше меток для 4, 5 и c бомб?

Вы должны изменить строку:

img = [mark1_img, mark2_img, mark3_img][min(count-1, 2)]

Создайте список изображений меток где-нибудь в части инициализации. Например:

mark_list = [mark1_img, mark2_img, mark3_img, mark4_img, mar5_img]

и выберите правильное изображение. например:

for pos, count in marks.items():
    img = mark_list[min(count-1, len(mark_list)-1)]
    screen.blit(img, (pos[0]*field_size[0], pos[1]*field_size[1])) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...