Всем привет. Если вы новичок в Python и пришли программировать игры, то я могу научить вас делать простую игру с графическим интерфейсом. После выбора IDE, вы можете начать писать код. В этом посте вы узнаете:
О правилах игры в "Палочки"
О создании GUI интерфейса на Tkinter с нуля
О механике игры в "скрытой" части кода
Суть игры такова - на столе есть 20 палочек. Играют два игрока. Первый игрок берет 1, 2, или 3 палочки. Второй игрок также берет 1, 2, или 3 палочки. И так по очереди. Тот, кто возьмет последнюю палочку - проиграет.
Пишем код
Для начала импортируем библиотеки tkinter и random. Они встроенные, и ничего не надо устанавливать дополнительно. Мы импортируем из них *, то есть всё, а значит, теперь вместо random.randint мы можем писать просто randint.
from tkinter import *
from random import *
Далее нам нужно разобраться с самим интерфейсом. Сама механика - позже...
left = 20 #Устанавливаем кол-во палочек
root = Tk() #Присваиваем класс Ткинтера переменной root
root.geometry("550x200") #Устанавливаем размер окна 550 на 200. Вы можете поставить другой, но тогда вам придется настраивать расположение и размер GUI-элементов вручную
root.resizable(0, 0) #Делаем так, чтобы размер нашего окна не мог меняться по осям х и у
root.title("Sticks") #Устанавливаем название окна
root.mainloop() #Запускаем окно
Если мы запустим данный код сейчас, то получим вот такое окошко:

Оно имеет размер 550 на 200, название "Sticks", а также мы не можем менять его размер. Но окошко пустое, надо заполнить его. У нас будут располагаться:
Текст "Сколько палочек будем брать"
Кнопки для взятия палочек
Палочки
Кнопка хода компьютера
Начинаем работать МЕЖДУ переменными root.geometry и root.resizable
text1 = Label(root, text="Сколько палочек будем брать?") #Задаем окно расположения текста и сам текст
text1.pack() #Пакуем текст
butt1 = Button(root, text="1") #Настраиваем кнопку
butt1.place(x=210, y=30) #Распологаем кнопку по указанным координатам
butt2 = Button(root, text="2")
butt2.place(x=265, y=30)
butt3 = Button(root, text="3")
butt3.place(x=320, y=30)
sticks = Label(root, text = left * "| ") #Выводим палочки
sticks.config(font = ("Arial", 30, 'bold')) #Устанавливаем шрифт Arial, размер текста 30 и делаем его жирным
sticks.place(x=50, y=70)
pc_butt = Button(root, text = "Ход компьютера", widht = 30) #Создаем кнопку хода компьютера с шириной в 30 пикселей
pc_butt.place(x=170, y=150)
Запустим код

