3

我试图制作一个简单的游戏,但无法理解如何让它工作并通过网络发送更多的东西。它第一次工作,但它应该去 10 次。它现在只发送 1 个随机数,但我希望它在游戏再次进行时发送一个新数字并想要一个新数字。

服务器

import socket, random               

sock = socket.socket()
host = socket.gethostname()
port = 12345
sock.bind((host, port))
sock.listen(5)

c, addr = sock.accept()

cpu = random.choice(range(0, 3))
c.send(cpu)

gameon = c.recv(int(1024))

客户

import socket, random

sock = socket.socket()  # Create a socket object
host = socket.gethostname()  # Get local machine name
port = 12345  # Reserve a port for your service.
sock.connect((host, port))

GAMEON = 'Rock', 'Paper', 'Scissors'
game = 0
iwin = 0
ilose = 0
tie = 0

while game < 10:

    for i in range(0, 3):
        print "%d %s" % (i + 1, GAMEON[i])

    player = int(input ("Choose from 1-3: ")) - 1
    cpu = int(sock.recv(1024))
    print cpu

    print""

    print "%s vs %s" % (GAMEON[player], GAMEON[cpu])
    print ""
    if cpu != player:
      if (player - cpu) % 3 < (cpu - player) % 3:
        print "Player wins\n"
        iwin += 1
      else:
        print "CPU wins\n"
        ilose += 1
    else:
      print "TIE!\n"
      tie += 1 
    game += 1
    sock.send(str(game))
print"Game is done"
print"you win: ", (iwin), "Times"
print"computer wins: ", (ilose), "Times"
print"tie: ", (tie), "Times"
4

2 回答 2

2

You need threads to do your bidding.

Example code

# Listen
s.listen(10)
print 'Socket now listening on port ' + str(PORT) + "..."

while 1:
    # wait
    conn, addr = s.accept()

    print 'Connected with ' + addr[0] + ":" + str(addr[1])

    # Let's fork a thread for each request
    processThread = threading.Thread(target=processConnection, args=(conn, addr[0]));
    processThread.start()


s.close()

Your processConnection will look like this:

# Process Connection
def processConnection(conn, ip):
    print "Thread started..."
    print "-------------------------------------------------------------";

    cpu = random.choice(range(0, 3))
    conn.send(cpu)

    gameon = conn.recv(int(1024))

    conn.close()

Update 1

If you need the server to keep talking with the client, then do this. Server will wait for the client to send back a message. If client sends anything, server will return a random number. If the client doesn't need anymore data, just close the connection and server loop will end.

import socket, random               

sock = socket.socket()
host = socket.gethostname()
port = 12345
sock.bind((host, port))
sock.listen(5)

c, addr = sock.accept()

white True:
    cpu = random.choice(range(0, 3))
    c.send(cpu)

    gameon = c.recv(int(1024))

    if gameon is None:
        break
于 2013-01-12T16:12:04.817 回答
2

The problem is that your server will serve one request and then stop. You need to put it in some kind of while loop.

I wrote a basic IM server/client in Python which might help you: https://github.com/hdgarrood/PyMess/blob/master/server/basictcpserver.py#L59

于 2013-01-12T16:15:10.843 回答