0

以下は、ソケットを使用してクライアントとサーバーでゲームをプレイするためのコードを分離するのに苦労している、作成しなければならなかった単純なゲームの Python コードです。任意の助けをいただければ幸いです

import random
rannum = random.randrange(0,10,1)
print rannum
counter = 0
a=0

while(a==0):
    guess = int(raw_input("What is your guess?: "))
    counter = counter + 1

    diff = abs(guess - rannum)
    if(diff >5):
        print "Way Off!"
    elif(diff >2):
        print "Close!"
    elif (diff>1):
        print "Closer!"
    elif(diff >0):
        print "Even Closer!"

    elif (diff==0):
        print "Correct"
        name = str(raw_input("What is your name?: "))
        print name + " Your score is: "
        print counter
        f = open('high_scores.txt', 'a')
        score = str(counter)
        f.write(name + " " + score + "\n")
        f.close()
        break
4

2 に答える 2

1

コード内のクライアント インターフェイスは、raw_input関数とprintステートメントだけです。事実上、これらをソケットに変換recvしてsend呼び出しを行うだけで、サーバーが完成します。または、より単純に、ソケットをラップして、makefile行を読み書きするだけです。

import random
import socket
rannum = random.randrange(0,10,1)
print rannum
counter = 0
a=0

sock = socket.socket()
sock.bind(('127.0.0.1', 12345))
sock.listen(5)
clientsock, addr = sock.accept()
client = clientsock.makefile('r+')

while(a==0):
client.write('What is your guess?: ')
guess = int(client.readline())
counter = counter + 1

diff = abs(guess - rannum)
if(diff >5):
    client.write("Way Off!\n")

…

を使用するだけで、クライアントを作成しなくてもこれをテストできますnc localhost 12345nc(Windows を使用している場合は、ビルトインがありません。Google で「netcat Windows」を検索してコピーを入手してください。) 次に、ドキュメントを参照するだけでsocket.connect、クライアント側を記述できるはずです。

ここで、インターフェースを少し再編成することをお勧めします。おそらく、クライアントはプロンプトを提供し、結果をフォーマットする必要があります (そのため、たとえば、英語とスペイン語のクライアントを同じサーバーで別々に使用できます。または、優れた GUI クライアントを使用することもできます)。そのためには、クライアントとサーバーが通信に使用する何らかのプロトコルを設計する必要があります。makefile(実際、上記の些細な例でさえ、暗黙のプロトコルを持っています。すべてのプロンプト、応答などは改行で区切られています。私はそれを自動的に処理するためにandを使用して「ごまかしました」readline。しかし、メッセージを区切る方法を考え出す - 改行、長さプレフィックスなど—これは最初のステップにすぎません。)

また、TCP の上にある「生の」プロトコルを本当に設計するのか、それとも低レベルのものを処理するもの (Web サービス、JSON-RPC over sockets など) を使用するのかを検討することもできます。 .) したがって、アプリケーション固有のものを自分で作成するだけで済みます。

最後に、これは非常に悪いサーバーです。1 つのクライアントのみを受け入れ、すべてを同期的に実行するため、クライアントが失敗した場合、サーバーは回復できません。実際のサーバーには、「reactor」または「proactor」と呼ばれるものが必要です (または を使用して独自に構築できます) select.select、または ごとに新しいスレッドまたはプロセスを生成する必要があります。asyncoretwistedaccept

于 2012-11-07T09:20:02.217 に答える
0

問題は明確ではありませんが、最初に、クライアントで何が行われ、サーバーで何が行われるかを定義する必要があります。あなたの場合、次のようになります。

  • クライアントでのユーザー操作 (プロンプトと値の取得)
  • ランダム値の生成、ユーザー入力の検証、サーバーでのハイスコアの管理

次に、クライアントとサーバーがどのように通信するかを考える必要があります。新しいゲームをどのように開始するか、何をパイプに入れる必要があるか (一方の方向では値を推測し、他方では推測の質)...

于 2012-11-07T09:19:11.143 に答える