PyQt5 - Проект "Камінь-ножиці-папір"

Створимо гру "Камінь-ножиці-папір". Для цього потрібно передбачити 3 кнопки для вибору фігури користувачем, і ще одна фігура - обирається випадковим чином комп'ютером. Залежно від того, яка утворюється комбінація фігур - виводиться рішення: Нічия, Виграв комп'ютер чи Виграли Ви.

  

Завдання проекту: Розробити гру "Камінь-ножиці-папір".

У конструкторі Designer потрібно створити компоненти: 2 написи Label та 3 кнопки PushButton:


Зверніть увагу: кнопкам надано квадратної форми, вилучено напис (властивість text) і встановлено розмір значків кнопок 50 х 50 пікселів.


Для зручності подальшої обробки, встановіть назву першої кнопки в pushButton_1 (зверніть увагу на назви компонентів в Інспекторі об'єктів):



Скористаємось початковою заготовкою:

from PyQt5 import QtWidgets, uic
import sys
from PyQt5.QtGui import *
import random
class Ui(QtWidgets.QMainWindow):
    def __init__(self):
        super(Ui, self).__init__()
        uic.loadUi('ttt.ui', self)
        self.show()
app = QtWidgets.QApplication(sys.argv)
window = Ui()
app.exec_()


До цієї програми потрібно додати опис компонентів форми

        self.pushButton_1 = self.findChild(QtWidgets.QPushButton, 'pushButton_1')        
        self.pushButton_2 = self.findChild(QtWidgets.QPushButton, 'pushButton_2')        
        self.pushButton_3 = self.findChild(QtWidgets.QPushButton, 'pushButton_3')
        self.label = self.findChild(QtWidgets.QLabel, 'label')
        self.label_2 = self.findChild(QtWidgets.QLabel, 'label_2')  


Додаємо метод check для обробки клацань усіх трьох кнопок. Зверніть увагу, для всіх трьох кнопок ми призначаємо один і той же метод!

        self.pushButton_1.clicked.connect(self.check)
        self.pushButton_2.clicked.connect(self.check)
        self.pushButton_3.clicked.connect(self.check)


Також потрібно розмістити на кнопках відповідні зображення (можна скачати файли: камінь, ножиці, папір):

        self.pushButton_1.setIcon(QIcon(QPixmap("1.bmp")))
        self.pushButton_2.setIcon(QIcon(QPixmap("2.bmp")))
        self.pushButton_3.setIcon(QIcon(QPixmap("3.bmp")))


Метод обробки для клацання кнопок полягає у тому, щоб виконати такі дії: 

1) Створюється випадкове зображення і показується у текстовому написі. Для цього створюємо список gra, у якому буде три елементи (три зображення). Обираємо випадкове число від 0 до 2, і записуємо зображення з цим номером в текстовий напис label. При цьому дозволяємо масштабування вмісту, щоб зображення займало всю площу напису

    def check(self):
        gra=["1.bmp","2.bmp","3.bmp"]
        k=random.randint(0,2)
        pic = QPixmap(gra[k])
        self.label.setScaledContents(True)
        self.label.setPixmap(pic)


2) Визначаємо, яку саме кнопку клацнули (адже у нас всі три кнопки мають один і той же метод обробки. Для цього використаємо self.sender().objectName() - це назва об'єкту, який запустив обробку: pushButton_1, pushButton_2 чи pushButton_3. Якщо взяти [-1] символ цієї назви - отримаємо символи 1, 2 та 3. Можна їх перевести у числа (int) для того, щоб можна було порівняти з числами з попереднього пункту.

        n=int(self.sender().objectName()[-1])


3) Оскільки випадкове число k мало варіанти 0,1,2, а число n має варіанти 1,2,3, потрібно або до k додати 1, або від n - відняти 1.

        n=n-1


4) Залишається виконати перевірку. Якщо і гравець, і комп'ютер обрали однакові фігури, то нічия. Якщо гравець вибрав, наприклад, камінь, а комп'ютер - ножиці, то виграв гравець. Якщо гравець вибрав камінь, а комп'ютер - папір, то виграв комп'ютер.

        if n==k:
            self.label_2.setText("Нічия")
        if n==0 and k==1:
            self.label_2.setText("Ви виграли")
        if n==0 and k==2:
            self.label_2.setText("Виграв комп'ютер")


Самостійно напишіть решту перевірок для повноцінної гри.

Остання зміна: середа 13 травня 2020 5:32