Python Forum
PyQt5 Version of Rock, Paper, & Scissors
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
PyQt5 Version of Rock, Paper, & Scissors
#1
Here my version of the game with PyQt5. Still need a few tweaks.
If you try it, you shouldn't have to remove the image parts. It gets them from the web.
If you try let me know what you think please.

#! /usr/bin/env python3
import sys
import os
from PyQt5 import QtCore, QtWidgets, QtGui,QtMultimedia
from PyQt5.QtGui import QImage, QPixmap, QFont
from PyQt5.QtWidgets import QMessageBox
import requests
import random as rnd
from PyQt5.QtMultimedia import QSound
from playsound import playsound


class Login(QtWidgets.QWidget):
    switch_window = QtCore.pyqtSignal(str)

    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        self.setWindowTitle('Login')

        self.setGeometry(320, 100, 300, 150)
        self.setFixedSize(300,150)

        layout = QtWidgets.QGridLayout()

        # Logo image
        self.logo_img = 'http://gaming-rat.com/ratt2b.png'
        self.image = QImage()
        self.image.loadFromData(requests.get(self.logo_img).content)
        self.logo_label = QtWidgets.QLabel()
        self.logo_label.setPixmap(QPixmap(self.image))

        self.grat_label = QtWidgets.QLabel('Gaming Rat')
        self.grat_label.setStyleSheet('color:rgb(25,10,100); font:18px Bold')


        # Entry field
        self.name = QtWidgets.QLineEdit()
        self.name.setPlaceholderText('Enter Player Name')
        self.name.returnPressed.connect(self.login)

        # Submit Button
        self.button = QtWidgets.QPushButton('Submit')
        self.button.setStyleSheet('color:rgb(0,155,0)')
        self.button.clicked.connect(self.login)

        # Exit button
        self.close_btn = QtWidgets.QPushButton('Exit')
        self.close_btn.setStyleSheet('color:rgb(255,0,0)')
        self.close_btn.clicked.connect(os.sys.exit)


        # Add widgets to layout
        layout.addWidget(self.logo_label,0,0)
        layout.addWidget(self.grat_label,0,1)
        layout.addWidget(self.name,1,0,1,3)
        layout.addWidget(self.button,2,0)
        layout.addWidget(self.close_btn,2,2)

        self.setLayout(layout)


    def login(self):
        switch_window = QtCore.pyqtSignal(str)
        name = self.name.text().strip().title()
        if not name:
            QMessageBox.warning(self, 'Error! Field is empty', 'You must enter a player name.')
        elif len(name) > 8 or len(name) < 5:
            QMessageBox.warning(self, 'Name Error!', 'Player name must be between 5 and 8 charcters in length.')
        else:
            self.player = Player()
            self.player.name = name

            self.switch_window.emit(name)


