客户端服务器上的Python游戏

客户端服务器上的Python游戏,python,client,Python,Client,下面是我必须创建的一个简单游戏的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 = ab

下面是我必须创建的一个简单游戏的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

问题并不十分清楚,但您应该首先尝试定义客户端中的内容和服务器上的内容。在您的情况下,应该是这样的:

  • 客户端上的用户交互(提示和获取值)
  • 随机值生成、用户输入验证和服务器高分管理

然后,您必须考虑客户机和服务器如何进行通信:如何开始一个新游戏,需要进行哪些操作(一个方向的猜测值,另一个方向的猜测质量).

代码中的客户机界面只是
原始输入
函数和
打印
语句。实际上,你所需要做的就是将它们转换成插座上的
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")

…
只需使用
nclocalhost 12345
,您甚至不用编写客户机就可以测试这一点。(如果你在Windows上,你没有内置的
nc
;用谷歌搜索“netcat Windows”并给自己一份副本。)然后只需查看
socket.connect的文档,你就应该能够编写客户端了

现在,您可能需要重新组织一下接口。也许客户端应该提供提示并格式化结果(例如,您可以在同一台服务器上使用单独的英语和西班牙语客户端,或者更好的是,使用一个漂亮的GUI客户端)。为此,您需要为客户端和服务器设计某种通信协议。(事实上,即使是上面这个微不足道的例子也有一个隐含的协议:每个提示、响应等都用换行符分隔。我“欺骗”了自己,用
makefile
readline
自动处理。但弄清楚如何分隔消息换行符、长度前缀等只是第一步。)

您可能还想考虑您是否真的想设计一个“原始”的协议,它位于TCP之上,或者使用一些对底层的东西进行维护的服务(Web服务、JSON-RPC在套接字上等等),因此您只需要自己编写特定的应用程序。


最后,这是一个非常非常糟糕的服务器。它只接受一个客户机,并且同步执行所有操作,因此,如果客户机出现故障,服务器将无法恢复。真正的服务器需要所谓的“反应器”或“前置器”(您可以使用
select.select
,或使用
asyncore
或类似
twisted
的第三方软件来构建自己的服务器),或者需要为每个
接受

生成一个新线程或进程,您有什么问题吗?您刚刚粘贴了代码,基本上说了“救命!”。因为我不确定如何将用户界面、游戏逻辑和特定代码分开,以确保它在客户机-服务器体系结构上工作。仅使用IDLE就有很多问题,只需要一个客户机就可以使用它。认为您已经基本涵盖了所有basesOK,但是真正的服务器永远运行,并且可以接受想要连接的任意多个客户端(甚至可以同时接受多个客户端),因此请理解,学习如何编写这样的代码只是编写真正的服务器的第一步…