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("Виграв комп'ютер")
Самостійно напишіть решту перевірок для повноцінної гри.