Skip to content
103 changes: 103 additions & 0 deletions src/ImageGenerator.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
import os
import re
import sys
from enum import Enum

from PIL import Image
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚫 [mypy] reported by reviewdog 🐶
Cannot find implementation or library stub for module named "PIL" [import-not-found]



# mapファイルのテキストデータを2次元配列に変換するメソッド
def changeList(map_data: list[str]) -> list[list[str]]:
map_list = []
# 各行を一マスごとに分割して配列に格納
for i in range(len(map_data)):
if map_data[i] == "":
break
elif map_data[i][0] == "D":
map_list.append(re.split(",|D:|\n", map_data[i])[1:-1])
# print(map_data[i])
elif map_data[i][0] == "H":
hot = re.split(",|\n", map_data[i].replace("H:", ""))
elif map_data[i][0] == "C":
cool = re.split(",|\n", map_data[i].replace("C:", ""))

map_list[int(cool[1])][int(cool[0])] = "C"
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"H"や”C"だとなんのことか分かりづらいので
列挙型(Enum)を定義して管理したい!

map_list[int(hot[1])][int(hot[0])] = "H"

return map_list


# 一つのmapファイルをpngに変換するメソッド
def drawMapImage(
file_name: str,
dir_path: str,
) -> None:

# 各マスの状態を定義
class Status(Enum):
FLOOR = "0"
WALL = "2"
ITEM = "3"
HOT = "H"
COOL = "C"

# mapファイルを開いてmap_dataにテキストを格納、行ごとに配列にする
with open(dir_path + "/" + file_name, "r") as file:
map_data = file.readlines()

map_list = changeList(map_data)

# アイコン用の画像を開く
floor = Image.open("./icons/floor.png")
wall = Image.open("./icons/wall.png")
item = Image.open("./icons/item.png")
hot = Image.open("./icons/hot.png")
cool = Image.open("./icons/cool.png")

icon_size = floor.width

# 画像の下地を描く
size = (len(map_list[0]) * icon_size, len(map_list) * icon_size)
img = Image.new("RGB", size, (255, 255, 255))

# 各マスのデータに応じて画像を敷き詰める
for i in range(len(map_list)):
for j in range(len(map_list[i])):
if Status(map_list[i][j]) == Status.FLOOR:
img.paste(floor, (j * icon_size, i * icon_size))
elif Status(map_list[i][j]) == Status.WALL:
# 壁
img.paste(wall, (j * icon_size, i * icon_size))
elif Status(map_list[i][j]) == Status.ITEM:
# アイテム
img.paste(item, (j * icon_size, i * icon_size))
elif Status(map_list[i][j]) == Status.COOL:
# cool
img.paste(cool, (j * icon_size, i * icon_size))
elif Status(map_list[i][j]) == Status.HOT:
# hot
img.paste(hot, (j * icon_size, i * icon_size))
else:
# それ以外(床)
img.paste(floor, (j * icon_size, i * icon_size))

# 画像を保存
img.save(dir_path + "/map_images/" + file_name.split(".")[0] + ".png")
# img.show("test.png")


# 全てのmapファイルをpngに変換するメソッド
def main() -> None:

dir_path = sys.argv[1]
file_list = os.listdir(dir_path)

# 画像を格納するディレクトリを作成
os.mkdir(dir_path + "/map_images")

for i in range(len(file_list)):
drawMapImage(file_list[i], dir_path)


if __name__ == "__main__":
main()
Binary file added src/icons/cool.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/icons/floor.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/icons/hot.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/icons/item.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added src/icons/wall.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.