Kihagyás

9. gyakorlat

A gyakorlat anyaga

Tkinter

  • Biro, http
import tkinter as tk
import tkinter.simpledialog
import time

import htmllistparse


def login_and_load_biro(tb):
    h_user = tkinter.simpledialog.askstring("Név", "Hallgatói azonosító:")
    h_pw = tkinter.simpledialog.askstring("Jelszó", "Jelszó:", show='*')
    feladat = tkinter.simpledialog.askstring("Válassz feladatot", "Feladat száma:")
    listing = []
    try:
        cwd, listing = htmllistparse.fetch_listing(f"https://biro.inf.u-szeged.hu/Hallg/IB088g/{feladat}/{h_user}/", timeout=30, auth=(h_user, h_pw))
        for entry in listing:
            if entry.size is None:  # konyvtar
                tb.insert(tk.END, f"{entry.name}. beadás - Legutóbb módosítva: {time.strftime('%Y-%m-%dT%H:%M:%SZ', entry.modified)}\n")
    except Exception as e:
        tb.insert(0.0, "Hiba történt!" + str(e))
        print(e)


def main():
    win = tk.Tk()
    canvas = tk.Canvas(win, width=700, height=500)
    canvas.grid(columnspan=2, rowspan=5)
    lbl = tk.Label(win, font=('Arial', 30, 'bold'), text="Biro asztali GUI")
    lbl.grid(columnspan=2, column=0, row=0)

    tb = tk.Text(win, height=20, width=70, padx=10, pady=10)
    tb.grid(columnspan=2, row=2)

    # btn_load = tk.Button(win, text="Load Biro", command=login_and_load_biro, font="Arial 30 bold", bg="#8fcaca")
    btn_load = tk.Button(win, text="Betöltés", command=lambda: login_and_load_biro(tb), font="Arial 30 bold", bg="#8fcaca")
    btn_load.grid(columnspan=2, column=0, row=1)

    win.mainloop()


if __name__ == '__main__':
    main()

Húsvéti tojáselkapás

import random
import tkinter as tk
from itertools import cycle
from tkinter import messagebox

canvas_width = 800
canvas_height = 600

night_mode = False
night = "midnight blue"
night_colors = {
    'sky': 'midnight blue',
    'grass': 'dark green'
}

day_colors = {
    'sky': 'deep sky blue',
    'grass': 'sea green'
}

color_palette = day_colors if not night_mode else night_colors

color_cycle = cycle(['light blue', 'light pink', 'light yellow', 'light green', 'red', 'blue', 'green', 'black'])
egg_width = 45
egg_height = 55
egg_score = 10
egg_speed = 200
egg_interval = 4000
difficulty_factor = 0.95

catcher_color = 'brown'
catcher_width = 100
catcher_height = 100
catcher_start_x = canvas_width / 2 - catcher_width / 2
catcher_start_y = canvas_height - catcher_height - 20
catcher_start_x2 = catcher_start_x + catcher_width
catcher_start_y2 = catcher_start_y + catcher_height


