неділю, 18 червня 2017 р.

Створюємо ігри мовою Python

Ми вже неодноразово створювали програми різного типу, прийшов час і повеселитися. Спробуємо створити просту гру мовою Python. Це буде просте вікно з клітинками по яким буде рухатися квадратик, а задачею цього квадрату є "їсти" кружечки, але у тебе є всього лише 60 секунд. Керувати квадратом потрібно за допомогою клавіш вгору, вниз, вліво та вправо:
 
Отже, почнемо з підключення відповідного модуля та створення вікна та полотна:
from tkinter import
win=Tk()
win.geometry("300x300")
win.title("60 seconds")
win.resizable(0,0)
win.focus_force()
canv=Canvas(win,width=300,height=303, bg='azure')
canv.place(x=-2, y=-2)
text=canv.create_text(154,140,fill="dark blue",font="Times 20",text="Для початку гри \n натисніть Enter")
win.mainloop()
Маємо:
Тепер додамо подію Return та функцію, яка буде будувати коло та квадрат в довільному положенні. Обов’язково підключимо відповідний модуль:
...
import random
...
def start(event):  
    # видалення тексту з полотна за допомогою метода delete
    canv.delete(text)
    # координати ліній
    a=30
    b=0
    c=300 
    # цикл для створення 9-ти вертикальних ліній
    for i in range(9) : 
        canv.create_line([a,b],[a,c])
        a=a+30
    d=30 
    # цикл для створення 9-ти горизонтальних ліній
    for i in range(9) :
        canv.create_line([b,d],[c,d])
        d=d+30 
    # оголошення змінних координат кола та квадрата
    глобальними
   global pos_oval_x, pos_oval_y, oval_x1, oval_y1, oval_x2, oval_y2, pos_rec_y, pos_rec_x, oval, rec
    # створення випадкових змінних позиції кола по
    горизонталі та вертикалі
    pos_oval_x=random.randint(0,9)
    pos_oval_y=random.randint(0,9)
    oval_x1=7+30*pos_oval_x
    oval_y1=7+30*pos_oval_y
    oval_x2=oval_x1+16
    oval_y2=oval_y1+16
    # побудова кола
   oval=canv.create_oval([oval_x1, oval_y1], [oval_x2, oval_y2]) 
    # створення випадкових змінних позиції квадрата по
    горизонталі та вертикалі
    pos_rec_x=random.randint(0,9)
    pos_rec_y=random.randint(0,9)
    rec_x1=7+30*pos_rec_x
    rec_y1=7+30*pos_rec_y
    rec_x2=rec_x1+16
    rec_y2=rec_y1+16
    # побудова квадрата
   rec=canv.create_rectangle([rec_x1, rec_y1], [rec_x2, rec_y2])
...
win.bind("<Return>",start)
...
Тепер наша програма при запуску вимагає натискання клавіші Enter, а після виконання даної події створюється саме ігрове полотно та його елементи:
Тепер додамо в функцію start події для створення руху та самі функції руху. В Python рух об’єктів створюється за допомогою функції move (з англ. "рух"):
назва_полотна.move(назва_об’єкта, рух_по_х, рух_по_у)
...
def start(event):
    win.bind('<KeyPress-Up>',up)
    win.bind('<KeyPress-Down>',down)
    win.bind('<KeyPress-Left>',left)
    win.bind('<KeyPress-Right>',right)
...
def up(event):
    global pos_rec_y
    pos_rec_y=pos_rec_y-1
    if pos_rec_y==-1:
        pos_rec_y=9
        canv.move(rec, 0, 270)
    else:
        canv.move(rec, 0, -30)
def down(event):
    global pos_rec_y
    pos_rec_y=pos_rec_y+1
    if pos_rec_y==10:
        pos_rec_y=0
        canv.move(rec, 0, -270)
    else:
        canv.move(rec, 0, +30)
def right(event):
    global pos_rec_x
    pos_rec_x=pos_rec_x+1
    if pos_rec_x==10:
        pos_rec_x=0
        canv.move(rec, -270, 0)
    else:
        canv.move(rec, 30, 0)
def left(event):
    global pos_rec_x
    pos_rec_x=pos_rec_x-1
    if pos_rec_x==-1:
        pos_rec_x=9
        canv.move(rec, 270, 0)
    else:
        canv.move(rec, -30, 0)
Зверніть увагу на те, що при русі у відповідну сторону буде змінюватися значення змінної положення квадрата у полі, це потрібно для підрахунку результату. Також буде перевірятися чи не вийшов квадрат за рамки поля. В залежності від цього його положення буде змінюватися по різному.
Тепер додамо таймер. Для того, щоб створити таймер потрібно підключити спеціальний модуль, який називається threading. Даний модуль служить для створення декількох потоків. Отже, ми скористуємося функцією Timer із даного модуля:
назва_таймера=threading.Timer(кількість_секунд, функція)
Таймер також потрібно додавати в функцію start! Після закінчення часу елементи будуть видалятися та створюватися нове вікно, в якому потім буде результат:
...
import threading
...
def start(event):
   ...
   timer=threading.Timer(60, finish)
   timer.start() 
...
def finish():
    canv.delete(oval)
    canv.delete(rec)
    win1=Tk()
    win1.title("Результат")
    win1.geometry("250x60+500+320")
    win1.resizable(0,0)
    win1.focus_force()
    win1.mainloop()
    win.destroy()
    win.quit() 

...
А зараз зробимо так, щоб наша програма виводила результат. При кожному русі квадрата буде запускатися перевірка на те, чи співпадають положення квадрата та кола по вісі х та у, а після цього положення кола буде змінюватися:
...
res=0 # початкове значення результату
def check():
    global res
    if pos_rec_x==pos_oval_x and pos_rec_y==pos_oval_y:
        res=res+1
        global pos_oval_x, pos_oval_y, oval_x1, oval_y1, oval_x2, oval_y2
        pos_oval_x=random.randint(0,9)
        pos_oval_y=random.randint(0,9)
        oval_x1=7+30*pos_oval_x
        oval_y1=7+30*pos_oval_y
        oval_x2=oval_x1+16
        oval_y2=oval_y1+16
     canv.coords(oval, oval_x1, oval_y1, oval_x2, oval_y2)
        # функція для зміни положення кола
...
def up(event):
    ...
    check()
def down(event):
    ...
    check()
def right(event):
    ...
    check()
def left(event):
    ...
    check()
Також потрібно не забути додати напис у функцію finish:
...
def finish():
    ...    
  Label(win1, text="Ваш результат: "+str(res), font="Times 13").place(x=60, y=17) 
    ...
І після всіх цих змін в нашу гру можна грати!!!

Якщо ви бажаєте дізнатися більше про Ptyhon, придбайте посібник: http://proginschool.inf.ua

Немає коментарів:

Дописати коментар

Динамічне програмування мовою Python

Ця тема не входить в шкільний курс інформатики, проте дуже часто представлена на олімпіаді з програмування. Динамічне програмування - це вж...