2017-07-29 7 views
1

私は現在、互いに数字のゲームをしなければならない2つのプログラムをPythonで書いています。 1つのプログラムは1〜100の数字を選びます。そして、もう1つはその数字が何であるかを推測します。推測者がそれを推測するたびに、選択者は「大きすぎる」、「小さすぎる」、または「あなたはそれを持っている」と応答します。その返事に応じて、推測者はそれに応じて次の推測を調整する。ここで2つのプログラムがお互いに対戦しています

は、選択したプログラムのために私のコードです:

import random 
from guesser import g 

guessCount = 0 

number = random.randint(1, 100) 
print("I'm thinking of a number between 1 and 100.") 

outfile = open ('response.txt', 'w') 
guess = 50 
print (guess) 
if guess < number: 
    print('Your guess is too low.') 
    switch = '1' 
    outfile.write (switch + '\n') 

elif guess > number: 
    print('Your guess is too high.') 
    switch = '2' 
    outfile.write (switch + '\n') 
else: 
    print('Correct, You guessed the number in', guessCount, 'guesses.') 
    switch = '3' 
    outfile.write (switch + '\n') 



while guessCount < 8: 
    guess = g 
    print (guess) 
    guessCount += 1 

    if guess < number: 
     print('Your guess is too low.') 
     switch = '1' 
     outfile.write (switch + '\n') 

    elif guess > number: 
     print('Your guess is too high.') 
     switch = '2' 
     outfile.write (switch + '\n') 
    else: 
     print('Correct, You guessed the number in', guessCount, 'guesses.') 
     switch = '3' 
     outfile.write (switch + '\n') 
     break 

outfile.close() 
print('The number was',number) 

そしてここでは、推測を与えるプログラムのコードです:

low = 1 
high = 100 
guess = 0 


guessCounter = 0 

infile = open ('response.txt', 'r') 
switch = int (infile.readline()) 

def g (switch): 

    while switch != 3 and guessCounter < 8: 
     guess = (low+high)//2 
     guessCounter += 1 

     if switch == 1: 
      high = guess 

     elif switch == 2: 
      low = guess + 1 

     return guess  

マイ主な質問は2を取得する方法です相互に相互作用するプログラム。私は現在、レスポンスと呼ばれるテキストファイルを通じて通信する方法を使用しようとしていますが、もっと簡単な方法がありますか?

私はそれはそう持ってる主な問題は(「」)無応答がRESPONSE.TXT現在ありませんので、チューはそれができない推測から変数gを取得しようとしたときにスイッチ= INTを意味するということです

Traceback (most recent call last): File "C:\Users\Jash\Downloads\guesser.py", line 8, in switch = int (infile.readline()) ValueError: invalid literal for int() with base 10: ''

はい、2つの別々のプログラムである必要があります。そして、それはPythonで行われなければなりません。

+0

スクリプトをseperatlyで起動しますか、他のスクリプトのサブプロセスを作成するメインスクリプトが1つあれば問題ありませんか? – michip96

+0

また、ソケットを使用することもできます。 – DazDylz

+0

@ michip96別々に起動するかどうかは関係ありませんが、これは自分のクラスのグループプロジェクト用です。私はそれが動作するまでそれを強打しようとしているポイントに達したhahaどんな助けも大歓迎です。 – Whitekong

答えて

1

両方のプレーヤーを同じプログラムに入れる方がずっと簡単です。あなたが本当に2を使用する場合は、しかし、あなたがUNIXまたはLinux上でこのようにそれらを実行することができます

echo "" > somefile 
tail -f somefile | program1 | program2 >> somefile 

の他の入力にこれます効果的にパイプの各プログラムの出力を。もちろん、見たいものは標準エラーに出力する必要があります。

0

あなたはこのようなあなたのメインのスクリプトから子スクリプトを開くことができます:マットTimmermansで述べたように

from subprocess import Popen, PIPE 

prog = Popen("child.py", shell=True, stdin=PIPE, stdout=PIPE) 

prog.stdin.write("Message to child.py maybe from another child?\n") 
print prog.stdout.read() #Response from child 

prog.wait() # Wait for script to finish run next script 
0

: それは絶対的に必要ありませんであれば、一つのプログラムの中に全体のロジックを置く:

import random 

def createNum(): 
    return random.randint(1,101) 

lastGuess = 0 
randMin, randMax = 1, 101 
def guessNum(sigmoidAdjustmentInt): 
    # sigmoidAdjustmentInt represents a number which is negative, equal to zero or positiv; e.g. [-1/0/+1] 
    # 0 == no information about to big or to small number 
    # -1 == number has to be smaller this time 
    # 1 == number has to be bigger this time 
    # guess somehow; e.g. with random again 
    if sigmoidAdjustmentInt < 0: 
     randMax = lastGuess-1 
    elif 0 < sigmoidAdjustmentInt: 
     randMin = lastGuess+1 
    return random.randint(randMin,randMax) 

def main(): 
    secretNumber = createNum() 
    guessedCorrectly = False 
    triesCounter = 0 
    sigmoidAdjustmentInt = 0 # set here for the first call 
    while not guessedCorrectly: 
     triesCounter = 0 
     if guessNum(sigmoidAdjustmentInt) == secretNumber: 
      guessedCorrectly = True 
      break 
     # print here if too high or low 
    print("needed guesses: "+ triesCounter) 
    # do something else 

createNumとguessNumのrandom.randint(...)呼び出しは、その優先実装のプレースホルダにすぎないことに注意してください。

も参照してくださいどのように複数のスクリプトを実行するには、あなたの質問のためとしてrandom.randint

。それが結果にc.py呼び出した後、それは、何かをするb.pyを呼び出すと、

a.py 
b.py 
c.py 

あなたは a.pyを開始します。 は、あなたが3つのファイルを持っていると言います。あなたは、このようにそれを行うことができます :

再び
# in a.py 
import subprocess 

args = (# rebuild the commandline call of the file here; the following stands for the comandline command: python b.py 
    "python", # every whitespace in the cmd-command is a comma in this args-tuple 
    "b.py" 
) 
popen = subprocess.Popen(args, stdout=subprocess.PIPE) 
popen.wait() 
resultsOfB, errorsOfB = popen.communicate() 
del popen 

args = (# this represents: python c.py someStringValueContainedInResultFromB 
    "python", 
    "c.py", 
    resultOfB # lets just say this var contains a string => if not convert it to one 
) 
popen = subprocess.Popen(args, stdout=subprocess.PIPE) 
popen.wait() 
resultsOfC, errorsOfC = popen.communicate() 
# do something with the results of c.py 

:あなたは3つのすべてのファイルを書き込む場合、一つにそれらを一緒に入れて検討してください。この方法は、サードパーティ製のソフトウェアなどを呼び出す必要がある場合に便利です(例::)

0

第3のレフリープログラムを作成します。ピッカーの名前と推測プログラムの2つの引数を取る。審判プログラムに、2つのプログラムへのリード/ライトパイプを開き、subprocessまたはpexpectモジュールを使用させます。

関連する問題