class MainWindow(QtWidgets.QWidget):

    def __init__(self, name):
        self.computer = Player()
        self.computer.name = 'Computer'

        self.player = Player()
        self.player.name = name

        QtWidgets.QWidget.__init__(self)
        self.setWindowTitle('Rock, Paper, & Scissors')
        self.resize(500, 286)
        self.setFixedSize(500,286)



        self.rps = 'http://gaming-rat.com/rps.png'
        self.myimg = QImage()
        self.myimg.loadFromData(requests.get(self.rps).content)

        self.header = QtWidgets.QLabel(self)
        self.header.setPixmap(QPixmap(self.myimg))
        self.header.setGeometry(QtCore.QRect(10, 10, 481, 61))
        font = QtGui.QFont()
        font.setPointSize(26)
        font.setBold(True)
        font.setWeight(75)
        self.header.setFont(font)
        self.header.setStyleSheet("color:rgb(150, 50,50);padding:8;")
        self.header.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.header.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.header.setLineWidth(1)
        self.header.setAlignment(QtCore.Qt.AlignCenter)

        self.players = QtWidgets.QLabel(self)
        self.players.setGeometry(QtCore.QRect(10, 70, 221, 31))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.players.setFont(font)
        self.players.setStyleSheet("color:rgb(100,10,30);")
        self.players.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.players.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.players.setText("Player Name")

        self.wins = QtWidgets.QLabel(self)
        self.wins.setGeometry(QtCore.QRect(230, 70, 51, 31))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.wins.setFont(font)
        self.wins.setStyleSheet("color:rgb(100,10,30);")
        self.wins.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.wins.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.wins.setText("Wins")

        self.loss = QtWidgets.QLabel(self)
        self.loss.setGeometry(QtCore.QRect(280, 70, 61, 31))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.loss.setFont(font)
        self.loss.setStyleSheet("color:rgb(100,10,30);")
        self.loss.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.loss.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.loss.setText("Losses")

        self.win_eff = QtWidgets.QLabel(self)
        self.win_eff.setGeometry(QtCore.QRect(340, 70, 71, 31))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.win_eff.setFont(font)
        self.win_eff.setStyleSheet("color:rgb(100,10,30);")
        self.win_eff.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.win_eff.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.win_eff.setText("Win Eff.")

        self.loss_eff = QtWidgets.QLabel(self)
        self.loss_eff.setGeometry(QtCore.QRect(410, 70, 81, 31))
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.loss_eff.setFont(font)
        self.loss_eff.setStyleSheet("color:rgb(100,10,30);")
        self.loss_eff.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.loss_eff.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.loss_eff.setText('Loose Eff.')

        self.player_name = QtWidgets.QLabel(self)
        self.player_name.setGeometry(QtCore.QRect(10, 100, 221, 31))
        font = QtGui.QFont()
        self.player_name.setFont(font)
        font.setWeight(75)
        self.player_name.setStyleSheet("color:blue;font-size:10pt;padding-left:5px")
        self.player_name.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.player_name.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.player_name.setText(self.player.name)


        self.computer_name = QtWidgets.QLabel(self)
        self.computer_name.setGeometry(QtCore.QRect(10, 130, 221, 31))
        font = QtGui.QFont()
        self.computer_name.setFont(font)
        font.setWeight(75)
        self.computer_name.setStyleSheet("color: purple; font-size:10pt;padding-left:5px")
        self.computer_name.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.computer_name.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.computer_name.setText(self.computer.name)

        self.player_wins = QtWidgets.QLabel(self)
        self.player_wins.setGeometry(QtCore.QRect(230, 100, 51, 31))
        font = QtGui.QFont()
        font.setWeight(75)
        self.player_wins.setFont(font)
        self.player_wins.setStyleSheet("color:blue;font-size:10pt;padding-left:5px")
        self.player_wins.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.player_wins.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.player_wins.setText('0')


        self.computer_wins = QtWidgets.QLabel(self)
        self.computer_wins.setGeometry(QtCore.QRect(230, 130, 51, 31))
        font = QtGui.QFont()
        font.setWeight(75)
        self.computer_wins.setFont(font)
        self.computer_wins.setStyleSheet("color:purple;font-size:10pt;padding-left:5px")
        self.computer_wins.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.computer_wins.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.computer_wins.setText('0')

        self.player_losses = QtWidgets.QLabel(self)
        self.player_losses.setGeometry(QtCore.QRect(280, 100, 61, 31))
        font = QtGui.QFont()
        font.setWeight(75)
        self.player_losses.setFont(font)
        self.player_losses.setStyleSheet("color:blue;font-size:10pt;padding-left:5px")
        self.player_losses.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.player_losses.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.player_losses.setText('0')

        self.computer_losses = QtWidgets.QLabel(self)
        self.computer_losses.setGeometry(QtCore.QRect(280, 130, 61, 31))
        font = QtGui.QFont()
        font.setWeight(75)
        self.computer_losses.setFont(font)
        self.computer_losses.setStyleSheet("color:purple;font-size:10pt;padding-left:5px")
        self.computer_losses.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.computer_losses.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.computer_losses.setText('0')

        self.player_win_eff = QtWidgets.QLabel(self)
        self.player_win_eff.setGeometry(QtCore.QRect(340, 100, 71, 31))
        font = QtGui.QFont()
        font.setWeight(75)
        self.player_win_eff.setFont(font)
        self.player_win_eff.setStyleSheet("color:blue;font-size:10pt;padding-left:5px")
        self.player_win_eff.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.player_win_eff.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.player_win_eff.setText("0%")

        self.computer_win_eff = QtWidgets.QLabel(self)
        self.computer_win_eff.setGeometry(QtCore.QRect(340, 130, 71, 31))
        font = QtGui.QFont()
        font.setWeight(75)
        self.computer_win_eff.setFont(font)
        self.computer_win_eff.setStyleSheet("color:purple;font-size:10pt;padding-left:5px")
        self.computer_win_eff.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.computer_win_eff.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.computer_win_eff.setText("0%")

        self.player_loss_eff = QtWidgets.QLabel(self)
        self.player_loss_eff.setGeometry(QtCore.QRect(410, 100, 81, 31))
        font = QtGui.QFont()
        font.setWeight(75)
        self.player_loss_eff.setFont(font)
        self.player_loss_eff.setStyleSheet("color:blue;font-size:10pt;padding-left:5px")
        self.player_loss_eff.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.player_loss_eff.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.player_loss_eff.setText("0%")

        self.computer_loss_eff = QtWidgets.QLabel(self)
        self.computer_loss_eff.setGeometry(QtCore.QRect(410, 130, 81, 31))
        font = QtGui.QFont()
        font.setWeight(75)
        self.computer_loss_eff.setFont(font)
        self.computer_loss_eff.setStyleSheet("color:purple;font-size:10pt;padding-left:5px")
        self.computer_loss_eff.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.computer_loss_eff.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.computer_loss_eff.setText("0%")

        self.messages = QtWidgets.QLabel(self)
        self.messages.setGeometry(QtCore.QRect(10, 160, 331, 31))
        font = QtGui.QFont()
        font.setWeight(50)
        self.messages.setFont(font)
        self.messages.setStyleSheet("color:black;font-size:9pt;padding-left:5px")
        self.messages.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.messages.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.messages.setText("Status:")

        self.games_played = QtWidgets.QLabel(self)
        self.games_played.setGeometry(QtCore.QRect(340, 160, 151, 31))
        font = QtGui.QFont()
        font.setWeight(50)
        self.games_played.setFont(font)
        self.games_played.setStyleSheet("color:black;font-size:9pt;padding-left:5px")
        self.games_played.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.games_played.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.games_played.setText("Games Played:")

        self.scissors = QtWidgets.QPushButton(self)
        self.scissors.setGeometry(QtCore.QRect(230, 200, 89, 25))
        self.scissors.setText("Scissors")
        self.scissors.clicked.connect(self.scissorsbtn)


        self.rock = QtWidgets.QPushButton(self)
        self.rock.setGeometry(QtCore.QRect(10, 200, 89, 25))
        self.rock.setText("Rock")
        self.rock.clicked.connect(self.rockbtn)

        self.paper = QtWidgets.QPushButton(self)
        self.paper.setGeometry(QtCore.QRect(120, 200, 89, 25))
        self.paper.setText("Paper")
        self.paper.clicked.connect(self.paperbtn)

        self.exit_btn = QtWidgets.QPushButton(self)
        self.exit_btn.setGeometry(QtCore.QRect(400, 200, 89, 25))
        self.exit_btn.setStyleSheet("color: red")
        self.exit_btn.setText("Exit")
        self.exit_btn.clicked.connect(os.sys.exit)

        self.creator = QtWidgets.QLabel(self)
        self.creator.setGeometry(QtCore.QRect(290, 250, 201, 21))
        font = QtGui.QFont()
        font.setPointSize(9)
        self.creator.setFont(font)
        self.creator.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.creator.setText("Create by menator01 - 6/05/2020")

        # Logo image
        self.logo_img = 'http://gaming-rat.com/ratt2b.png'
        self.image = QImage()
        self.image.loadFromData(requests.get(self.logo_img).content)

        self.ratt_img = QtWidgets.QLabel(self)
        self.ratt_img.setGeometry(QtCore.QRect(10, 230, 61, 51))
        self.ratt_img.setText("")
        self.ratt_img.setPixmap(QtGui.QPixmap(self.image))
        self.ratt_img.setScaledContents(True)
        self.ratt_img.setAlignment(QtCore.Qt.AlignCenter)

    def play(self, player_choice):
        options = ['rock', 'paper', 'scissors']
        msg = ''
        computer_choice = rnd.choice(options)

        self.player.name = f'<font color="blue">{self.player.name}</font>'
        self.computer.name = f'<font color="purple">{self.computer.name}</font>'

        msg1 = 'Rock Crushes Scissors'
        msg2 = 'Paper Covers Rock'
        msg3 = 'Scissors Cuts Paper'
        msg4 = 'It\'s a tie!'

        if player_choice == 'rock' and computer_choice == 'scissors':
            msg = msg1
            self.messages.setText(f'Status: &nbsp;<font color="brown">{msg}</font>  {self.player.name} <font color="brown">won!</font>')
            self.player.wins += 1
            self.player_wins.setText(f'{self.player.wins}')
            self.computer.loss += 1
            self.computer_losses.setText(f'{self.computer.loss}')


        elif player_choice == 'paper' and computer_choice == 'rock':
            msg = msg2
            self.messages.setText(f'Status: &nbsp;<font color="brown">{msg}</font>  {self.player.name} <font color="brown">won!</font>')
            self.player.wins += 1
            self.player_wins.setText(f'{self.player.wins}')
            self.computer.loss += 1
            self.computer_losses.setText(f'{self.computer.loss}')


        elif player_choice == 'scissors' and computer_choice == 'paper':
            msg = msg3
            self.messages.setText(f'Status: &nbsp;<font color="brown">{msg}</font>  {self.player.name} <font color="brown">won!</font>')
            self.player.wins += 1
            self.player_wins.setText(f'{self.player.wins}')
            self.computer.loss += 1
            self.computer_losses.setText(f'{self.computer.loss}')


        elif computer_choice == 'rock' and player_choice == 'scissors':
            msg = msg1
            self.messages.setText(f'Status: &nbsp;<font color="brown">{msg}</font>  {self.computer.name} <font color="brown">won!</font>')
            self.computer.wins += 1
            self.computer_wins.setText(f'{self.computer.wins}')
            self.player.loss += 1
            self.player_losses.setText(f'{self.player.loss}')

        elif computer_choice == 'paper' and player_choice == 'rock':
            msg = msg2
            self.messages.setText(f'Status: &nbsp;<font color="brown">{msg}</font>  {self.computer.name} <font color="brown">won!</font>')
            self.computer.wins += 1
            self.computer_wins.setText(f'{self.computer.wins}')
            self.player.loss += 1
            self.player_losses.setText(f'{self.player.loss}')

        elif computer_choice == 'scissors' and player_choice == 'paper':
            msg = msg3
            self.messages.setText(f'Status: &nbsp;<font color="brown">{msg}</font>  {self.computer.name} <font color="brown">won!</font>')
            self.computer.wins += 1
            self.computer_wins.setText(f'{self.computer.wins}')
            self.player.loss += 1
            self.player_losses.setText(f'{self.player.loss}')

        else:
            msg = msg4
            self.messages.setText(f'Status: &nbsp;<font color="brown">{msg}</font>  Both players chose {player_choice.title()}')
            self.player.ties += 1
            self.computer.ties += 1

        self.player.games_played += 1
        self.computer.games_played += 1
        self.games_played.setText(f'Games Played: &nbsp;<font color="saddlebrown">{self.player.games_played}</font>')

        playerwin_eff = self.get_percentage(self.player.wins, self.player.games_played)
        self.player_win_eff.setText(f'{playerwin_eff}')
        playerloss_eff = self.get_percentage(self.player.loss, self.player.games_played)
        self.player_loss_eff.setText(f'{playerloss_eff}')

        computerwin_eff = self.get_percentage(self.computer.wins, self.computer.games_played)
        self.computer_win_eff.setText(f'{computerwin_eff}')
        computerloss_eff = self.get_percentage(self.computer.loss, self.computer.games_played)
        self.computer_loss_eff.setText(f'{computerloss_eff}')

        # Sound
        file = 'http://gaming-rat.com/sound/beep.wav'
        playsound(file)
        # QSound.play('beep.wav')


    def rockbtn(self):
        self.play(player_choice='rock')

    def paperbtn(self):
        self.play(player_choice='paper')

    def scissorsbtn(self):
        self.play(player_choice='scissors')

    def get_percentage(self, num1, num2):
        try:
            total = num1/num2
            return format(total, '.0%')
        except ZeroDivisionError:
            return format(0, '.0%')





