客户端服务器上的Python游戏
下面是我必须创建的一个简单游戏的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
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,但是真正的服务器永远运行,并且可以接受想要连接的任意多个客户端(甚至可以同时接受多个客户端),因此请理解,学习如何编写这样的代码只是编写真正的服务器的第一步…