Ім'я файлу: практика.docx
Розширення: docx
Розмір: 162кб.
Дата: 26.06.2020
скачати

Практичне завдання

Ціль:розробити гру «Хрестики-нулики» за допомогою фреймворку Kivy.

Мета:Використати накопичений під час минулих занять досвід та створити власний доданок. На прикладі подивитись, як об’єкти взаємодіють між собою та як впливають ті чи інші зміни коду на зовнішній вигляд та роботу доданку. Доданок має виглядати як форма із 10 кнопками, 9 з яких – клітинки для гри та одна кнопка, що дозволяє розпочати гру заново.

Що слід пригадати:

-Модулі, яі ви вже вивчили

-Базові елементи, без яких доданок не працюватиме

-Корисні і зручні параметри

Початок роботи

По-перше, створюємо текстовий файл із назвою «tic-tac-toe.py» та відкриваємо його за допомогою текстового редактору. Далі, треба імпортувати усі потрібні нам для створення доданку модулі.

from kivy.app import App #саме це дозволяє створювати доданки за допомогою ківі

from kivy.uix.boxlayout import BoxLayout # Дозволяє нам розміщувати об’єкти на формі так, як нам потрібно

from kivy.uix.gridlayout import GridLayout # дозволяє перетворити елементи боксу на матрицю

from kivy.uix.button import Button # Дозволяє створювати та редагувати кнопки

from kivy.config import Config # Дозволяє редагувати налаштування самої форми доданку

Далі одразу налаштуємо нашу форму

Config.set("graphics","resizable","0") # не дає змоги міняти розмір форми

Config.set("graphics","width","300") # ширина

Config.set("graphics","height","300") # висота

Одразу створимо власне хрестики та нулики

choice = ['X', 'O']; switch = 0

де switch – буде нашм перемикачем під час зміни ходу

а choice, як не дивно, список наших варіантів ходу. І оскільки, спочатку він дорівнює 0, то першим завжди починають «хрестики»



Далі створюємо основний клас, з яким і будемо працювати

Class MainApp(App):

Та починаємо створювати функції

Def tic_tac_toe(self, arg): #параметр self дозволяє нам використовувати певні змінні за межами своєї функції. Параметр arg буде відповідати за наші кнопки.

Ця функція і буде відповідати за ігровий процес

global switch #все ще наш перемикач ходу, тепер глобальна змінна

Далі створюємо функцію для кнопки рестарт

def restart(self, arg):

І створюємо основну функцію, у якій і будуть об’явлені наші дві минулі функції, та одразу почнемо її заповнювати.

def build(self):

self.title = "Хрестики-нулики" #змінюємо назву нашої форми

root = BoxLayout(orientation = "vertical", padding = 5) # так ми вказуємо, що нащі бокси будуть йти зверху вниз, тобто розділені горизонтальними лініями

grid = GridLayout(cols = 3) # Наш перший бокс. Cols – кількість колонок, на які він поділений.

self.button = [0 for _ in range(9)] # Створюємо список з 9 нулів щоб потім його заповнювати хрестиками або нуликами.

for index in range(9): # цикл перебору 9 індексів

self.button[index] = Button( #присвоюємо ці індекси змінній button

font_size = 24, # Розмір шрифта

disabled = False,

on_press = self.tic_tac_toe # при натисканні на кнопку # виконується метод tic_tac_toe

)

grid.add_widget(self.button[index])

root.add_widget(grid) #Власне, створюємо нащі кнопки

Ми щойно вказали, що в нас є 9 кнопок. Вони будуть займати увесь виділений їм простір. А оскільки ми позначили лише, що мають бути лише3 колонки, вони вільно займають квадрат 3х3 клітинки.

Тому і повернемося до функції tic-tac-toe

def tic_tac_toe(self, arg):

global switch # імпортуємо глобальну змінну

arg.disabled = True # arg – це кнопка, яку щойно натиснули. І вона стала #неактивною

arg.text = choice[switch]

if not switch: switch = 1 #змінюємо параметр switch з 0 на 1

else: switch = 0 # і навпаки, якщо switch = 0

coordinate = (

(0,1,2),(3,4,5),(6,7,8), # горизонтальні лініії

(0,3,6),(1,4,7),(2,5,8), # Вертикальні лінії

(0,4,8),(2,4,6), # Діагональні лінії

)

#При натисканні на певну кнопку, її результат (хрестик або нулик) має запам’ятовуватись. Для цього використаємо список векторів, який у яких будуть записуватись результати в залежності від того, кнопку з яким індексом було натиснуто.(тобто, якщо натиснуто кнопку з індексом 0 і при натисканні ви бачите хрестик, то перщі вектори по горизонталі, вертикалі та діагоналі запишуть в себе хрестик)

vector = (

[self.button[x].text for x in (0,1,2)],

[self.button[x].text for x in (3,4,5)],

[self.button[x].text for x in (6,7,8)],

[self.button[y].text for y in (0,3,6)],

[self.button[y].text for y in (1,4,7)],

[self.button[y].text for y in (2,5,8)],

[self.button[d].text for d in (0,4,8)],

[self.button[d].text for d in (2,4,6)],

)

win = False # змінна для визначення перемоги

color = [0,1,0,1] # колір, яким буде виділятись переможна лінія

for index in range(8): #перебираємо усі 8 наших векторів

if vector[index].count('X') == 3\ # якщо знайшло 3 хрестика у лінії

or vector[index].count('O') == 3: #або 3 нулика

win = True #це перемога

for i in coordinate[index]:

self.button[i].color = color # і тому ми міняємо колір хрестиків(або #нуликів переможця) на колір перемоги(в нашому випадку – зелений)

break #виходимо з циклу, як тільки знайшли переможця.

if win:

for index in range(9):

self.button[index].disabled = True #після визначення переможця, робимо усі кнопки неактивними.

Завершивши цю функцію, повернемося до функції build

root.add_widget(

Button(

text = "Restart", #Створюємо кнопку для рестарту гри

size_hint = [1,0.1], #size_hint дозволяє змінювати розмір відносно у #якому середовищи розміщено об’єкт. У нашому випадку це нижня половина #нашої форми. І від неї він займає 10%)

on_press = self.restart #при натисканні почне виконання відповідна #функція

)

)

Return root #Власне, розпочинає весь процесс



Тепер час заповнити останню нашу функцію

def restart(self, arg):

global switch; switch = 0 #Присвоюємо параметру switch значення 0

for index in range(9):

self.button[index].color = [0,0,0,1] #Повертаємо стандартний колір #тексту кнопок

self.button[index].text = "" #Витираємо текст на кнопках

self.button[index].disabled = False #Робимо кнопки знов активними



Також, для того, щоб спокійно компілювати наш доданок у python, потрібно додати у кінці 2 троки

if __name__ == "__main__":

MainApp().run()

Далі, зберігаємо усі зміни нашого файлу та відкриваємо його за допомогою python. Якщо у вас не виникло помилок, у вас відкриється готова гра.


скачати

© Усі права захищені
написати до нас