🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
並列処理

複数の計算が同時に実行される手法

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

536閲覧

python 並列処理? 追跡ゲーム

ab_bcde

総合スコア24

並列処理

複数の計算が同時に実行される手法

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/03 11:14

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()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

スレッドを作るまでもなく、単純にClockの2倍の速度でループを回し、predatorの移動処理を2回に1回、Preyの移動処理を3回に1回行うようにすると良いのではないでしょうか。

Python

1def main(): 2 state = field 3 #ゲーム開始 4 print('初期状態') 5 pprint(state) 6 7 # Clockは MasterClockの2分周 8 clock = 0 9 for master_clock in range(0,60): 10 time.sleep(0.5) 11 if master_clock % 3 == 0: 12 # 移動処理 13 PreyAct = action(getPosition(3,state),prey(state),state) 14 else: 15 # 今回は移動しない 16 PreyAct = (getPosition(3,state), getPosition(3,state)) 17 18 if master_clock % 2 == 0: 19 # 移動処理 20 PredatorAct = action(getPosition(1,state),predator(state),state) 21 else: 22 # 今回は移動しない 23 PredatorAct = (getPosition(1,state), getPosition(1,state)) 24 25 # 行動を反映する 26 state = newState(PreyAct,PredatorAct,state) 27 28 # Clockの更新&表示処理 29 if master_clock % 2 == 0: 30 clock += 1 31 print('↓は今( ',clock,' clock)!') 32 pprint(state) 33 34 # 判定は毎回行う(捕食されたら終了) 35 if check(PreyAct,PredatorAct) == 1: 36 print('GameOver! Winner Predator( ',clock,' clock)!' ) 37 sys.exit()

投稿2019/10/04 02:53

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ab_bcde

2019/10/04 03:49

メシアありがとう!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問