Predator捕食者とprey獲物で時間差をつけたい
獲物の動作周波数(1ク ロック時間の逆数)を捕食者のそれの2/3に落として対戦させたい
1:1のままだと捕らえられる保証がないから。
30クロックで強制終了するゲームで1クロック1秒として
predatorは1秒
preyは1.5秒かかるようにしたい
試したこと
threadingで並列処理みたいなことやってみたけど
どこかがおかしくなって実行されない・・・。
from pprint import pprint from random import choice import sys import time import threading field = [[0,0,0,0,0,0,0,0],\ [0,1,0,0,0,0,0,0],\ [0,0,0,0,0,0,0,0],\ [0,0,2,0,0,0,0,0],\ [0,0,2,0,0,2,0,0],\ [0,0,0,0,0,0,0,0],\ [0,0,0,0,0,3,0,0],\ [0,0,0,0,0,0,0,0]] state=[] freeGrid = 0 predator = 1 obstacleGrid =2 prey = 3 def prey(state):#どこに行くか決める l = ['u','d','l','r','s'] action = choice(l) return action #action はu,d,l,r,sのどれか. def predator(state):#どこに行くかきめる l = ['u','d','l','r','s'] action = choice(l) return action #action はu,d,l,r,sのどれか. def action(position,action,state):#ここで行動を処理する i,j = position #position[0] = i ,position[1] = j if action == 'u' and i != 0\ and state[i-1][j] != obstacleGrid: i -= 1 #i,jがposition、上に行くならiがゼロでない、state(i-1,j)がobstacleGridでない elif action == 'd' and i != 7\ and state[i+1][j] != obstacleGrid: i += 1 elif action == 'l' and j != 0\ and state[i][j-1] != obstacleGrid: j -= 1 elif action == 'r' and j != 7\ and state[i][j+1] != obstacleGrid: j += 1 newPosition = i,j return position,newPosition return result def newState(PreyAct,PredatorAct,state):#盤面に行動を反映 """PreyActはPreyの新しい座標(i,j)を古い座標で値を交換する PreyAct = [[position], PreyAct[0] [newPosition]] PreyAct[1] PreyAct = [[i,j], PreyAct[0] [x,y]] PreyAct[1] PredatorActはPredatorの新しい座標(i,j)を古い座標で値を交換する stateは今の盤面 clockは今の時間 """ #a = state[古いx,古いy] state[PreyAct[0][0]][PreyAct[0][1]],\ state[PreyAct[1][0]][PreyAct[1][1]] =\ state[PreyAct[1][0]][PreyAct[1][1]],\ state[PreyAct[0][0]][PreyAct[0][1]] state[PredatorAct[0][0]][PredatorAct[0][1]],\ state[PredatorAct[1][0]][PredatorAct[1][1]] =\ state[PredatorAct[1][0]][PredatorAct[1][1]],\ state[PredatorAct[0][0]][PredatorAct[0][1]] return state def getPosition(PreyOrPredator,state): #preyは3 #Predatorは1 for i in range(8): for j in range(8): if state[i][j] == PreyOrPredator: position = (i,j) print(position) return position def check(PreyAct,PredatorAct): if PreyAct[1] == PredatorAct[1]: return 1 else: return 0 def main(): state = field #ゲーム開始 print('初期状態') pprint(state) for clock in range(1,31): time.sleep(1) PreyAct = action(getPosition(3,state),prey(state),state) #現盤面からpreyの行動を決める PredatorAct = action(getPosition(1,state),predator(state),state) #現盤面からpredatorの行動を決める state = newState(PreyAct,PredatorAct,state) #行動を反映 print('↓は今( ',clock,' clock)!') pprint(state) if check(PreyAct,PredatorAct) == 1:#捕食されたらcheck()=1で終了 print('GameOver! Winner Predator( ',clock,' clock)!' ) sys.exit() main()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/04 03:49