Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from tkinter import *
- with open('dict', 'r', encoding='utf8') as f:
- dictionary = [line.replace('\n', '') for line in f.readlines()]
- rules_and_author = """
- Правила очень простые - первый игрок назвает слово,
- второй игрок называет слово, первая буква которого
- совпадает с последней буквой слова, названного первым
- игроком. Далее снова первый игрок и т.д по очереди.
- Первый игрок, который отправит фразу 'я сдаюсь' -
- проиграл.
- Автор: Tori, студентка группы P3273
- """
- p1_name = ''
- p2_name = ''
- # start window for setting up nicknames
- name_window = Tk()
- name_window.title = 'Введите имена'
- p1_name_label = Label(name_window, text='Имя первого игрока: ')
- p2_name_label = Label(name_window, text='Имя второго игрока: ')
- p1_name_label.grid(row=1, column=1)
- p2_name_label.grid(row=2, column=1)
- p1_name_entry = Entry(name_window, width=50)
- p2_name_entry = Entry(name_window, width=50)
- p1_name_entry.grid(row=1, column=2)
- p2_name_entry.grid(row=2, column=2)
- name_submit = Button(name_window, text='Готово!', command=name_window.destroy)
- name_submit.grid(row=3, column=1)
- while True:
- try:
- name_window.update()
- p1_name = p1_name_entry.get()
- p2_name = p2_name_entry.get()
- except:
- break
- class Game:
- def __init__(self, p1_name, p2_name, dictionary):
- self.last_letter = '' # last used letter
- self.used_words = [] # stores all used words
- self.bad_letters = ['ъ', 'ь', 'ы'] # we dont have words starts with this letter in Russian language
- self.used_words_index = 2 # gui offset
- self.dictionary = dictionary # setting game dictionary
- self.current_player_name = p1_name # init player names
- self.p1_name = p1_name
- self.p2_name = p2_name
- self.window = Tk() # gui window
- self.window.title = 'Словечки'
- self.word_field = Entry(self.window, width=50) # field for entering words
- self.word_field.grid(row=1, column=0)
- self.submit = Button(self.window, text='Готово', command=self.process_turn) # submit button
- self.submit.grid(row=1, column=1)
- self.status_label = Label(self.window) # label that displays current game state
- self.status_label['text'] = f'{self.current_player_name}, назови первое слово!'
- self.status_label.grid(row=0, column=0)
- self.help_button = Button(self.window, text='Спрака', command=self.show_help) # open help button
- self.help_button.grid(row=0, column=1)
- self.help_label = Label(self.window)
- self.help_label['text'] = rules_and_author
- self.window.mainloop() # gui mainloop
- def show_help(self):
- self.help_button['text'] = 'Спрятать' # 'open help button' -> 'close help button'
- self.help_button['command'] = self.hide_help
- self.help_label.grid(row=0, column=2) # display rules and author
- def hide_help(self):
- self.help_label.grid_forget() # hide rules and author
- self.help_button['text'] = 'Справка' # 'open help button' -> 'close help button'
- self.help_button['command'] = self.show_help
- def process_turn(self):
- word = self.word_field.get().lower() # get current word
- if self.last_letter == '': # first turn
- if word == '': # empty word
- self.status_label['text'] = f'Нельзя задать пустое слово! {self.current_player_name}, попробуй еще раз!'
- self.word_field.delete(0, 'end')
- return
- elif word not in self.dictionary: # unknown word
- self.status_label['text'] = f'Я не знаю такого слова... {self.current_player_name}, попробуй еще раз!'
- self.word_field.delete(0, 'end')
- return
- else: # update last letter
- for letter in reversed(word):
- if letter in self.bad_letters:
- continue
- self.last_letter = letter
- break
- self.used_words.append(word) # update used words
- else: # not first turn
- if word == 'я сдаюсь': # process surrender
- if self.current_player_name == p1_name:
- self.status_label['text'] = f'Поздравляю {self.p2_name} с победой!'
- else:
- self.status_label['text'] = f'Поздравляю {self.p1_name} с победой!'
- self.submit.grid_forget()
- return
- if word == '': # empty word
- self.status_label['text'] = f'Нельзя задать пустое слово! {self.current_player_name}, попробуй еще раз!'
- self.word_field.delete(0, 'end')
- return
- elif word not in self.dictionary: # unknown word
- self.status_label['text'] = f'Я не знаю такого слова... {self.current_player_name}, попробуй еще раз!'
- self.word_field.delete(0, 'end')
- return
- elif word[0] != self.last_letter: # wrong first letter
- self.status_label['text'] = f'Слово должно начинаться с буквы \'{self.last_letter}\'! {self.current_player_name}, попробуй еще раз!'
- self.word_field.delete(0, 'end')
- return
- elif word in self.used_words: # word already used in this session
- self.status_label['text'] = f'Такое слово уже было! {self.current_player_name}, попробуй еще раз!'
- self.word_field.delete(0, 'end')
- return
- else: # update last letter
- for letter in reversed(word):
- if letter in self.bad_letters:
- continue
- self.last_letter = letter
- break
- self.used_words.append(word) # update used words
- if self.current_player_name == self.p1_name: # update current player
- self.current_player_name = self.p2_name
- else:
- self.current_player_name = self.p1_name
- self.status_label['text'] = f'Текущая буква - \'{self.last_letter}\'! {self.current_player_name} - назови слово на эту букву!'
- self.word_field.delete(0, 'end')
- label = Label(self.window) # display userd words
- label['text'] = word
- label.grid(row=self.used_words_index, column=0)
- self.used_words_index += 1
- Game(p1_name, p2_name, dictionary)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement