2015-06-10 93 views
-1

所以我在一段時間以前在學校用Python製作了一個單人遊戲和十字架遊戲。Python多人遊戲和十字架

score=[[' ',' ',' '],[' ',' ',' '],[' ',' ',' ']] 
global attempts 
attempts = 0 
from random import randint 
from time import sleep 

def grid(): #draws playing grid 
    hideturtle() 
    speed(0) 
    pensize(0) 
    penup() 
    setpos(-200, -67) 
    pendown() 
    fd(400) 
    penup() 
    setpos(-200, 66) 
    pendown() 
    fd(400) 
    penup() 
    seth(90) 
    setpos(-67, -200) 
    pendown() 
    fd(400) 
    penup() 
    setpos(66, -200) 
    pendown() 
    fd(400) 

def drawShape(s, x, y): #draws shape in grid box x and y = coord, s = shape type 
    hideturtle() 
    speed(100) 
    pensize(6) 
    penup() 
    if s == 'X': #draws 'X' 
     pencolor("orange") 
     setpos(-266+(133*x), -266+(133*y)) 
     pendown() 
     seth(135) 
     fd(50) 
     rt(180) 
     fd(100) 
     rt(180) 
     fd(50) 
     rt(90) 
     fd(50) 
     rt(180) 
     fd(100) 
    elif s == 'O': #draws 'O' 
     pencolor("green") 
     setpos(-266+(133*x), -266+(133*y)-40) 
     seth(0) 
     pendown() 
     circle(40) 



def ai(): #EXPERIMENTAL AI 
    x=0 
    y=0 
    d='O' 
    e='O' 
    f='O' 
    for i in range(3): #checks positions 
     if i == 0: 
      d=' ' 
     elif i == 1: 
      d='O' 
      e=' ' 
     elif i == 2: 
      d='O' 
      e='O' 
      f=' ' 
     for c in range(3): 
      if score[c][0] == d and score[c][1] == e and score[c][2] == f: 
       x = c+1 
       y = i+1 
       print('v',c) 
      elif score[c][0] == d and score[c][1] == e and score[c][2] == f: 
       x = i=1 
       y = c+1 
       print('h',c) 
     if score[0][0] == d and score[1][1] == e and score[2][2] == f: 
      print('lr',i) 
      x = i+1 
      y = i+1 
     elif score[0][2] == d and score[1][1] == e and score[2][0] == f: 
      print('rl',i) 
      x = i+1 
      y = 4-i 
    d='X' 
    e='X' 
    f='X' 
    if x == 0 and y == 0: #checks oposition positions 
     for i in range(3): 
      if i == 0: 
       d=' ' 
      elif i == 1: 
       d='X' 
       e=' ' 
      elif i == 2: 
       d='X' 
       e='X' 
       f=' ' 
      for c in range(3): 
       if score[c][0] == d and score[c][1] == e and score[c][2] == f: 
        x = c+1 
        y = i+1 
        print('op v') 
       elif score[c][0] == d and score[c][1] == e and score[c][2] == f: 
        x = i=1 
        y = c+1 
        print('op v') 
      if score[0][0] == d and score[1][1] == e and score[2][2] == f: 
       x = i+1 
       y = i+1 
       print('op bt') 
      elif score[0][2] == d and score[1][1] == e and score[2][0] == f: 
       x = i+1 
       y = 4-i 
       print('op tb') 

    if x == 0 and y == 0: #if no playable positions uses random 
     x = randint(1,3) 
     y = randint(1,3) 
    return x, y 

def valid(u,x,y): #checks player move is valid 
    global attempts 
    if x > 3 or y > 3: 
     print ('Coordinate must be between 1 & 3') 
    elif x == '' or y == '': 
     print("Enter something!") 
    elif score[y-1][x-1] == ' ': 
     score[y-1][x-1] = u 
     drawShape(u, x, y) 
     attempts +=1 
     return True 
    elif score[y-1][x-1] == u: 
     print("You've already gone here! ") 
     return False 
    elif score[y-1][x-1] != u: 
     print("The other player is here! ") 
     return False 


def userAgent(u): #makes AI or user prompts and sets array 
    global attempts 
    global a 
    global b 
    if u == 0: 
     a, b = ai() 
     score[b-1][a-1] = 'O' 
     print("The computer is taking its turn...") 
     print(a,b) 
     sleep(1) 
     drawShape('O', a, b) 
     attempts +=1 
    else: 
     x = input("Player "+u+": enter x coordinate (1-3) ") 
     y = input("Player "+u+": enter y coordinate (1-3) ") 
     try: 
      x = int(x) 
      y = int(y) 
     except ValueError: 
      print("That's not a valid number!") 
      userAgent(u) 
     while True: 
      if valid(u,x,y) == True: 
       break 
      x = input("Player "+u+": enter x coordinate (1-3) ") 
      y = input("Player "+u+": enter y coordinate (1-3) ") 
      try: 
       x = int(x) 
       y = int(y) 
      except ValueError: 
       print("That's not a valid number!") 


