Esempio n. 1
0
class GuessGame():
    top = tk.Tk()
    btn_width = 5
    btn_borderwidth = 5
    ft = font.Font(size=15)
    element_column = 5
    l = None
    input = None
    answer_number = None
    round_number = 0
    guess_history = []
    timer_label = None
    timer_text = StringVar()
    timer_thread = None
    end_round = 10
    leader_board = LeaderBoard()
    current_second = 0

    def __init__(self):
        self.answer_number = self.create_number()
        # 開始Timer thread 物件
        self.timer_thread = TimerThread(self.update_time)
        self.current_second = 0
        self.input_number = StringVar()

    # 產生隨機不重複的4位數
    def create_number(self):
        num = str(randint(0, 9))
        while num == "0":
            num = str(randint(0, 9))
        while True:
            number = str(randint(0, 9))
            if str(number) not in num:
                num += number
            if len(num) == 4:
                return num

    def show_number_window(self):
        self.l.insert('end', "Answer: {}".format(self.answer_number))
        self.l.yview(END)

    def exit_game(self):
        self.top.destroy()

    '''
        新遊戲開始會重設所有必要參數
        如果遊戲輸了,則顯示信息。
    '''

    def new_game(self):
        self.timer_thread.stop_thread()
        self.timer_text.set("time: 00:00")
        self.round_number = 0
        self.guess_history = []
        self.l.delete(0, END)
        self.answer_number = self.create_number()
        del self.timer_thread
        self.timer_thread = TimerThread(self.update_time)
        self.timer_thread.start()
        self.input_number.set('')

    def lose_game(self, time=0, rounds=0, message="You lose!"):
        d = MyDialog(self.top, self, message, self.leader_board, rounds, time)
        self.top.wait_window(d.top)

    # 將秒數轉換為分鐘與秒,並更新計時器的label
    def update_time(self, time):
        second = time % 60
        minute = int(time / 60)
        self.current_second = time
        self.timer_text.set("time: {:02d}:{:02d}".format(minute, second))

    def run_game(self):
        guess_num = str(self.input.get())
        if guess_num == "":
            return
        has_error = False
        '''
            檢測error 並推送到List 上
        '''
        if len(guess_num) != 4:
            self.l.insert(
                'end',
                "{}   Invalid input!!! (length error) ".format(guess_num))
            has_error = True
        if len(set(guess_num)) != len(guess_num):
            self.l.insert(
                'end',
                "{}   Invalid input!!! (character repeat) ".format(guess_num))
            has_error = True
        if guess_num.isdigit() is False:
            self.l.insert(
                'end',
                "{}   Invalid input!!! (character error) ".format(guess_num))
            has_error = True
        if guess_num in self.guess_history:
            self.l.insert(
                'end', "{}   You guess this number before try again!!!".format(
                    guess_num))
            has_error = True
        '''
            如果沒有錯誤就執行這一小段
        '''
        if has_error is False:
            self.round_number += 1
            count = [0, 0]
            if guess_num == self.answer_number:
                self.l.insert('end',
                              "{}   You guess it right!!".format(guess_num))
                self.l.insert('end', "{}".format(self.timer_text.get()))
                self.l.yview(END)
                self.timer_thread.stop_thread()
                self.lose_game(self.current_second,
                               self.round_number,
                               message="You win!")
                return
            '''
                 計算判斷數字的重複與重疊數
            '''
            for c, character in enumerate(list(guess_num)):
                for g, character2 in enumerate(list(self.answer_number)):
                    if g == c and character == character2:
                        count[0] += 1
                    elif character == character2:
                        count[1] += 1
            self.l.insert(
                'end', "Round{} {} {}A{}B".format(self.round_number, guess_num,
                                                  count[0], count[1]))
            self.guess_history.append(guess_num)
            if self.round_number >= self.end_round:
                self.l.insert(
                    'end', "You lose! Answer: {}".format(self.answer_number))
                self.timer_thread.stop_thread()
                self.lose_game()
        self.input.delete(0, END)
        self.l.yview(END)

    '''

    '''

    def create_ui(self):
        frame = Frame(self.top)
        frame.pack()
        self.timer_label = Label(frame,
                                 text="time: 00:00",
                                 textvariable=self.timer_text)
        self.timer_label.pack()
        title = Label(frame, text="Welcome to Number Game")
        title.pack()
        self.input = Entry(frame, textvariable=self.input_number, bd=1)
        self.input.pack()
        Button(frame, text="Run", font=self.ft, command=self.run_game).pack()
        self.l = Listbox(frame, height=20, width=100)
        self.l.pack()
        Button(frame,
               text="Show Answer",
               borderwidth=self.btn_borderwidth,
               font=self.ft,
               command=self.show_number_window).pack()
        Button(frame,
               text="New Game",
               borderwidth=self.btn_borderwidth,
               font=self.ft,
               command=self.new_game).pack()
        Button(frame,
               text="Exit",
               borderwidth=self.btn_borderwidth,
               font=self.ft,
               command=self.exit_game).pack()

        self.l.yview(END)

        self.timer_thread.start()
        return self.top