質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

219閲覧

辞書に格納したオブジェクトを使える形で取り出す

sunazuri_ponzu

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/05/12 04:01

実現したいこと

  • 辞書に格納したオブジェクトを取り出して関数を実行したい

前提

pythonでローグライクゲームにおけるダンジョンをランダムに生成するコードを作成しております。
区域分割法を用いてAreaクラスのオブジェクトを分割し、辞書に格納することを繰り返すことでランダム性のある部屋の生成を行おうとしたのですが、辞書に格納したオブジェクトを取り出して関数を実行しようとするとエラーが出たり実行されなかったりします。
vscode上でも色が変わらないし、一度変数に格納するなどしてもAreaクラスのオブジェクトと認識されていないようでした。
初学者ゆえ拙い説明で恐縮ですが、
お力添えいただけますと幸いです。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "c:\Users\81808\Documents\プログラミング\核ムスメ\RandomCreate.py", line 131, in <module> main() File "c:\Users\81808\Documents\プログラミング\核ムスメ\RandomCreate.py", line 121, in main for y in room.size[1]: TypeError: 'int' object is not iterable

該当のソースコード

python

1import random,pygame,sys 2from settings import * 3 4# 定数 5MAP_WIDTH = 50 6MAP_HEIGHT = 50 7ROOM_MIN_SIZE = 5 8ROOM_MAX_SIZE = 15 9player_pos = [600,300] 10 11# エリアクラス 12class Area: 13 def __init__(self, pos, size): 14 self.pos = pos 15 self.size = size 16 self.areas = {} 17 self.parent_areas = [] 18 self.room = [] 19 self.rooms = {} 20 self.new_areas = [] 21 22 # 当たられたエリアを縦or横に二分割する 23 def divide(self): 24 25 if self.size[0] >= self.size[1]: #横の方が長いとき縦に二分割 26 if self.size[0] > (ROOM_MIN_SIZE + 2 + 1) * 2: # 二分割しても部屋が最小サイズより大きいとき 27 divided_width = random.randint(ROOM_MIN_SIZE +2 ,self.size[0]-ROOM_MIN_SIZE-2-1) # 分割の幅をランダムで取得 28 # new_roomに縦に分割されたエリアをリストで格納 29 # 位置と大きさを持ったAreaクラス 30 self.new_areas = [ Area( self.pos, (divided_width, self.size[1]) ), 31 Area( (self.pos[0] + divided_width + 1, self.pos[1]), (self.size[0] - divided_width - 1, self.size[1]) ) ] 32 else: 33 self.new_areas = [None] 34 else: #縦の方が長いとき横に二分割 35 if self.size[1] > (ROOM_MIN_SIZE + 2 + 1) * 2: # 二分割しても部屋が最小サイズより大きいとき 36 divided_height = random.randint(ROOM_MIN_SIZE +2 ,self.size[1]-ROOM_MIN_SIZE-2-1) # 分割の幅をランダムで取得 37 # new_roomに横に分割されたエリアをリストで格納 38 # 位置と大きさを持ったAreaクラス 39 self.new_areas = [ Area( self.pos, (self.size[0], divided_height) ), 40 Area( (self.pos[0], self.pos[1] + divided_height + 1), (self.size[0], self.size[1] - divided_height - 1) ) ] 41 else: 42 self.new_areas = [None] 43 44 # エリア内に部屋を生成 45 def create_room(self): 46 # x,y方向について乱数で部屋の幅を取得 47 room_width = random.randint(ROOM_MIN_SIZE, self.size[0] - 2) 48 room_height = random.randint(ROOM_MIN_SIZE, self.size[1] - 2) 49 # x,y方向について乱数で部屋のtopleftを取得 50 room_pos_x = random .randint(self.pos[0] + 1, self.pos[0] + self.size[0] - room_width - 1) 51 room_pos_y = random.randint(self.pos[1] + 1, self.pos[1] + self.size[1] - room_height - 1) 52 53 self.room = Area((room_pos_x, room_pos_y), (room_width, room_height)) 54 55 # 実行 56 def run(self): 57 # エリアの分割実行 58 self.divide() 59 # 分割エリアをそれぞれ格納 60 self.areas ={"a":self.new_areas[0],"b":self.new_areas[1]} 61 62 while True: 63 self.divide_check = 0 64 for key in list(self.areas.keys()): 65 self.area = self.areas[key] 66 self.area.divide() 67 if self.area.new_areas == [None]: 68 continue 69 random_num = random.random() 70 if (random_num <= 0.7) and (len(key)>=4): 71 continue 72 self.parent_areas.append(key) 73 self.areas.pop(key) 74 self.areas.setdefault(f"{key}a",self.area.new_areas[0]) 75 self.areas.setdefault(f"{key}b",self.area.new_areas[1]) 76 self.divide_check = 1 77 #print(key) 78 if self.divide_check == 0: #すべての部屋が分割されなかったら終了 79 break 80 81 # keyの長い順にソート 82 self.areas = dict(sorted(self.areas.items(), key = lambda r_name : len(r_name[0]),reverse=True)) 83 84 # # エリア内に部屋を生成 85 for key in list(self.areas.keys()): 86 self.area = self.areas[key] 87 self.area.create_room() 88 self.rooms.setdefault(f"{key}",self.area.room) # 部屋をそれぞれ格納 89 print(f"部屋「 {key} 」") 90 # print(self.rooms.keys()) 91 # print(self.areas.values()) 92 93def main(): 94 pygame.init() 95 pygame.display.set_caption("making dungeon") 96 screen = pygame.display.set_mode((1200,600)) 97 image = pygame.image.load("wall.jpg").convert_alpha() 98 image = pygame.transform.scale(image,(TILESIZE,TILESIZE)) 99 while True: 100 for event in pygame.event.get(): 101 if event.type == pygame.QUIT: 102 pygame.quit() 103 sys.exit() 104 screen.fill("black") 105 for key in list(map.rooms.keys()): 106 room = map.rooms[key] 107 for y in room.size[1]: 108 for x in room.size[0]: 109 screen.blit(image,((room.pos[0]+x)*TILESIZE,(room.pos[1]+y)*TILESIZE)) 110 pygame.display.update() 111 112 113 114if __name__ == "__main__": 115 map = Area((0, 0), (50, 50)) 116 map.run() 117 main() 118 # for key in map.areas.keys(): 119 # print(key) 120 # for value in map.areas.values(): 121 # print(value)

試したこと

一度オブジェクト化したりしましたが、うまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2023/05/12 04:16

「for y in room.size[1]:」というコードにおいて - room.size[1]に入っていると期待する値とその意味 - このforループでやりたいこと、期待する結果 を記載ください。 (たとえば「for y in range(room.size[1]):」ではないのか?)
sunazuri_ponzu

2023/05/12 04:23

コメントありがとうございます! ご指摘の通りrangeでした、初歩的なミスに気づけていなかったです。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問