class EggCatcher(tk.Tk):
    def __init__(self):
        super().__init__()

        self.c = tk.Canvas(self, width=canvas_width, height=canvas_height, background=color_palette['sky'])
        self.c.create_rectangle(-5, canvas_height - 100, canvas_width + 5, canvas_height + 5, fill=color_palette['grass'], width=0)
        self.c.create_oval(-80, -80, 120, 120, fill='orange', width=0)
        self.c.pack()
        # difficulty = tkinter.simpledialog.askinteger("Difficulty", "Choose difficulty between 1-3:", parent=self)

        self.score = 0
        self.lives_remaning = 3
        self.catcher = self.c.create_arc(catcher_start_x, catcher_start_y, catcher_start_x2, catcher_start_y2, start=200, extent=140, style='arc', outline=catcher_color, width=4)
        self.score_text = self.c.create_text(10, 10, anchor='nw', font=('Arial', 18, 'bold'), fill='darkblue', text='Score : ' + str(self.score))
        self.lives_text = self.c.create_text(canvas_width - 10, 10, anchor='ne', font=('Arial', 18, 'bold'), fill='darkblue', text='Lives : ' + str(self.lives_remaning))

        self.eggs = []
        # Irányítás
        self.c.bind('<Left>', self.move_left)
        self.c.bind('<Right>', self.move_right)
        self.c.focus_set()

    def create_egg(self):
        x = random.randint(10, 740)
        y = random.randint(egg_height // 2, 60)
        new_egg = self.c.create_oval(x, y, x + egg_width, y + egg_height, fill=next(color_cycle), width=0)
        self.eggs.append(new_egg)
        self.after(egg_interval, self.create_egg)

    def move_eggs(self):
        for egg in self.eggs:
            (egg_x, egg_y, egg_x2, egg_y2) = self.c.coords(egg)
            self.c.move(egg, 0, 10)
            if egg_y2 > canvas_height:
                self.egg_dropped(egg)
        self.after(egg_speed, self.move_eggs)

    def egg_dropped(self, egg):
        self.eggs.remove(egg)
        self.c.delete(egg)
        self.lose_a_life()
        if self.lives_remaning == 0:
            messagebox.showinfo('GAME OVER!', 'Final Score : ' + str(self.score))
            self.destroy()

    def lose_a_life(self):
        self.lives_remaning -= 1
        self.c.itemconfigure(self.lives_text, text='Lives : ' + str(self.lives_remaning))

    def catch_check(self):
        (catcher_x, catcher_y, catcher_x2, catcher_y2) = self.c.coords(self.catcher)
        for egg in self.eggs:
            (egg_x, egg_y, egg_x2, egg_y2) = self.c.coords(egg)
            if catcher_x < egg_x and egg_x2 < catcher_x2 and catcher_y2 - egg_y2 < 40:
                self.eggs.remove(egg)
                self.c.delete(egg)
                self.increase_score(egg_score)
        self.after(100, self.catch_check)

    def increase_score(self, points):
        global egg_speed, egg_interval
        self.score += points
        egg_speed = int(egg_speed * difficulty_factor)
        egg_interval = int(egg_interval * difficulty_factor)
        self.c.itemconfigure(self.score_text, text='Score : ' + str(self.score))

    def move_left(self, event):
        (x1, y1, x2, y2) = self.c.coords(self.catcher)
        if x1 > 0:
            self.c.move(self.catcher, -20, 0)

    def move_right(self, event):
        (x1, y1, x2, y2) = self.c.coords(self.catcher)
        if x2 < canvas_width:
            self.c.move(self.catcher, 20, 0)


if __name__ == '__main__':
    game = EggCatcher()
    game.after(1000, game.create_egg)
    game.after(1000, game.move_eggs)
    game.after(1000, game.catch_check)

    game.mainloop()

Órai feladatok

Megjegyzés

Az órai feladatok alatt lévő feladat(sor)ok azok a feladat(sor)ok, amelyek megoldása beleszámít a zh javításért megoldandó feladatok közé. Ezen feladat(sor)okból 6 darab megoldása szükséges ahhoz, hogy egy zh javíthatóvá váljon. Ha külön nem jelezzük, a teljes feladatsor megoldása esetén jár a zh javításért szerezhető pont.

Info

Tetszőlegesen 3 kicsi feladat megoldása szükséges a zh javításért járó pont megszerzéséért (bármelyik nagyobb feladatrészből).

Bíró GUI

  1. A Bírón található beadások eredményei is jelenljenek meg a sorokban (pont.txt letöltése által).

  2. A feladatot addig kérjük be, amíg számot nem kapunk.

  3. Hibakezelés felugró ablakok segítségével.

  4. A szövegdoboz helyett labelekkel vagy táblázatokkal jelenjenek meg az eredmények.

  5. Az eredmények mellett a beadás (feladat.py) letöltésére legyen egy gomb, ami megkérdezi, hogy hova szeretnénk menteni

Hint

Bővebben a dialógusokról: https://docs.python.org/3/library/dialog.html

  1. Mindent lement gomb, ami az összes feladat.py-t letölti a feladat.pdf fájlok kíséretében.

Tojásos játék

  1. Szebb "game over" ablak.

  2. A tojások sebessége változó legyen.

  3. Teljes night mode, ami 19-06 között automatikusan bekapcsol.

  4. Ranglista mentése fájlba (JSON alapú), és game over esetén ennek megjelenítése, ehhez név bekérése a játék elején.

  5. Nehézség választás, ennek megfelelő játékmenet.

  6. Random tojásejtések

  7. Felszedhető power upok (pl. fekete színű tojás lelassítja a kosarat 10 másodpercre).

  8. Színesebb tojások (pl.: pöttyös, csíkos, átmenetes).

  9. Személyre szabható konfiguráció (.ini fájlból, ehhezt megfelelő beolvasó keresése).

  10. Irányítás az egérrel történjen.

  11. Online ranglista (ehhez akár másnyelven egy API készítése, requesttel történő posztolással lehessen eredményeket betölteni).


Utolsó frissítés: 2022-04-12 11:32:42