2014-02-11 2 views
0

Я пытаюсь написать игру менеджер/контроллер для игры, как крестики-нолики или шашки/шахматы, которая работает так:скриптов Python общаться

игры Арбитр: Управляют геймплей игры и реле противника перемещается к каждому игроку. Также определяет, является ли движение является юридическим один

GamePlayer.py

  • Сыграет движение, отвечая на вопрос Арбитра

GameArbiter.py

  • будет решить, какой игрок идет первым
  • Решает, является ли закон движением
  • будет держать ссылку на двух игроков
  • задаст правильный плеер для движения и обеспечить текущий GameState

Проблема у меня есть, как будет Арбитра общаться с игроками? Я хотел использовать PIPE.communicate(), но кажется, что он работает только в том случае, если Player заканчивается после каждого запроса .communicate(). Мой код как таковой:

GameArbiter.py:

import subprocess 
import sys 

player1 = subprocess.Popen([sys.executable, "GamePlayer.py"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

instruction = "GetMove" 
out, _ = player1.communicate(instruction.encode()) 
print(out.decode())  # process input from player 

# do some stuff 

instruction = "GetMove" 
out, _ = player1.communicate(instruction.encode()) 
print(out.decode())  # process input from player 

GamePlayer.py:

instruction = input() 
if(instruction == "GetMove"): 
    print("Bc4xc5") 
else: 
    print("InvalidInstruction") 

Конечно, после второго .communicate() питон падает, так как player1 больше не является открытым файл

Мой вопрос: как я могу написать (на python) делегата, который мог бы активно разговаривать с несколькими дочерними асинхронно?

ответ

0

Почему вы не делаете GamePlayer функцией, которая называется бесконечно?

Или еще лучше, класс, для которого каждый игрок в игре, который наследует его.

+0

Код абзаца для завершения моих целей - это одно, но я не знаю, как заставить его работать в теории. Это на первый взгляд – Parad0x13

1

communicate является высокоуровневой функцией, которая находится на вершине player1.stdin.write и player1.stdout.read. Существует способ реализовать то, что вы пытаетесь сделать, но это введет большую сложность в ваш код (вам нужно будет создавать отдельные потоки для чтения из другого процесса, очистки и т. Д.). Если вы хотите пройти все это, вы можете проверить исходный код функции communicate.

Более стандартное решение будет использовать архитектуру клиент-сервер для связи по сети

1

Если все это происходит на одной машине, то я бы интересно, если вам нужно иметь отдельные процессы.

Если цель состоит в том, чтобы переместить процессы проигрывателя на отдельные машины, я бы предложил вам использовать сетевую связь между процессами в типичной модели клиент-сервер. В этом случае я бы порекомендовал Twisted

Что такое Twisted?

Twisted - это сетевой механизм, управляемый событиями, написанный на Python и лицензированный под лицензией MIT с открытым исходным кодом.

+0

Если бы я хотел сделать это на одном компьютере, но эмулировать его как сеть, это возможно? Например, напишите его для работы в сети, но вместо этого запустите его на одном компьютере? – Parad0x13

+0

Да, вся сетевая связь (TCP-сокеты и т. Д.) Может происходить локально путем подключения к loopback-адресу (127.0.0.1 для ipv4) вместо адреса удаленного сервера –

Смежные вопросы