BOTプログラムコンテストでトップの方にいる人はサーバー側のゲーム本体のシミュレーションを作ってたりします。
そこまでやるのかと驚いています。
コンテストのようなものは作ってみたいなとか考えています。
そこで自前で作ったログからちょっと解析してみることにします。
PILLOWでGIFアニメを作れるようなので対戦経過の簡易画像を作ってみました。
タイトルの部分は2つの関数です。
そこまでやるのかと驚いています。
コンテストのようなものは作ってみたいなとか考えています。
そこで自前で作ったログからちょっと解析してみることにします。
PILLOWでGIFアニメを作れるようなので対戦経過の簡易画像を作ってみました。
タイトルの部分は2つの関数です。
def PygameImageToPillowImage(images): img = Image.new('RGB', (800, 600),(0,0,0)) for x in range(800): for y in range(600): c=screen.get_at((x,y)) img.putpixel((x,y),(c.r,c.g,c.b)) images.append(img) def gifAnime(images): images[0].save('stage.gif', save_all=True, append_images=images[1:],optimize=False, duration=200, loop=0) pygameで作成した画面のscreen情報をPILLOWのImage形式に移してimagesという画像のリストに追加しています。 1ドットずつカラーに分解しています。 gifアニメを作っているところは最初に表示させる画像.saveで初めて残りのリストをappend_imagesの個所で定義しています。 kuturu.txt まずログ(一部) 1 ST Lara Croft 2 ND Lara Croft 3 RD field3 4 TH Lara Croft Standard Error Stream: #################### #...#..............# #.#...#.#.#.##.#.#.# #...#..............# ###...##.##.#w#.#.## #...#.#...w.#......# #.#.w...#.#.#.##.#.# #.#.###........#...# #.......#.##.#...#.# #.#.#w#.#......#...# #...#......#.#w#.#.# #.#...#.##.#.......# #...#........###.#.# #.#.##.#.#.#...w.#.# #......#.w...#.#...# ##.#.#w#.##.##...### #..............#...# #.#.#.##.#.#.#...#.# #...#..........#...# #################### 0 EXPLORER 7 7 250 2 3 1 EXPLORER 12 7 250 2 3 2 EXPLORER 7 12 250 2 3 3 EXPLORER 12 12 250 2 3 Standard Output Stream: MOVE 8 7 002 282 Standard Output Stream: WAIT 003 282 Standard Output Stream: WAIT 004 282 Standard Output Stream: WAIT 005 282 Standard Error Stream: 0 EXPLORER 8 7 246 2 3 1 EXPLORER 12 7 246 2 3 2 EXPLORER 7 12 246 2 3 3 EXPLORER 12 12 246 2 3 4 WANDERER 13 4 4 0 -1 5 WANDERER 10 5 4 0 -1 6 WANDERER 4 6 4 0 -1 7 WANDERER 5 9 4 0 -1 8 WANDERER 14 10 4 0 -1 9 WANDERER 15 13 4 0 -1 10 WANDERER 9 14 4 0 -1 11 WANDERER 6 15 4 0 -1 Standard Output Stream: MOVE 7 7 006 282 Standard Output Stream: LEFT 007 282 Standard Output Stream: RIGHT 008 282 Standard Output Stream: UP 009 282 Standard Error Stream: 0 EXPLORER 7 7 242 2 3 1 EXPLORER 11 7 242 2 3 2 EXPLORER 8 12 242 2 3 3 EXPLORER 12 11 242 2 3 4 WANDERER 13 4 3 0 -1 5 WANDERER 10 5 3 0 -1 6 WANDERER 4 6 3 0 -1 7 WANDERER 5 9 3 0 -1 8 WANDERER 14 10 3 0 -1 9 WANDERER 15 13 3 0 -1 10 WANDERER 9 14 3 0 -1 11 WANDERER 6 15 3 0 -1 Standard Output Stream: MOVE 8 7 010 282 Standard Output Stream: LEFT 011 282 Standard Output Stream: RIGHT 012 282 Standard Output Stream: DOWN 013 282 Standard Error Stream: 0 EXPLORER 8 7 239 2 3 1 EXPLORER 10 7 239 2 3 2 EXPLORER 9 12 238 2 3 3 EXPLORER 12 12 238 2 3 4 WANDERER 13 4 2 0 -1 5 WANDERER 10 5 2 0 -1 6 WANDERER 4 6 2 0 -1 7 WANDERER 5 9 2 0 -1 8 WANDERER 14 10 2 0 -1 9 WANDERER 15 13 2 0 -1 10 WANDERER 9 14 2 0 -1 11 WANDERER 6 15 2 0 -1 Standard Output Stream: MOVE 9 7 014 282 Standard Output Stream: WAIT 015 282 Standard Output Stream: RIGHT 016 282 Standard Output Stream: LEFT 017 282 プログラム フォントはubuntu18.04にあるものにしています。 ubuntu16.04ならtakaoの方をコメントアウトしてみてください。 import pygame from pygame.locals import * import copy import sys import time from PIL import Image, ImageDraw pygame.init() window_size = (800, 600) screen = pygame.display.set_mode(window_size) #font = pygame.font.SysFont("takao", 16) font = pygame.font.SysFont("notosansmonocjkjp", 32) class Unit: def __init__(self,line): id,et, x, y, p0, p1, p2 = line.split() self.et=et self.id=int(id) self.x=int(x) self.y=int(y) self.p0=int(p0) self.p1=int(p1) self.p2=int(p2) def write(self): print(str(self.id)+" "+self.et+" "+str(self.x)+" "+str(self.y)+" "+str(self.p0)+" "+str(self.p1)+" "+str(self.p2), file=sys.stderr) def writeMap(m): for y in range(len(m)): for x in range(len(m[y])): locPrint(x,y,m[y][x]) def setMp(x,y,s,m): m[y]=m[y][:x]+s+m[y][x+1:] def locPrint(x,y,s): c=(0, 255, 0) if s=="#":c=(0,0,255) if s=="A":c=(255,0,0) if s=="S":c=(255,0,255) #if s=="E":c=(0,255,0) if s==".":c=(64,0,0) if s=="w":c=(128,128,128) text = font.render(s, True, c) screen.blit(text, [x * 24-y*8+230, y * 16+100]) def MapSetUnit(mp): mpd=copy.deepcopy(mp) for u1 in u: if u1.et=="SLASHER": setMp(u1.x,u1.y,"S",mpd) if u1.et=="WANDERER": setMp(u1.x,u1.y,"A",mpd) if u1.et=="EXPLORER": setMp(u1.x,u1.y,str(u1.id),mpd) return mpd def PygameImageToPillowImage(images): img = Image.new('RGB', (800, 600),(0,0,0)) for x in range(800): for y in range(600): c=screen.get_at((x,y)) img.putpixel((x,y),(c.r,c.g,c.b)) images.append(img) def gifAnime(images): images[0].save('stage.gif', save_all=True, append_images=images[1:],optimize=False, duration=200, loop=0) mp=[] u=[] images=[] def decode(): f = open('kuturu.txt') lines = f.readlines() f.close() inputSw=-1 firstMap=1 for l in lines: l=l.replace(chr(10),"") if l=="Standard Error Stream:": inputSw=1 if len(u)>0: wmp=MapSetUnit(mp) screen.fill((0,0,0)) writeMap(wmp) pygame.display.flip() PygameImageToPillowImage(images) #time.sleep(0.25) del u[:] elif l=="Standard Output Stream:": inputSw=0 elif inputSw==1:### input if firstMap==1: if l[0]=="#": mp.append(l) else: firstMap=0 if firstMap==0: u.append(Unit(l)) elif inputSw==0:### print pass gifAnime(images) end_game = False while not end_game: for event in pygame.event.get(): if event.type == pygame.QUIT: end_game = True pygame.quit() quit() decode()