パーソナルブログメモリ

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

乱数AIに教わったこと

2020-02-23 | pygame

ランダムでも一定方向に向かい続けたほうが拡張するためにはよい。

 

スプラトゥーンはガチバトルがB-にあがった。あがった時は キル2 キられ12 と散々な成績

コツはというと、やられてもやられても、めげずにイカダッシュ全力を繰り返す。

接敵するとき入りは少しは変える。

慌てて落ちるので事前に「さんぽ」をする。ガチホコならルートを確認しておく。

 

なんどもイカダッシュを繰り返していて少しやる気がでたので

作りかけのものにユニットの概念とランダム移動をつけてみる。

ランダムなんだけど、一定方向に10回進むにしてみると一気に拡張するようになる。

 

 

 

作成環境

ubuntu 18.04

Python 3.7.5

pygame 1.9.6

 

ソースリスト コピペで動作確認済

#スプラしい
import pygame,random
from itertools import product
from pygame.locals import *
screen = pygame.display.set_mode((900, 600))
bd = [["#" for x in range(300)] for y in range(200)] #ゲームボード(boardの略)
col=[(0,100,0),(0,250,200),(255,200,0)] #色 空間:緑 チーム1:水色 チーム2:黄色
unit=[]#(owner,x,y,d,beforeAction) dとbeforeActionは現在未使用

ri=random.randint
def stageMake():
    global unit
    for i in range(10):#対称になるように空間を空けます。つながらない時もあります
        x,y,r=ri(0, 299),ri(0, 199),ri(30, 50)
        circle(x,y,r,"0","a");circle(299-x,199-y,r,"0","a")
    circle(50,50,50,"0","a");circle(299-50,199-50,50,"0","a")
    for x,y in product(range(300),range(200)):#枠
        if x==0 or y==0 or x==299 or y==199:bd[y][x]="#"
    for i in range(5):#イカは2チーム 5体ずつ
        unit+=[(1,20,20,0,"")]
        unit+=[(2,299-20,199-20,0,"")]

def action():
    for n,u in enumerate(unit):#壁でなければ動き足跡を残す、最後に墨をはく
        o,x,y,d,bf=u
        ac=randMove(o)
        mv=50#移動量  移動コスト 壁:4 相手の色:3 何もなし:2 自分の色:1
        for a in ac:
            dx=[0,0,1,-1]["UDRL".find(a)]
            dy=[-1,1,0,0]["UDRL".find(a)]
            if bd[y+dy][x+dx]!="#":
                if bd[y+dy][x+dx]=="0":mv-=2
                elif bd[y+dy][x+dx]==str(o):mv-=1
                else: mv-=3
                if mv<=0:break
                x+=dx
                y+=dy
                bd[y][x]=str(o)
            else:mv-=4
        unit[n]=(o,x,y,d,ac)
        circle(x,y,5,o,"#")

def randMove(o):
    r=""
    if o==1:
        for i in range(100):r+="UDRL"[ri(0,3)]#ランダム 100歩
    else:
        for i in range(10):r+="UDRL"[ri(0,3)]*10#ランダム10回 直進10歩
    return r

def reset():
    global unit,bd
    bd = [["#" for x in range(300)] for y in range(200)]
    unit=[]
    stageMake()

def main():
    stageMake()
    gameOver=0 #どちらかが50%超えるとゲーム終了とします
    while (1):
        if gameOver==0:
            action()
            screen.fill((0,0,0))
            s1,s2=mapWrite()
            text(40,40,"SPRASII",50,(255,255,255))
            text(540,540,"cyan:"+str(s1)+" vs "+"yellow:"+str(s2),40,(255,100,100))
            if s1>50 or s2>50:gameOver=1
            pygame.display.update()
        for event in pygame.event.get(): #pygameお決まりの処理です
            if event.type == pygame.QUIT:pygame.quit();quit()
            if event.type == KEYDOWN:
                if event.key == K_SPACE:
                    reset()
                    gameOver=0
def mapWrite(): #bdの値によって色をつけます 同時に色によってスコアを計算します
    score=[0,0,0]
    for x,y in product(range(300),range(200)):
        if bd[y][x]!="#":
            score[int(bd[y][x])]+=1
            pygame.draw.rect(screen, col[int(bd[y][x])], Rect(x*3,y*3,3,3))
    return round(score[1]*100/sum(score),1),round(score[2]*100/sum(score),1)
def circle(sx,sy,r,s,o="#"): #円を塗ります oは塗らない条件です
    r2=r*r
    for x,y in product(range(sx-r,sx+r+1),range(sy-r,sy+r+1)):
        if 0<=x<300 and 0<=y<200 and (sx-x)**2+(sy-y)**2<=r2 and bd[y][x]!=o:bd[y][x]=s
def text(x,y,txt,size,c):
    screen.blit(pygame.font.Font(None, size).render(txt, True,(0,0,0)), [x+2, y+2])
    screen.blit(pygame.font.Font(None, size).render(txt, True,c), [x, y])
pygame.init();main();pygame.quit();quit()


最新の画像もっと見る

コメントを投稿

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