def checkWin(n): #checks for a player win (3 in row) or stalemate 
    for i in range(3): 
     if score[i][0] == n and score[i][1] == n and score[i][2] == n: 
      print("Player "+n+" won!") 
      return True 
     elif score[0][i] == n and score[1][i] == n and score[2][i] == n: 
      print("Player "+n+" won!") 
      return True 
    if score[0][0] == n and score[1][1] == n and score[2][2] == n: 
     print("Player "+n+" won!") 
     return True 
    elif score[0][2] == n and score[1][1] == n and score[2][0] == n: 
     print("Player "+n+" won!") 
     return True 
    elif attempts == 9: 
     print("Stalemate!") 
     return True 
    else: 
     return False 

def printGrid(): 
    print(score[2]) 
    print(score[1]) 
    print(score[0]) 

from turtle import * 
grid() 
p = input("Are you playing by yourself? (SINGLE PLAYER EXPERIMENTAL) (y/n) ") 

while True: #runs game until player win 
    if p == 'y': 
     userAgent('X') 
     printGrid() 
     if checkWin('X') == True: 
      break 
     userAgent(0) 
     printGrid() 
     if checkWin('O') == True: 
      break 

    elif p == 'n': 
     userAgent('X') 

     if checkWin('X') == True: 
      break 
     userAgent('O') 

     if checkWin('O') == True: 
      break 

    else: 
     print("You need to type y or n - try again!") 
     p = input("Are you playing by yourself? (SINGLE PLAYER EXPERIMENTAL) (y/n) ") 

input('Press ENTER to exit') 

只是忽略AI功能它現在是永久實驗(不起作用),但這不是問題。

我在我學校的開放式夜晚幫忙,我覺得如果兩個人可以在不同的計算機上相互對戰,那會很酷。所以我會將服務器託管在我的家用PC上,進行端口轉發,完成所有邏輯,客戶端只需要輸入數據,然後將它們發送到服務器上,並由兩位玩家進行移動。我知道HTTP POST/GET,但是如何讓服務器告訴客戶另一個玩家移動了?我研究過Twisted,它看起來不錯,但我真的不明白類(我只是編寫了一段時間)。

這將在學校計算機上,所以我無法訪問客戶端的端口轉發。理想情況下,我也有一個IP白名單,所以只有我想要的計算機可以訪問服務器....

Soooo任何人都可以幫我在這裏嗎?我只需要了解我需要的服務器代碼以及客戶端如何與之交互。謝謝:)

回答

0

您可以從the twisted chatserver example

"""The most basic chat protocol possible. 

run me with twistd -y chatserver.py, and then connect with multiple 
telnet clients to port 1025 
""" 

from twisted.protocols import basic 



class MyChat(basic.LineReceiver): 
    def connectionMade(self): 
     print "Got new client!" 
     self.factory.clients.append(self) 

    def connectionLost(self, reason): 
     print "Lost a client!" 
     self.factory.clients.remove(self) 

    def lineReceived(self, line): 
     print "received", repr(line) 
     for c in self.factory.clients: 
      c.message(line) 

    def message(self, message): 
     self.transport.write(message + '\n') 


from twisted.internet import protocol 
from twisted.application import service, internet 

factory = protocol.ServerFactory() 
factory.protocol = MyChat 
factory.clients = [] 

application = service.Application("chatserver") 
internet.TCPServer(1025, factory).setServiceParent(application) 

客戶可以使用Python的內置telnetlib連接

以後你可以升級到如果你喜歡使用雙絞線對客戶端連接。

0

兩個客戶端通過服務器進行交互的最簡單方法是讓兩個客戶端都輪詢服務器以獲取更新。 (你可以做服務器端事件,但是這對於你正在尋找的東西來說太複雜了)。

但是,如果它們在同一個網絡中,我建議在每個設備上打開一個套接字服務器和客戶端,直接進行通信。

我會做的方式是這樣的:

  1. 套接字服務器在兩臺機器上
  2. 誰在遊戲開始時打開插座端,並直接發送遷移到服務器打開,然後重新打開套接字服務器
  3. 下一步移動計算機將打開一個客戶端併發回一個移動回服務器。

這將取出運行服務器的所有不必要的代碼。

請參閱python手冊中的套接字。服務器/客戶端都有很好的例子。

https://docs.python.org/2/library/socket.html

+0

服務器不必立即回覆連接。通常你可以等到玩家1移動,然後回覆玩家2的連接。等等。 –

+0

是的,這是一個開放式的和許多方法來解決貓問題。 – John

0

你可能想看看ZeroMQ。 http://zeromq.org/

具體而言,您需要PyZMQ。 http://zeromq.github.io/pyzmq/api/zmq.html

設置起來很簡單,您可以直接連接兩臺電腦。你將能夠在兩者之間來回發送消息。

絕對讀取文檔,但您可能會想要一個請求/回覆模式。