Уже похоже на игру, верно? Так вот, мы закончили делать интерфейс, пора переходить к самому главному механизму.
Если вы запустили код, то увидели, что кнопки ничего не делают. Все потому что мы не задали им команду которую нужно выполнять. Это можно сделать с помощью аргумента command, который должен располагаться в настройках кнопки. Для этого нужно сделать примерно так:
def hello():
print("Hello, world!")
button = Button(root, text="Вывод", command = hello)
button.pack()
Теперь при нажатии кнопки в консоль будет выводится надпись "Hello, world!". То есть указывая название функции (без скобок в конце) мы будем делать то, что в ней написано. Давайте настроим кнопки.
#Напишу вкратце, ибо будет долго заново писать все расположения и все остальное
#pass говорит о том, что данный кусок кода будет заполнен позже. Это своего рода затычка
def s1():
pass
def s2():
pass
def s3():
pass
def pc():
pass
butt1 = Button(root, text="1", command = s1)
butt2 = Button(root, text="2", command = s2)
butt3 = Button(root, text="3", command = s3)
pc_butt = Button(root, text="Ход компьютера", command = pc)
Теперь наша графическая часть точно готова. Давайте приступим к написанию функций
def s1():
global left #Получаем глобальный доступ к переменной left
u = 1 #Указываем что мы берем одну палочку
left = left - u #Вычитаем от кол-ва палочек одну
if left <= 0: #Если оставшиеся палочки меньше или равны нулю
sticks.config(text = "Компьютер победил") #Меняем текст на объявление о победе компьютера
sticks.place(x=75, y=70)
else: #Или:
sticks.config(text = left * "| ") #Обновляем кол-во палочек
Функции s2 и s3 заполняем похоже, меняя лишь переменную u
def s2():
global left
u = 2
left = left - u
if left <= 0:
sticks.config(text = "Компьютер победил")
sticks.place(x=75, y=70)
else:
sticks.config(text = left * "| ")
def s3():
global left
u = 3
left = left - u
if left <= 0:
sticks.config(text = "Компьютер победил")
sticks.place(x=75, y=70)
else:
sticks.config(text = left * "| ")
Игра почти готова. Уже сейчас в нее можно играть. Однако одному играть неинтересно, поэтому добавим компьютер
def pc():
global left
a = randint(1, 3) #Загадываем число от 1 до 3
left = left - int(a)
if left <= 0:
sticks.config(text = "Игрок победил")
sticks.place(x=140, y=70)
else:
sticks.config(text = left * "| ")
Игра уже готова. Но компьютер без интеллекта, он просто вычитывает палочки, не задумываясь о возможности проиграть или выиграть. Давайте добавим его хоть немного интеллекта.
def pc():
global left
a = randint(1, 3)
if left == 4: #Если осталось 4 палочки
a = 3 #Компьютер убирает 3
elif left == 3: #Если осталось 3 палочки
a = 2 #Компьютер убирает 2
elif left == 2: #Если осталось 2 палочки
a = 1 #Компьютер убирает 1
left = left - a
if left <= 0:
sticks.config(text = "Игрок победил")
sticks.place(x=140, y=70)
else:
sticks.config(text = left * "| ")
Ну вот, теперь на финальных стадиях игры компьютер имеет шансы выиграть, поэтому теперь мы не сможем выиграть, забирая любое кол-во палочек.
Готовый код без комментариев
Перед копированием кода, хочу предупредить, что здесь Tab содержит 2 пробела, а не 4, из-за чего вам придется либо писать код вручную либо переделывать Tab'ы
#Версия Python - 3.8.6
from tkinter import *
from random import *
left = 20
def s1():
global left
u = 1
left = left - int(u)
if left <= 0:
sticks.congig(text = "Компьютер победил")
sticks.place(x=75, y=70)
else:
sticks.config(text = left*"| ")
def s2():
global left
u = 2
left = left - int(u)
if left <= 0:
sticks.config(text = "Компьютер победил")
sticks.place(x=75, y=70)
else:
sticks.config(text = left*"| ")
def pc():
global left
a = randint(1, 3)
if left == 4:
a = 3
elif left == 3:
a = 2
elif left == 2:
a = 1
left = left - int(a)
if left <= 0:
sticks.config(text = "Игрок победил")
sticks.place(x=140, y=70)
else:
sticks.config(text = left*"| ")
root = Tk()
root.geometry("550x200")
text1 = Label(root, text="Сколько палочек будем брать?")
text1.pack()
wbutt1 = Button(root, text="1", command = s1)
wbutt1.place(x=210, y=30)
wbutt2 = Button(root, text="2", command = s2)
wbutt2.place(x=265, y=30)
wbutt3 = Button(root, text="3", command = s3)
wbutt3.place(x=320, y=30)
sticks = Label(root, text = left*"| ")
sticks.config(font = ("Arial", 30, 'bold'))
sticks.place(x=50, y=70)
pc_butt = Button(root, text = "Ход компьютера", command = pc)
pc_butt.place(x=170, y=150)
root.resizable(0, 0)
root.title("Sticks")
root.mainloop()