背單詞小游戲,要有多界面交互,界面整潔、美觀,可調節游戲等級難度,可配置游戲信息。
有游戲分數,游戲時間,動畫特效,背景音樂,不同游戲等級的歷史最高分記錄。
拼寫成功的英文單詞顯示中文意思。支持長按回刪鍵[backspace],快速刪除單詞字母。
多種游戲困難等級讓玩家可以側重提高打字速度、或者練習英語單詞。
完整程序代碼下載地址:Python背單詞記單詞小程序源代碼
#!/usr/bin/env python
# -*- coding:utf-8 -*-
"""
Description: { 背單詞小游戲主入口模塊 }
"""
import os
import sys
import time
import json
import traceback
import Game_View
from Game_View import *
from Game_Sprite import *def center_pos():"""設置游戲窗口相對電腦屏幕居中"""game_x = (Game_Info.SCREEN_X - Game_Info.SCREEN_RECT.width) / 2game_y = (Game_Info.SCREEN_Y - Game_Info.SCREEN_RECT.height) / 2os.environ['SDL_VIDEO_WINDOW_POS'] = "%d, %d" % (game_x, game_y)def random_music():"""隨機播放背景音樂"""# 判斷是否是靜音模式print(Game_View.GameStartWin.voice_flag())try:pygame.mixer.init()pygame.mixer.music.load(random.choice(Game_Info.GAME_MUSICS))pygame.mixer.music.play(loops=0)except Exception as e:print("無法加載音頻,請檢查電腦配置" + str(e))print(traceback.format_exc())if not Game_View.GameStartWin.voice_flag():pygame.mixer_music.set_volume(0)class TypingGame(object):"""打字小游戲主類"""spell_ok = False # 用于標識單詞拼寫成功game_pause_flag = False # 游戲暫停標志game_over_flag = False # 游戲結束標志game_quit_flag = False # 游戲退出標志game_total_blood = Game_Info.GAME_BLOOD_RECT.width # 游戲總能量(血條)# 游戲等級對照字典game_level_dict = {1: {"word_fall_speed": 0.3, "level_text": "簡單", "level_color": "green"},2: {"word_fall_speed": 0.5, "level_text": "上手", "level_color": "blue"},3: {"word_fall_speed": 1.0, "level_text": "中等", "level_color": "orange"},4: {"word_fall_speed": 1.5, "level_text": "困難", "level_color": "red"},5: {"word_fall_speed": 2.0, "level_text": "魔鬼", "level_color": "purple"}}@staticmethoddef game_init():"""游戲初始化"""pygame.init()# 初始化游戲字體pygame.font.init()# 設置游戲標題和圖標pygame.display.set_caption(Game_Info.GAME_NAME)pygame.display.set_icon(pygame.image.load(Game_Info.GAME_ICON_32))@staticmethoddef set_game_event():"""設置游戲事件"""# 設置創建單詞的定時器pygame.time.set_timer(Game_Info.CREATE_WORD_EVENT, Game_Info.CREATE_WORD_INTERVAL)# 設置游戲音樂結束事件try:pygame.mixer.music.set_endevent(Game_Info.MUSIC_END_EVENT)except Exception as e:print("無法設置音樂結束事件\t" + str(e))print(traceback.format_exc())@staticmethoddef load_words() -> dict:"""加載英語單詞return:{"CET4": [{"eng_word": "a","cn_comment": "art.一(個);每一(個)"},...]}"""with open(Game_Info.GAME_WORD_JSON, "r", encoding="utf-8") as file:word_json = file.read()word_dict = json.loads(word_json)return word_dictdef __init__(self):self.words = self.load_words().get("CET4")self.game_conf = GameConfig() # 游戲配置信息self.game_default_voice = 20 # 游戲默認音量self.use_time = 0 # 記錄游戲使用的時間self.total_score = 0 # 記錄游戲拼寫成功了多少個單詞self.word_content = "" # 記錄鍵盤輸入的單詞self.backspace_count = 0 # 回刪鍵按下的次數# 預先創建動畫對象self.animates = [Animation(self) for _ in range(5)]# 游戲初始血條值self.game_blood = int(self.game_conf.game_init_blood) * 10self.game_clock = pygame.time.Clock()self.screen = pygame.display.set_mode(Game_Info.SCREEN_RECT.size)self.game_init()self.set_game_event() # 設置游戲事件self.__create_sprite() # 創建游戲精靈def __create_sprite(self):"""創建精靈和精靈組"""# 背景精靈back_sprite = ImageSprite(Game_Info.GAME_BACKGROUND)# 根據游戲屏幕的大小適配背景圖(可能會導致背景圖變形)back_sprite.transform_scale(back_sprite.image,(Game_Info.SCREEN_RECT.width, Game_Info.SCREEN_RECT.height))self.back_group = pygame.sprite.Group(back_sprite)# 英文單詞顯示框input_rect_sprite = ImageSprite(Game_Info.INPUT_BACKGROUND)# 縮放圖片input_rect_sprite.transform_scale(input_rect_sprite.image,(Game_Info.INPUT_RECT_WIDTH, Game_Info.INPUT_RECT_HEIGHT))# 水平居中顯示input_rect_sprite.hor_center(Game_Info.SCREEN_RECT)self.input_rect_group = pygame.sprite.Group(input_rect_sprite)# 創建“游戲設置”圖片self.game_set_sprite = ImageSprite(Game_Info.GAME_SET_PINK)set_x = Game_Info.SCREEN_RECT.width - self.game_set_sprite.rect.width - 10set_y = Game_Info.SCREEN_RECT.height - self.game_set_sprite.rect.height - 10self.game_set_sprite.set_pos(set_x, set_y)self.game_set_sprite_group = pygame.sprite.Group(self.game_set_sprite)# 拼寫的單詞spell_word_sprite = SpellSprite("",size=26,color=pygame.color.Color(self.game_conf.spell_ok_color))spell_word_sprite.hor_center(Game_Info.SCREEN_RECT)spell_word_sprite.set_pos(spell_word_sprite.rect.x, 40)self.spell_word_group = pygame.sprite.Group(spell_word_sprite)# 創建單詞精靈組self.word_group = pygame.sprite.Group()self.__random_generate_word(Game_Info.GENERATE_WORD_NUM)# 創建顯示游戲時間精靈time_sprite = TextSprite(text="Time: 0", size=28, color=Game_Info.BLUE)time_sprite.set_pos(5, 0)self.time_group = pygame.sprite.Group(time_sprite)# 游戲分數self.score_sprite = TextSprite("Score: 0", size=30, color=Game_Info.BLUE)self.score_sprite.set_pos(Game_Info.SCREEN_RECT.width - self.score_sprite.rect.width - 20, 3)self.score_group = pygame.sprite.Group(self.score_sprite)# 游戲結束精靈(組)self.__game_over_sprite()def __game_over_sprite(self):"""創建游戲結束的精靈(組)"""self.game_over_group = pygame.sprite.Group()game_over_sprite = TextSprite("Game Over", 100, Game_Info.BLUE)game_over_sprite.rect.y = (Game_Info.SCREEN_RECT.height - game_over_sprite.rect.height - 400) / 2game_over_sprite.hor_center(Game_Info.SCREEN_RECT)game_level_text = self.game_level_dict[int(self.game_conf.game_level)]["level_text"]game_level_color = pygame.color.Color(self.game_level_dict[int(self.game_conf.game_level)]["level_color"])self.game_level_sprite = TextSprite(u"游戲等級: " + game_level_text, 50, game_level_color)self.game_level_sprite.rect.y = game_over_sprite.rect.y + 100 + 50self.game_level_sprite.hor_center(Game_Info.SCREEN_RECT)self.game_score_sprite = TextSprite(u"游戲分數: ", 50, Game_Info.BLUE)self.game_score_sprite.rect.y = game_over_sprite.rect.y + 200 + 50self.game_score_sprite.hor_center(Game_Info.SCREEN_RECT)self.highest_sprite = TextSprite(u"歷史最高: ", 50, Game_Info.BLUE)self.highest_sprite.rect.y = game_over_sprite.rect.y + 300 + 50self.highest_sprite.hor_center(Game_Info.SCREEN_RECT)self.quit_sprite = TextSprite(u"退出", 50, Game_Info.BLUE)self.quit_sprite.set_pos(game_over_sprite.rect.x - self.quit_sprite.rect.width,game_over_sprite.rect.y + 400 + 10)self.reset_sprite = TextSprite(u"重 玩", 50, Game_Info.BLUE)self.reset_sprite.set_pos(game_over_sprite.rect.x + game_over_sprite.rect.width,game_over_sprite.rect.y + 400 + 10)self.game_over_group.add(game_over_sprite,self.game_level_sprite,self.game_score_sprite,self.highest_sprite,self.quit_sprite, self.reset_sprite)def __update_sprite(self):"""更新精靈"""self.back_group.update()self.back_group.draw(self.screen)self.game_set_sprite_group.update()self.game_set_sprite_group.draw(self.screen)self.input_rect_group.update()self.input_rect_group.draw(self.screen)# 計算游戲使用時間if not self.game_pause_flag and not self.game_over_flag:self.use_time += 0.1display_time = "Time: " + str(self.use_time / 6)self.time_group.update(display_time[:12])self.time_group.draw(self.screen)self.score_sprite.set_pos(Game_Info.SCREEN_RECT.width - self.score_sprite.rect.width - 20, 3)self.score_group.update("Score: " + str(self.total_score))self.score_group.draw(self.screen)# 判斷是否游戲結束if self.game_over_flag:self.__game_over()game_level_text = self.game_level_dict[int(self.game_conf.game_level)]["level_text"]self.game_level_sprite.update("游戲等級: " + str(game_level_text))self.game_over_group.draw(self.screen)else:if not self.game_pause_flag:self.word_group.update(self)self.word_group.draw(self.screen)spell_ok_color = pygame.Color(self.game_conf.spell_ok_color)self.spell_word_group.update(self.word_content, spell_ok_color)self.spell_word_group.draw(self.screen)# 更新游戲能量條if 0 <= self.game_blood <= self.game_total_blood:self.__draw_game_blood()# 單詞精靈拼寫成功動畫for animate in self.animates:if animate.visible:animate.draw()def start_game(self):"""打字游戲開啟"""# 隨機播放背景音樂random_music()# 利用多線程完成游戲持續掉血drop_blood_t = threading.Thread(target=self.__drop_blood)drop_blood_t.start()while True:# 是否設置成靜音if not Game_View.GameStartWin.voice_flag():pygame.mixer_music.set_volume(0)else:pygame.mixer_music.set_volume(self.game_default_voice)# 設置游戲刷新幀率self.game_clock.tick(Game_Info.FRAME_PRE_SEC)# 判斷游戲結束if self.game_blood < 0:TypingGame.game_over_flag = Trueelse:self.__animate_action()self.__check_spell_word()self.__update_sprite()self.__event_handle()pygame.display.update()def __event_handle(self):"""游戲事件監聽"""# 遍歷所有事件for event in pygame.event.get():try:if pygame.mixer.music.get_endevent() == Game_Info.MUSIC_END_EVENT and \not pygame.mixer.music.get_busy():# 如果music播放結束且沒有音樂在播放就隨機下一首print("下一首")random_music()except:pass# 如果單擊關閉窗口,則退出if event.type == pygame.QUIT and not self.game_pause_flag:pygame.quit()TypingGame.game_quit_flag = Truesys.exit()# 創建單詞事件elif event.type == Game_Info.CREATE_WORD_EVENT:if not self.game_over_flag and not self.game_pause_flag:# 游戲結束或者暫停就停止生成單詞了self.__random_generate_word(word_num=3)# 鼠標移動事件elif event.type == pygame.MOUSEMOTION:x, y = event.pos # 獲取屏幕坐標位置if self.__is_on_set(x, y):self.game_set_sprite.image = pygame.image.load(Game_Info.GAME_SET_BLUE)else:self.game_set_sprite.image = pygame.image.load(Game_Info.GAME_SET_PINK)# 游戲結束鼠標懸浮在確定按鈕上變色if self.quit_sprite.rect.x <= x <= self.quit_sprite.rect.x + self.quit_sprite.rect.width and \self.quit_sprite.rect.y <= y <= self.quit_sprite.rect.y + self.quit_sprite.rect.height:self.quit_sprite.color = Game_Info.PINKself.quit_sprite.update(self.quit_sprite.text)else:self.quit_sprite.color = Game_Info.BLUEself.quit_sprite.update(self.quit_sprite.text)# 游戲結束鼠標懸浮在重玩按鈕上變色if self.reset_sprite.rect.x <= x <= self.reset_sprite.rect.x + self.reset_sprite.rect.width and \self.reset_sprite.rect.y <= y <= self.reset_sprite.rect.y + self.reset_sprite.rect.height:self.reset_sprite.color = Game_Info.PINKself.reset_sprite.update(self.reset_sprite.text)else:self.reset_sprite.color = Game_Info.BLUEself.reset_sprite.update(self.reset_sprite.text)# 鼠標點擊事件elif event.type == pygame.MOUSEBUTTONDOWN:x, y = event.pos # 獲取屏幕坐標位置# 點擊游戲設置if self.__is_on_set(x, y):# 判斷游戲是否暫停if not self.game_pause_flag:TypingGame.game_pause_flag = True# 游戲結束鼠標點擊退出按鈕if self.quit_sprite.rect.x <= x <= self.quit_sprite.rect.x + self.quit_sprite.rect.width and \self.quit_sprite.rect.y <= y <= self.quit_sprite.rect.y + self.quit_sprite.rect.height:pygame.quit()TypingGame.game_quit_flag = Truesys.exit()# 游戲結束鼠標點擊重玩按鈕if self.reset_sprite.rect.x <= x <= self.reset_sprite.rect.x + self.reset_sprite.rect.width and \self.reset_sprite.rect.y <= y <= self.reset_sprite.rect.y + self.reset_sprite.rect.height:self.__reset_game()# 鍵盤事件elif event.type == pygame.KEYDOWN and not self.game_over_flag and not self.game_pause_flag:# 英文單引號的ASCII值是39、-是45、.是46# print(event.key)if (pygame.K_a <= event.key <= pygame.K_z) or event.key in (39, 45, 46):if self.spell_ok:# 如果單詞拼寫成功再按下鍵盤時清空內容self.word_content = ""self.spell_ok = False# 控制單詞長度if len(self.word_content) < 40:# 記錄鍵盤輸入的字符self.word_content += pygame.key.name(event.key)else:print("Word to long")print(self.word_content)if event.key == pygame.K_BACKSPACE:self.__delete_words()elif event.type == pygame.KEYUP:self.backspace_count = 0# 實現長按backspace連續回刪# 使用鍵盤提供的方法獲取鍵盤按鍵 - 按鍵元組keys_pressed = pygame.key.get_pressed()# 判斷元組中對應的按鍵索引值 1if keys_pressed[pygame.K_BACKSPACE]:self.backspace_count += 1if self.backspace_count > 20:self.__delete_words()def __is_on_set(self, x, y):"""檢查是否在設置圖片上:param x,y 鼠標的位置"""img_set_x = self.game_set_sprite.rect.ximg_set_y = self.game_set_sprite.rect.yimg_set_w = self.game_set_sprite.rect.widthimg_set_h = self.game_set_sprite.rect.heightif (img_set_x <= x <= img_set_x + img_set_w) and \(img_set_y <= y <= img_set_y + img_set_h):return Trueelse:return Falsedef __delete_words(self):"""單詞回刪"""if self.word_content != "":self.word_content = self.word_content[:-1]print(self.word_content + "---" + str(len(self.word_content)))if self.spell_ok:# 如果單詞拼寫成功再按下鍵盤回刪鍵時清空內容self.word_content = ""self.spell_ok = Falsedef __random_generate_word(self, word_num=5):"""隨機生成單詞精靈:param word_num:精靈數量 默認5:return:"""count = 0while len(self.word_group.sprites()) <= 30:index = random.randint(0, len(self.words) - 1)eng_word = self.words[index]["eng_word"]cn_comment = self.words[index]["cn_comment"]# print(eng_word + "----" + cn_comment)word_sprite = WordSprite(eng_word,cn_comment,speed=self.game_level_dict[int(self.game_conf.game_level)]['word_fall_speed'],size=int(self.game_conf.word_size),color=pygame.color.Color(str(self.game_conf.word_normal_color)))# 單詞位置隨機word_sprite.random_pos()# 檢查新單詞精靈是否與單詞精靈組中的精靈碰撞(重疊)words = pygame.sprite.spritecollide(word_sprite, self.word_group, False,)is_collide = pygame.sprite.spritecollideany(word_sprite, self.word_group)print("碰撞", is_collide)# 碰撞(釋放內存重新隨機生成單詞精靈)if len(words) > 0:word_sprite.kill()print("重疊")continueelse:self.word_group.add(word_sprite)count += 1if count >= word_num:breakdef __game_over(self):"""游戲結束"""self.game_score_sprite.hor_center(Game_Info.SCREEN_RECT)self.highest_sprite.hor_center(Game_Info.SCREEN_RECT)self.game_score_sprite.update("游戲分數: %s" % self.total_score)"""history_score_dict{'level_0': "{'score': None,'use_time': None,'create_time': None}",'level_1': "{'score': None,'use_time': None,'create_time': None}",'level_2': "{...}",...}"""# 顯示歷史最高highest_score_str = self.game_conf.history_score_dict['level_' + str(int(self.game_conf.game_level))]highest_score_dict = eval(highest_score_str)highest_score = highest_score_dict['score']if highest_score is None or int(self.total_score) > int(highest_score):# 更新歷史記錄highest_score = self.total_scorehighest_score_dict['score'] = str(self.total_score)highest_score_dict['use_time'] = str(self.use_time)[:5] + 's'highest_score_dict['create_time'] = str(time.strftime("%Y-%m-%d %H:%M"))self.game_conf.set_highest_score(str(highest_score_dict), 'level_' + str(int(self.game_conf.game_level)))else:highest_score = highest_score_dict['score']self.highest_sprite.update("歷史最高: %s" % highest_score)def __check_spell_word(self):"""檢查拼寫單詞是否正確"""word_sprites = self.word_group.sprites()for word_sprite in word_sprites:# 判斷單詞內容是否相同if self.word_content.lower() == word_sprite.text.lower():# 判斷血條是否超過總血條數if self.game_blood < self.game_total_blood:self.game_blood += 10self.total_score += 1self.spell_ok = Trueself.word_content = self.word_content + "\t" + str(word_sprite.cn_comment)word_sprite.kill()# 從預先創建完畢的動畫中取出一個動畫對象for animate in self.animates:if not animate.visible:# 設置動畫位置animate.set_pos(word_sprite.rect.x, word_sprite.rect.y)# 動畫對象狀態設置為Trueanimate.visible = Truebreakdef __draw_game_blood(self, color=Game_Info.GREEN):"""繪制游戲能量"""if self.game_blood <= 3 * 10:color = Game_Info.REDif self.game_blood >= 25 * 10:color = Game_Info.BLUEif self.game_total_blood - 30 <= self.game_blood <= self.game_total_blood:color = Game_Info.ORANGE# 繪制游戲能量pygame.draw.rect(self.screen, color,pygame.Rect(Game_Info.GAME_BLOOD_RECT.x + 2,Game_Info.GAME_BLOOD_RECT.y,self.game_blood,Game_Info.GAME_BLOOD_RECT.height))pygame.draw.rect(self.screen, Game_Info.WHITE, Game_Info.GAME_BLOOD_RECT, 2)def __drop_blood(self):"""持續掉血"""# if not self.game_pause_flag:# if int(self.use_time) > 0 and (int(self.use_time) / 6) % 2 == 0:# self.game_blood -= 0.5while not self.game_over_flag:if self.game_pause_flag:self.game_clock.tick(60)else:# 根據不同游戲等級掉血self.game_clock.tick(int(self.game_conf.game_level))self.game_blood -= 1def __animate_action(self):"""開啟單詞拼寫成功動畫"""for animate in self.animates:if animate.visible:animate.action()def __reset_game(self):"""游戲重玩"""del self # 釋放內存pygame.quit()pygame.init()random_music()TypingGame.game_over_flag = FalseTypingGame.game_quit_flag = FalseTypingGame().start_game()def main():center_pos()# 啟動游戲開始界面GameStartWin(title="Word Sprite").run()if __name__ == '__main__':main()
完整程序代碼下載地址:Python背單詞記單詞小程序源代碼
總結
以上是生活随笔為你收集整理的Python背单词记单词小程序源代码,背单词记单词小游戏源代码的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。