Как стать автором
Обновить

Пишем игру «Палочки» на Python — Tkinter

Всем привет. Если вы новичок в 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", а также мы не можем менять его размер. Но окошко пустое, надо заполнить его. У нас будут располагаться:

  1. Текст "Сколько палочек будем брать"

  2. Кнопки для взятия палочек

  3. Палочки

  4. Кнопка хода компьютера

Начинаем работать МЕЖДУ переменными 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()

Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.