Erstes Programm: Ein kleines Reaktionsspiel

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
BlackJack

Mal ein Versuch von mir (Python 2):

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import Tkinter as tk
from collections import deque
from functools import partial
from random import randint


class Game(object):

    def __init__(self):
        self.current_digit = 4
        self.digits = deque()
        self.max_digit_count = 10

    def clear_digits(self):
        self.digits.clear()

    def add_random_digit(self):
        if len(self.digits) >= self.max_digit_count:
            raise ValueError('max digits reached')
        self.digits.append(randint(1, 9))
        self.check_and_remove()

    def change_current_digit(self, amount):
        self.current_digit = (self.current_digit - 1 + amount) % 9 + 1
        self.check_and_remove()

    def check_and_remove(self):
        while self.digits and self.digits[0] == self.current_digit:
            self.digits.popleft()


class WheelUI(tk.Frame):

    def __init__(self, parent, game):
        tk.Frame.__init__(self, parent)
        self.game = game
        self.digit_labels = list()
        for font in ['Arial 20', 'Arial 30', 'Arial 20']:
            label = tk.Label(
                self, font=font, width=3, relief=tk.GROOVE, borderwidth=2
            )
            label.pack(side=tk.TOP)
            self.digit_labels.append(label)
        self.update_display()

    def update_display(self):
        current_digit = self.game.current_digit
        for digit, label in zip(
            range(current_digit - 1, current_digit + 2), self.digit_labels
        ):
            if digit == 0:
                digit = 9
            elif digit == 10:
                digit = 1
            label['text'] = digit


class GameUI(tk.Frame):

    def __init__(self, parent, game):
        tk.Frame.__init__(self, parent)
        self.game = game
        self.after_id = None
        self.wheel = WheelUI(self, self.game)
        self.wheel.pack(side=tk.LEFT)
        self.scroller_label = tk.Label(
            self, width=10, font='Arial 22', relief=tk.GROOVE, borderwidth=2
        )
        self.scroller_label.pack(side=tk.LEFT)
        self.update_display()
        self.scroller_label.config(text='Press Enter', anchor=tk.CENTER)
        toplevel = self.winfo_toplevel()
        toplevel.bind('<Return>', self.on_return)
        toplevel.bind('<Up>', partial(self.on_change_wheel, -1))
        toplevel.bind('<Down>', partial(self.on_change_wheel, 1))

    def update_display(self):
        self.wheel.update_display()
        self.scroller_label.config(
            text=''.join(str(d) for d in self.game.digits), anchor=tk.E
        )

    def _game_step(self):
        try:
            self.game.add_random_digit()
        except ValueError:
            self.scroller_label.config(text='Game Over', anchor=tk.CENTER)
            self.after_id = None
        else:
            self.update_display()
            self.after_id = self.after(1000, self._game_step)

    def on_return(self, _event=None):
        if not self.after_id:
            self.game.clear_digits()
            self._game_step()

    def on_change_wheel(self, amount, _event=None):
        if self.after_id:
            self.game.change_current_digit(amount)
            self.update_display()


def main():
    root = tk.Tk()
    root.title('Zahlenlaufband')
    game = Game()
    game_ui = GameUI(root, game)
    game_ui.pack()
    root.mainloop()


if __name__ == '__main__':
    main()
way2slow
User
Beiträge: 19
Registriert: Sonntag 14. Februar 2016, 22:27
Wohnort: Hamburg

Wow! Völlig anders als meins. Das muss ich erst mal in Ruhe verarbeiten. Echt nett von Dir!
Antworten