Проблема с рэндером изометрии, не могу остановить цикл.

григорий5643

Новичок
Пользователь
Июн 23, 2021
33
1
8
ОС - Windows 10
Pyrhon 3.9.5

cycler 0.10.0
kiwisolver 1.3.1
matplotlib 3.4.2
numpy 1.20.3
perlin-noise 1.7
Pillow 8.2.0
pip 21.1.2
pygame 2.0.1
pyparsing 2.4.7
python-dateutil 2.8.1
setuptools 56.0.0
six 1.16.0]

Прошу прощения, если задал вопрос не корректно, просто начал изучать питон недавно и не совсем еще разобрался. Проблема состоит в том, что я нашел код зарубежного умельца для рендера изометрии, и все было отлично, но при рендере второго слоя мне нужно его не весь заполнять, а скажем, 50%, я делаю это через рандом, и не могу разобраться как сохранить результат рандома, ибо он постоянно генерирует новые вариации.
Вот код:

Python:
import pygame, sys, time
import random

from pygame.locals import *
from pygame.mixer import stop
pygame.init()
screen = pygame.display.set_mode((700, 700),0, 32)
pygame.display.set_caption("game base")
display = pygame.Surface((300, 300))

ground_img = pygame.image.load('ground2.png').convert()
ground_img.set_colorkey((0, 0, 0))
stone_img = pygame.image.load ('stone2.png').convert()
stone_img.set_colorkey((0, 0, 0))

f = open('map.txt')
map_data = [[int(c) for c in row] for row in f.read().split('\n')]
f.close
while True:
    display.fill((0, 0, 0))
    rand = int(random.randint(0, 1))
    for y, row in enumerate(map_data):
        for x, tile in enumerate(row):
            if tile:
                pygame.draw.rect(display, (255, 255, 255), pygame.Rect(x * 10, y * 10, 10, 10), 1)
                display.blit(ground_img, (150 + x * 10 - y * 10, 100 + x * 5 + y * 5))
                if rand:
                    display.blit(stone_img, (150 + x * 10 - y * 10, 100 + x * 5 + y * 5 - 14))
            
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    screen.blit(pygame.transform.scale(display, screen.get_size()), (55, 55))
    pygame.display.update()
    time.sleep(1)

Ссылка на видео из которого я взял код:вот[/SPOILER]
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
как сохранить результат рандома
Можно например запомнить результат рандома в словарь и отрисовывать значения уже из словаря, а не из списка клеток.
Вот пример:
Python:
import pygame
import sys
import time
import random

from pygame.locals import QUIT


pygame.init()
screen = pygame.display.set_mode((700, 700), 0, 32)
pygame.display.set_caption("game base")
display = pygame.Surface((300, 300))

ground_img = pygame.image.load("ground2.png").convert()
ground_img.set_colorkey((0, 0, 0))
stone_img = pygame.image.load("stone2.png").convert()
stone_img.set_colorkey((0, 0, 0))

ground_dict = {}  # словарь {ряд-номер клетки-номер слоя: название картинки}

# читаем данные карты из файла и заполняем ими словарь
with open('map.txt') as f:
    map_data = [[int(c) for c in row.strip()] for row in f]
    for y, row in enumerate(map_data):
        for x, tile in enumerate(row):
            if tile:
                ground_dict[f'{y}-{x}-1'] = 'stone'
                # для второго слоя
                if random.randint(0, 1):
                    ground_dict[f'{y}-{x}-2'] = 'ground'

while True:
    display.fill((0, 0, 0))

    # проходим в цикле по словарю
    for key, value in ground_dict.items():
        # получаем ряд, номер клетки и номер слоя
        y, x, n = list(map(int, key.split('-')))
        # определяем нужную картинку для клетки
        z = stone_img if value == 'stone' else ground_img
        # отрисовываем в зависимости от номера слоя
        if n == 1:
            display.blit(z, (150 + x * 10 - y * 10, 100 + x * 5 + y * 5))
        elif n == 2:
            display.blit(z, (150 + x * 10 - y * 10, 100 + x * 5 + y * 5 - 14))   

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    screen.blit(pygame.transform.scale(display, screen.get_size()), (55, 55))
    pygame.display.update()
    time.sleep(1)
 
  • Мне нравится
Реакции: григорий5643

григорий5643

Новичок
Пользователь
Июн 23, 2021
33
1
8
Можно например запомнить результат рандома в словарь и отрисовывать значения уже из словаря, а не из списка клеток.
Вот пример:
Python:
import pygame
import sys
import time
import random

from pygame.locals import QUIT


pygame.init()
screen = pygame.display.set_mode((700, 700), 0, 32)
pygame.display.set_caption("game base")
display = pygame.Surface((300, 300))

ground_img = pygame.image.load("ground2.png").convert()
ground_img.set_colorkey((0, 0, 0))
stone_img = pygame.image.load("stone2.png").convert()
stone_img.set_colorkey((0, 0, 0))

ground_dict = {}  # словарь {ряд-номер клетки-номер слоя: название картинки}