class Player:
    player_name = ''
    wins = 0
    loss = 0
    ties = 0
    games_played = 0







class Controller:
    def __init__(self):
        pass

    def show_login(self):
        self.login = Login()
        self.login.switch_window.connect(self.show_main)
        self.login.show()

    def show_main(self, name):
        self.window = MainWindow(name)
        self.login.close()
        self.window.show()



def main():
    app = QtWidgets.QApplication(sys.argv)
    controller = Controller()
    controller.show_login()
    file = 'http://gaming-rat.com/sound/beep.wav'
    playsound(file)
    sys.exit(app.exec_())
if __name__ == '__main__':
    main()
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#2
Best RPS game I have played in Python. Ever.
pyzyx3qwerty
"The greatest glory in living lies not in never falling, but in rising every time we fall." - Nelson Mandela
Need help on the forum? Visit help @ python forum
For learning more and more about python, visit Python docs
Reply
#3
However, I can't close it. Can you please help me?
pyzyx3qwerty
"The greatest glory in living lies not in never falling, but in rising every time we fall." - Nelson Mandela
Need help on the forum? Visit help @ python forum
For learning more and more about python, visit Python docs
Reply
#4
Do the exit buttons not work?
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#5
No, it doesn't work. By the way, how do you post a file?
pyzyx3qwerty
"The greatest glory in living lies not in never falling, but in rising every time we fall." - Nelson Mandela
Need help on the forum? Visit help @ python forum
For learning more and more about python, visit Python docs
Reply
#6
Which os are you using? I do not know about posting files? The message boxes have a way to post links, links to images, and upload some images, and videos on youtube. File I do not know.

