2012-11-07 86 views
0

下面是我必須創建的簡單遊戲的Python代碼,現在我難以分開代碼來使用套接字在客戶端和服務器上玩遊戲。任何幫助,將不勝感激客戶端服務器上的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 
+1

你的問題是什麼?你剛剛粘貼你的代碼,並基本上說「幫助我!」。 – Willy

+0

,因爲我不確定如何分離用戶界面和遊戲邏輯以及確保它在客戶端服務器體系結構上運行的特定代碼 –

回答

1

你的代碼中的客戶端接口就是這樣raw_input函數和print語句。實際上,你需要做的就是將這些轉換成套接字上的recvsend調用,並且你有一臺服務器。或者更簡單地說,包裹插座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 12345。 (如果你在Windows上,你沒有內置的nc;谷歌的「netcat Windows」並且給自己一個副本。)然後,看看socket.connect的文檔,你應該可以編寫客戶端。

現在,您可能需要重新組織您的界面。也許客戶端應該提供提示並格式化結果(所以,例如,你可以用同一臺服務器分開英文和西班牙文客戶端,或者更好的GUI客戶端)。要做到這一點,您需要爲客戶端和服務器設計某種協議以用於通信。 (事實上​​,即使是上面的小例子也有一個隱含的協議:每一個提示,響應等都被換行符隔開,我通過使用makefilereadline來自動處理,「欺騙」了,但弄清楚如何分隔消息 - 換行符,長度前綴等)只是第一步。)

您也可能想考慮您是否真的想要設計一個位於TCP之上的「原始」協議,或者使用某些需要處理低級別的東西(一個Web服務,JSON-RPC over sockets等),所以你只需要自己編寫特定於應用程序的東西。

最後,這是一個非常非常糟糕的服務器。它只接受一個客戶端,並且它同步執行所有操作,所以如果客戶端擰緊服務器無法恢復。一臺真正的服務器需要所謂的「反應堆」或「反應器」(您可以使用select.select或使用asyncoretwisted之類的第三方構建自己的服務器),或者需要爲每個accept產生一個新線程或進程。

+0

非常感謝您使用IDLE,只需要一個客戶端即可使用它。認爲你幾乎涵蓋了所有的基地 –

+0

好,但真正的服務器永遠運行,並接受盡可能多的客戶端連接(即使同時多個客戶端),所以要明白,學習如何編寫這樣的代碼只是寫真實服務器的第一步... – abarnert

0

的問題是真不明白,但你應該先嚐試定義發生的事情在客戶端和發生的事情在服務器上。根據你的情況,應該是這樣的:在客戶端上

  • 用戶交互(提示和獲取值)
  • 隨機值生成,在服務器上的用戶輸入和高分的管理驗證

然後,你必須考慮客戶端和服務器如何通信:你如何開始一個新的遊戲,需要去管道(猜一個方向的價值,在另一個方面的猜測質量)...

相關問題