Pull to refresh

Пишем игру «Палочки» на 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()

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.