The buttons use sys.exit(). Might try importing os and use os.sys.exit() on these two lines

Line 46 self.close_btn.clicked.connect(sys.exit)
Line 303 self.exit_btn.clicked.connect(sys.exit)
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#7
I use macOS, Catalina 10.15.5
I'll try restarting and see
pyzyx3qwerty
"The greatest glory in living lies not in never falling, but in rising every time we fall." - Nelson Mandela
Need help on the forum? Visit help @ python forum
For learning more and more about python, visit Python docs
Reply
#8
I'm not familiar with macs. I've not ever used one. I would be of little help with that.
I edited my post above to include the lines that would need changed to os.sys.exit. <-- I used this in the tkinter version.
I welcome all feedback.
The only dumb question, is one that doesn't get asked.
My Github
How to post code using bbtags


Reply
#9
Well, I restarted my mac and managed to shut it down. But still, I gotta say, nice game!
pyzyx3qwerty
"The greatest glory in living lies not in never falling, but in rising every time we fall." - Nelson Mandela
Need help on the forum? Visit help @ python forum
For learning more and more about python, visit Python docs
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Another Rock, Paper, Scissors Yoriz 4 3,123 Jun-30-2020, 07:56 PM
Last Post: Yoriz
  The tkinter version of Rock Paper Scissors menator01 3 3,140 Jun-28-2020, 07:15 AM
Last Post: ndc85430
  My version of Rock Paper Scissors menator01 12 6,019 Jun-27-2020, 10:25 PM
Last Post: menator01
  Rock, Paper, Scissors foksikrasa 11 4,231 May-28-2020, 05:58 PM
Last Post: BitPythoner
  Rock Paper Scissor GAME inamullah9 3 3,229 Aug-11-2019, 12:17 PM
Last Post: ichabod801
  A CLI based Rock,Paper or Scissor game. Ablazesphere 7 4,426 Oct-28-2018, 07:25 AM
Last Post: Ablazesphere
  A basic Rock-paper-scissors game by me... Unlimiter 0 2,453 Dec-25-2017, 03:41 PM
Last Post: Unlimiter
  Basic Rock, Paper, Scissors CinnamonBeard 1 3,524 Dec-19-2017, 02:32 PM
Last Post: sparkz_alot

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020