# читаем данные карты из файла и заполняем ими словарь
with open('map.txt') as f:
    map_data = [[int(c) for c in row.strip()] for row in f]
    for y, row in enumerate(map_data):
        for x, tile in enumerate(row):
            if tile:
                ground_dict[f'{y}-{x}-1'] = 'stone'
                # для второго слоя
                if random.randint(0, 1):
                    ground_dict[f'{y}-{x}-2'] = 'ground'

while True:
    display.fill((0, 0, 0))

    # проходим в цикле по словарю
    for key, value in ground_dict.items():
        # получаем ряд, номер клетки и номер слоя
        y, x, n = list(map(int, key.split('-')))
        # определяем нужную картинку для клетки
        z = stone_img if value == 'stone' else ground_img
        # отрисовываем в зависимости от номера слоя
        if n == 1:
            display.blit(z, (150 + x * 10 - y * 10, 100 + x * 5 + y * 5))
        elif n == 2:
            display.blit(z, (150 + x * 10 - y * 10, 100 + x * 5 + y * 5 - 14))  

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    screen.blit(pygame.transform.scale(display, screen.get_size()), (55, 55))
    pygame.display.update()
    time.sleep(1)
У меня выдает ошибку:

Traceback (most recent call last):
File "c:\Users\Григорий\Desktop\ggg\isom part 2.py", line 38, in <module>
y, x, n = list(map(int(key.split('-'))))
AttributeError: 'int' object has no attribute 'split'

Вот код, если вдруг я что-т0 неверно написал:

Python:
import pygame
import sys
import time
import random

from pygame.locals import QUIT


pygame.init()
screen = pygame.display.set_mode((700, 700), 0, 32)
pygame.display.set_caption("game base")
display = pygame.Surface((300, 300))

ground_img = pygame.image.load("ground2.png").convert()
ground_img.set_colorkey((0, 0, 0))
stone_img = pygame.image.load("stone2.png").convert()
stone_img.set_colorkey((0, 0, 0))

ground_dict = {1: 'stone', 2: 'ground'}  # словарь {ряд-номер клетки-номер слоя: название картинки}

# читаем данные карты из файла и заполняем ими словарь
with open('map.txt') as f:
    map_data = [[int(c) for c in row.strip()] for row in f]
    for y, row in enumerate(map_data):
        for x, tile in enumerate(row):
            if tile:
                ground_dict[f'{y}-{x}-1'] = 'stone'
                # для второго слоя
                if random.randint(0, 1):
                    ground_dict[f'{y}-{x}-2'] = 'ground'

while True:
    display.fill((0, 0, 0))

    # проходим в цикле по словарю
    for key, value in ground_dict.items():
        # получаем ряд, номер клетки и номер слоя
        y, x, n = list(map(int,key.split('-')))
        # определяем нужную картинку для клетки
        z = stone_img if value == 'stone' else ground_img
        # отрисовываем в зависимости от номера слоя
        if n == 1:
            display.blit(z, (150 + x * 10 - y * 10, 100 + x * 5 + y * 5))
        elif n == 2:
            display.blit(z, (150 + x * 10 - y * 10, 100 + x * 5 + y * 5 - 14))   

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()
    screen.blit(pygame.transform.scale(display, screen.get_size()), (55, 55))
    pygame.display.update()
    time.sleep(1)
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
У вас в строке с ошибкой написано:
Python:
y, x, n = list(map(int(key.split('-'))))
а должно быть так:
Python:
y, x, n = list(map(int, key.split('-')))
Еще словарь не нужно заполнять при инициализации, он заполняется из файла:
Python:
ground_dict = {1: 'stone', 2: 'ground'}
замените на
Python:
ground_dict = {}
А лучше просто скопируйте весь код из моего ответа.
 
  • Мне нравится
Реакции: григорий5643

григорий5643

Новичок
Пользователь
Июн 23, 2021
33
1
8
У вас в строке с ошибкой написано:
Python:
y, x, n = list(map(int(key.split('-'))))
а должно быть так:
Python:
y, x, n = list(map(int, key.split('-')))
Еще словарь не нужно заполнять при инициализации, он заполняется из файла:
Python:
ground_dict = {1: 'stone', 2: 'ground'}
замените на
Python:
ground_dict = {}
А лучше просто скопируйте весь код из моего ответа.
Cпасибо за помощь, все подошло и отлично работает!)
 

григорий5643

Новичок
Пользователь
Июн 23, 2021
33
1
8
У вас в строке с ошибкой написано:
Python:
y, x, n = list(map(int(key.split('-'))))
а должно быть так:
Python:
y, x, n = list(map(int, key.split('-')))
Еще словарь не нужно заполнять при инициализации, он заполняется из файла:
Python:
ground_dict = {1: 'stone', 2: 'ground'}
замените на
Python:
ground_dict = {}
А лучше просто скопируйте весь код из моего ответа.
Не подскажите ли еще как добавить коллизии земли и игрока?
 
Последнее редактирование:

Форум IT Специалистов