Рок-бумага-ножницы игра с использованием сокетов в Python - PullRequest
0 голосов
/ 07 октября 2018

Я хотел бы написать очень простую игру «камень-ножницы-бумага» на Python.Я хотел бы иметь 1 сервер и 2 клиента.После подключения к серверу сервер должен отправить сообщение каждому клиенту для выбора (r / p / s).После этого каждый клиент должен отослать свой выбор, а затем сервер принимает решение о победителе, а затем информирует клиентов о победителе.

Это то, что я имею до сих пор:

Этоэто server.py

import socket
from threading import Thread

class ClientThread(Thread):
    def __init__(self, ip, port):
        Thread.__init__(self)
        self.ip = ip
        self.port = port
        print("[+] New server socket thread started for " + ip + ":" + str(port))

    def run(self):
        while True:
            data = conn.recv(1024).decode()
            print("Server received data:", data)
            MESSAGE = input("Server response: ")
            if MESSAGE == 'exit':
                break
            conn.send(MESSAGE.encode())

TCP_IP = '0.0.0.0'
TCP_PORT = 2004
BUFFER_SIZE = 1024

tcpServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpServer.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpServer.bind((TCP_IP, TCP_PORT))
threads = []

while True:
    tcpServer.listen(4)
    print("Multithreaded Python server : Waiting for connections from TCP clients...")
    (conn, (ip, port)) = tcpServer.accept()
    newthread = ClientThread(ip, port)
    newthread.start()
    threads.append(newthread)

for t in threads:
    t.join()

Это clientA.py:

import socket

host = socket.gethostname()
port = 2004
BUFFER_SIZE = 1024
MESSAGE = input("tcpClientA:")

tcpClientA = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpClientA.connect((host, port))

while MESSAGE != 'exit':
    tcpClientA.send(MESSAGE.encode())
    data = tcpClientA.recv(BUFFER_SIZE).decode()
    print(" ClientA received data:", data)
    MESSAGE = input("tcpClientA:")

tcpClientA.close()

Это clientB.py:

import socket

host = socket.gethostname()
port = 2004
BUFFER_SIZE = 1024
MESSAGE = input("tcpClientB:")

tcpClientB = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpClientB.connect((host, port))

while MESSAGE != 'exit':
    tcpClientB.send(MESSAGE.encode())
    data = tcpClientB.recv(BUFFER_SIZE).decode()
    print(" ClientB received data:", data)
    MESSAGE = input("tcpClientB:")

tcpClientB.close()

В этом коде, однако,Я могу только отправлять сообщения на сервер, и он может отвечать.К сожалению, я не знаю, как я могу отправлять сообщения конкретному клиенту в этом случае.(Мне нужно отправлять разные сообщения победителю и проигравшему).

1 Ответ

0 голосов
/ 07 октября 2018

Во-первых, это не тривиальное упражнение, и оно потребует приличного понимания того, как работают потоки и как с ними работать, в частности, в Python.То, что вы, похоже, упускаете в данный момент, - это способ организации связи от двух клиентов и отслеживания того, что играл каждый клиент, чтобы вы могли решить, какой клиент выиграет.

В настоящее время происходит то, что когда tcpClientA.connect((host, port)) работает на клиенте A, (conn, (ip, port)) = tcpServer.accept() разблокируется на сервере.Это создаст новый экземпляр вашего ClientThread класса, и новый поток начнет прослушивать данные, которые будут отправлены клиентом A по соединению.Когда клиент B запускается, происходит то же самое, и теперь у вас есть 2 потока, которые работают и слушают данные, но нет никакого способа узнать, что и во что играет.

Я бы предложил ввести новый класс, который будет представлять саму игру,Этот класс будет получать сообщения от обоих клиентов и отвечать на каждый соответственно.Что вам также понадобится, так это способ подождать, пока оба клиента сыграют свою очередь, прежде чем вы сможете решить, кто выиграет и что отправить каждому.

Один из способов сделать это - использовать Барьер.объекты .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...