パーソナルブログメモリ

a = [1, 1]
for _ in "*" * 999: a += [sum(a[-2:])]
print(a)

pygameの画面をPILLOWを使ってGIFアニメにしてみる

2018-06-22 | プログラムをマスター計画2020
BOTプログラムコンテストでトップの方にいる人はサーバー側のゲーム本体のシミュレーションを作ってたりします。
そこまでやるのかと驚いています。

コンテストのようなものは作ってみたいなとか考えています。
そこで自前で作ったログからちょっと解析してみることにします。
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()



最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。