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

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

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

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

2490閲覧

10 * 10の2次元配列を矩形で4分割したい

sakageUN

総合スコア27

RPG

RPG (Report Program Generator)とは、IBMの System i(AS/400)サーバ向けのプログラミング言語です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/07/23 11:58

編集2017/07/23 16:41

実現したいこと

list()の2次元配列を用いて、RPGのワールドマップを表現しようとしています。2次元配列の中身は数値です。

  • 草原=0
  • 村 = 1
  • 道 = 100
[ [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

みたいな感じです。

想定しているやり方

  1. 初期化処理として2次元配列を全て0埋めして、縦10、横10の2次元配列を作成します。
  2. 1.で作成した2次元配列を矩形で4つに分割して、エリアを作ります。エリア内には必ず1つの村を作成します。
  3. 村と村との最短距離を計算して、道で繋ぎます。

教えて欲しい部分

参考画像

受け取った2次元配列を矩形に分割して、対応する範囲の座標全てを格納して、リストで返すような関数を作成したいです。

def get_rect(x): # ... # ... 処理内容 # ... return upper_right, upper_left, under_rigth, under_left # 左上、右上、左下、右下の矩形に対応する各々の座標を全てリストに含めて返して欲しい x = [[0 for x in range(10)] for y in range(10)] upper_right, upper_left, under_rigth, under_left = get_rect(x)

色々やってみたのですが、なかなか出来ません...どうかご教授下さい。

環境

  • python3.6.1
  • windows10

(追記しました)私が書いたコード

from pprint import PrettyPrinter def get_rect(maps, h, w): upper_left = [(x, y) for x in range(w) for y in range(h)] upper_right = [(x, y) for x in range(w, len(maps[0])) for y in range(h)] under_left = [(x, y) for x in range(w) for y in range(h, len(maps))] under_right = [(x, y) for x in range(w, len(maps[0])) for y in range(h, len(maps))] return upper_right, upper_left, under_right, under_left # 左上、右上、左下、右下の矩形に対応する各々の座標を全てリストに含めて返して欲しい if __name__ == '__main__': pp = PrettyPrinter(indent=4) x = [[0 for x in range(10)] for y in range(10)] height = len(x) // 2 width = len(x[0]) // 2 upper_right, upper_left, under_right, under_left = get_rect(x, height, width) pp.pprint(upper_left) pp.pprint(upper_right) pp.pprint(under_left) pp.pprint(under_right)

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

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

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

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

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

LouiS0616

2017/07/23 15:13

矩形の取り方が何通りもありますが、そこはランダムに扱うのでしょうか?
sakageUN

2017/07/23 16:03

コメントありがとうございます!矩形は画像のように、常に真ん中で取れたら嬉しいです。また、矩形で取った範囲を更に4分割して...とかも出来れば尚嬉しいです。
LouiS0616

2017/07/23 16:06

マップは常に正方形なのですか?また、一辺の長さが奇数のときはどうするのです?
sakageUN

2017/07/23 16:11

言われてみれば、常に正方形では無いです。ダンジョンのマップ生成にも使おうと思っているので、可変で出来れば嬉しいです。また、いっぺんの長さが奇数の場合、半分に割り切ってしまって構わないです。後出し後出しで本当にすみません!
LouiS0616

2017/07/23 16:26 編集

座標を格納したリストを返すのだったら、半分に割り切ってしまうという戦略は取れないかと。常に片方に偏らせてはダメなのですか?
sakageUN

2017/07/23 16:25

全然OKです!ある程度均等な感覚で村を生成出来れば良いので、多分偏っても平気です!
LouiS0616

2017/07/23 16:27

ちなみにご自身ではどんなコードを組んでみましたか?
sakageUN

2017/07/23 16:46

書いたコードを追記しました。あの、お見せするために少し編集していたら、なんか出来たかもしれません...w
LouiS0616

2017/07/23 16:47

それは何よりです。一応私なりに作ってみているので、完成したら投稿します。
sakageUN

2017/07/23 16:49

おお!本当にありがとうございます!凄く凄く助かります。
guest

回答1

0

ベストアンサー

尋常じゃない醜さですが、適当に作ってみました。

Python

1# 勝手に名前変えちゃいました。 2def quartering_map(map): 3 def get_rect(left_up, right_down): 4 x_range = range(left_up['x'], right_down['x']) 5 y_range = range(left_up['y'], right_down['y']) 6 return [[(x, y) for x in x_range] for y in y_range] 7 8 x_len = len(map[0]) 9 y_len = len(map) 10 11 x_middle = int(x_len / 2) 12 y_middle = int(y_len / 2) 13 14 upper_left_map = 15 get_rect({'x': 0, 'y': 0}, {'x': x_middle, 'y': y_middle}) 16 upper_right_map = 17 get_rect({'x': x_middle, 'y': 0}, {'x': x_len, 'y': y_middle}) 18 under_left_map = 19 get_rect({'x': 0, 'y': y_middle}, {'x': x_middle, 'y': y_len}) 20 under_right_map = 21 get_rect({'x': x_middle, 'y': y_middle}, {'x': x_len, 'y': y_len}) 22 23 return upper_right_map, upper_left_map, under_right_map, under_left_map

試してないですが、こうすれば比率指定も出来そうですね。

Python

1def get_rect_by_ratio(x_ratio_range, y_ratio_range): 2 left_up = {'x': x_ratio_range['len'] * x_ratio_range['from'], 3 'y': y_ratio_range['len'] * y_ratio_range['from']} 4 right_down = {'x': x_ratio_range['len'] * x_ratio_range['to'], 5 'y': y_ratio_range['len'] * y_ratio_range['to']} 6 7 return get_rect(left_up, right_down)

x_ratio_rangeに与えるのは、{'len': x_len, 'from': 1/2, 'to': 1}ってイメージです。
ちょっと改造すれば何分割でも出来そうです。

...もっといい方法があるような気もします。


文字通り「座標」をリストにしましたが、これでいいんですかね。

投稿2017/07/23 16:57

編集2017/07/23 17:10
LouiS0616

総合スコア35660

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

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

sakageUN

2017/07/23 17:06

動作しました!やっと次の作業に進めます...w ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問