0

私はプログラミングが初めてで、プログラムに問題があります。誰かが私を助けてくれることを願っています

ソケットとpyqt5を使用して、Pythonでじゃんけんゲームを作成しようとしています。私のプログラムは、pyqt5 を使用せずに実行したときに機能しましたが、それを達成しようとした後、行き詰まりました。誰かが私の間違いを説明してくれることを願っています。

ウィンドウで、「じゃんけん」または「紙」または「はさみ」と入力する必要があります。次に、サーバーに送信する必要があり、サーバーは上記の選択肢のいずれかをランダムに生成し、誰が勝つかを確認する必要があります。結果をクライアント(私のウィンドウ)に送り返した後。また、データを送信するたびにスコアをウィンドウに保持する必要があります。

これが私のserver.pyです

import socket
import pickle
import random

s=socket.socket()
ip_host=socket.gethostname()
port=3030
s.bind((ip_host, port))
s.listen(5)

c,addr = s.accept()

choices=["rock", "paper", "scissors"]
tie=0
win=0
lose=0

while win!=3 or lose!=3:
    player=pickle.loads(c.recv(1024))
    num=random.randint(0,2)
    cpu=choices[num]
    if player==cpu:
        print("Tie")
        tie+=1
        c.send(pickle.dumps('tie'))
    else:
        if (player=='rock' and cpu=='paper') or (player=='paper' and cpu=='scissors') or (player=='scissors' and cpu=='rock'):
            print("You lose")
            lose+=1
            c.send(pickle.dumps("lose"))
        else:
            print("You win")
            win+=1
            c.send(pickle.dumps("win"))

c.close()
s.close()

そして、これは私のclient.pyです

import socket
import pickle
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys

s=socket.socket()
server_host=socket.gethostname()
server_port=3030
s.connect((server_host, server_port))
print("Connected to some server")

class grid_pro(QWidget):
    """grid example"""
    def __init__(self):
        super().__init__()
        self.setGeometry(200,200,200,200)
        self.setWindowTitle("Rock-Paper-Scissors")
        self.label=QLabel("Enter rock, paper or scissors:")
        self.input=QLineEdit()
        self.guess=QPushButton("Guess")
        self.win=QLabel('You: 0')
        self.lose=QLabel("CPU: 0")
        self.result=QLabel("Start")

        self.grid=QGridLayout(self)
        self.grid.addWidget(self.label, 0, 0)
        self.grid.addWidget(self.input, 0, 1)
        self.grid.addWidget(self.guess, 1, 0)
        self.grid.addWidget(self.result, 1, 1)
        self.grid.addWidget(self.win, 2, 0)
        self.grid.addWidget(self.lose, 2, 1)
        self.guess.clicked.connect(self.client)
        self.client()
        self.show()

    def client(self):
        win=0
        lose=0
        tie=0
        while 1:
            self.win.setText('You: %d'%(win))
            self.lose.setText('CPU: %d'%(lose))
            n=str(self.input.text())
            s.send(pickle.dumps(n))
            result=pickle.loads(s.recv(1024))
            if result=='win':
                print("You win")
                win+=1
            elif result=='lose':
                lose+=1
                print("You lose")
            elif result=='tie':
                tie+=1
                print("Tie")
            if win==3 or lose==3:
                break

        self.result.setText("You "+result+'!!')


app=QApplication(sys.argv)
form=grid_pro()
sys.exit(app.exec_())
4

1 に答える 1

0

clientUI を使用する場合、スロットで無限ループを使用するのはなぜですか? これは主に、アプリケーションをコンソールから実行するときに必要になるため、毎回ユーザーに新しい値を入力するよう求める必要があります。UI の再描画を処理する無限ループが既に存在するため、不要な UI を使用する場合:

import socket
import pickle
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
import sys

s=socket.socket()
server_host=socket.gethostname()
server_port=3030
s.connect((server_host, server_port))
print("Connected to some server")

class grid_pro(QWidget):
    """grid example"""
    def __init__(self):
        super().__init__()
        self.setGeometry(200, 200, 200, 200)
        self.setWindowTitle("Rock-Paper-Scissors")
        self.label = QLabel("Enter rock, paper or scissors:")
        self.input = QLineEdit()
        self.guess = QPushButton("Guess")
        self.win = QLabel('You: 0')
        self.lose = QLabel("CPU: 0")
        self.result = QLabel("Start")

        self.grid=QGridLayout(self)
        self.grid.addWidget(self.label, 0, 0)
        self.grid.addWidget(self.input, 0, 1)
        self.grid.addWidget(self.guess, 1, 0)
        self.grid.addWidget(self.result, 1, 1)
        self.grid.addWidget(self.win, 2, 0)
        self.grid.addWidget(self.lose, 2, 1)
        self.guess.clicked.connect(self.client)
        self.client()
        self.show()

    @pyqtSlot()
    def client(self):
        win = 0
        lose = 0
        tie = 0
        self.win.setText('You: %d' % (win))
        self.lose.setText('CPU: %d' % (lose))
        n = str(self.input.text())
        s.send(pickle.dumps(n))
        result = pickle.loads(s.recv(1024))

        if result=='win':
            print("You win")
            win += 1
        elif result=='lose':
            lose += 1
            print("You lose")
        elif result=='tie':
            tie += 1
            print("Tie")

        self.result.setText("You %s!!" % result)


app = QApplication(sys.argv)
form = grid_pro()
sys.exit(app.exec_())

@pyqtSlot()デコレーターをスロットに追加したclientので、それをインポートする必要があることに注意してくださいPyQt5.QtCore(通常の python callable で機能する場合でも、このデコレーターを使用してシグナルのスロットを具体的に装飾することをお勧めします)。

また、クライアントとサーバーの接続を適切に終了するために、コードを変更する必要があります。あなたのコードを読んで理解した限りでは、すべての試合は最大 5 ラウンド (最初に 3 勝した人) 続き、接続を閉じます (別のゲームをプレイするには、サーバーを再起動する必要があります)。代わりに、接続を閉じずに試合が終了するたびにスコアをリセットし、クライアントに別のスロットを実装しQPushButtonます'QUIT'.接続を終了します (クライアントはそれに応じてフォローします。'QUIT'ストリング)。現時点では、試合が終わるとサーバーが接続を閉じ、クライアントでソケット エラーが発生します。

于 2016-03-17T10:50:57.053 に答える