Fork me on GitHub

Had nebo žížala, jednoduchá hra

Úlokolem je vytvořit jednoduchou hru Had nebo Červ. Je jen na vás, co zvolíte a jak bude vypadat výsledek. Protože naše hra je maximálně jednoduchá postačí nám knihovna TkInter a její Canvas.

Začít můžete s následujícím kódem. Nejprve třídu App. Ta má za úkol vytvořit okno a umístit do něj plátno (Canvas). Každých 200 ms se spustí funkce tickej a provede všechny funkce zaregistrované pomocí tick_register. Při stisku klávesy Escape se aplikace ukončí.

from Tkinter import (Tk, Canvas)
from random import randint


class App:
    ticklist = []    # seznam funkcí, které se budou spouštět při tiku
    tick_id = None   # identifikárot následujícího ticku

    def __init__(self, root, width=80, height=60, grid=10, tick=200):
        self.root = root      # objekt okna
        self.width = width    # šířka, jako počet sloupců
        self.height = height  # výška, jako počet řádků
        self.grid = grid      # kolik pixelů má jeden čtverec sítě
        self.tick = tick      # počet milisekund pro jeden úder hodin
        root.title("had.py")  # titulek okna
        self.canvas = Canvas(root, bg='white',
                             width=grid*width, height=grid*height)
        self.canvas.pack()
        root.bind("<Escape>", self.destroy)
        root.after(self.tick, self.tickej)

    def tickej(self):
        for f in self.ticklist:
            f()
        self.tick_id = self.root.after(self.tick, self.tickej)

    def tick_register(self, fnc):
        self.ticklist.append(fnc)

    def destroy(self, event=None):
        self.root.after_cancel(self.tick_id)
        root.destroy()

Dále vytvoříme třídu Snake, kterou máte za úkol dotvořit, protože náš had je tvořen jen jedním čtverečkem. Umí se pohybovat nahoru, dolů, doleva a doprava ale tento pohyb je ještě hodně nedokonalý. Návodem, jak pohyb zdokonalit vám může být funkce down. Všimněte si také funkce tickej, která se volá každých 200 ms.

Každý čtvereček, který je vykreslen más svůj identifikátor self.id. Pro hada tořeného více čtverečky bude vhodné tento kód předělat tak aby to byl seznam.

Relativní pohyb
je realizován metodou .move(id, posun_x, posun_y).
Aktuální pozici
získáme medodou .coords(id)
Přesun na absolutní pozici
zajístíme také pomocí funkce .coords(id, x1, y1, x2, y2). Souřednice jsou dvě protože se jedná o levý horní a pravý dolní roh.
 1 class Snake:
 2     def __init__(self, app, color="blue",
 3                 down="<Down>", up="<Up>", left="<Left>", right="<Right>"):
 4         self.id = app.canvas.create_rectangle(0, 0, app.grid, app.grid,
 5                                               outline=color,
 6                                               fill=color)
 7         app.canvas.move(self.id,
 8                         app.grid * randint(0, app.width-1),
 9                         app.grid * randint(0, app.height-1))
10         app.root.bind(down, self.down)
11         app.root.bind(up, self.up)
12         app.root.bind(left, self.left)
13         app.root.bind(right, self.right)
14 
15         app.tick_register(self.tickej)
16 
17     def down(self, event=None):
18         app.canvas.move(self.id, 0, app.grid)
19         x1, y1, x2, y2 = app.canvas.coords(self.id)
20         if y2 > app.height * app.grid:
21             app.canvas.coords(self.id, x1, 0, x2, app.grid)
22 
23     def up(self, event):
24         app.canvas.move(self.id, 0, -app.grid)
25 
26     def left(self, event):
27         app.canvas.move(self.id, -app.grid, 0)
28 
29     def right(self, event):
30         app.canvas.move(self.id, app.grid, 0)
31 
32     def tickej(self, event=None):
33         self.down()

No a teď si vyzkoušíme, jak nám to hezky chodí. Uděláme si dva hady. jeden se ovládá pomocí šipek, dryhý pomocí A, S, D, W.

if __name__ == '__main__':
    root = Tk()
    app = App(root, 80, 60, 20)
    snake = Snake(app)
    snake2 = Snake(app, color='red', down="s", up='w', left='a', right='d')
    root.mainloop()

Celý zdrojový kód si můžete stáhnout.

Varianta had

Jak má celá hra vypadat záleží na vás. Jedna klasika je had. Ten se plazí a když něco sežere hezky nám naroste.

Varianta žížala

Kdysi za éry dosu jsme hráli takový malý závod. Každý má svou žížalu a ta leze z díry a je delší a delší. Ovládat ji musím tak, abych nenarazil ani do zdi, ani do soupeře ani sám do sebe.

Kategorie
TagCloud
#rekurze #OOP #začátečník #python #datové typy #hra #slovník #mírně pokročilý #středně pokročilý #podmínky a cykly #struktury a algoritmy #vstup/výstup #funkce #TkInter
Social