广告位联系
返回顶部
分享到

基于Python实现英语单词小游戏

python 来源:互联网 作者:佚名 发布时间:2022-11-12 21:39:10 人浏览
摘要

相信大家对于英语四级一点都不陌生了吧? 很多学校都是要求学生必须考过英语四级,不然就不能毕业。 一开始我抱着侥幸心理,心想上高中的时候英语不错,四级应该也很容易。不

相信大家对于英语四级一点都不陌生了吧?

很多学校都是要求学生必须考过英语四级,不然就不能毕业。

一开始我抱着侥幸心理,心想上高中的时候英语不错,四级应该也很容易。不过成绩出来我就傻眼了,没有通过。然后我就制定了周密的学习计划,开始有计划地学习英语,等到第二次考试的时候终于通过啦。今天,小编给大家制作一款Python编程代码版本的四级考试打字小游戏,边玩儿游戏还能复习单词还能保持学习的积极性,这款代码游戏真的是考级姐妹的灵魂首先,让我们开正式康康叭

一、敲代码之前的小tips

仅个人观点勿喷

四级之前,大家要很认真的备考啦,每天做做各种类型的四级题,可以量不多,但是会用心的做,做完之后都会认真的总结,就算那种不仔细的原因也会写在错题旁边,借以提醒自己。每天这样去做的原因就是保持题感,毕竟四级是一门考试,好多题还是有很多套路的,但只要持之以恒地去联系,虽然套路深,铁杵磨成针。

听力方面:每次听完并对过答案之后会继续听那一份听力材料,因为第一次是泛听,只需要抓住关键词的信息成功get到答案就好,那么后面就要开始精听,这一次我们的目标就是听懂这个人到底在说什么,争取听懂每一句,好了,接下来,当我反复听一句话却怎么也听不懂其中的某几个词的时候,那我就找到可以收入宝囊的法器了,然后你就把这几个词好好地在牛津字典里查一查,记在自己的收集本上,还要多多巩固,因为这些词语出现在考试中,从某种程度上来说就属于高频词汇的。另外呢,在精听的时候,我们要多多注意朗读者说英语时的感觉,包括他的发音、语调,都很重要,所以也可以跟着他一起读英语,在边听边说的过程中,我们的耳朵对英语会更加地敏感。

阅读方面:在就应对四级考试的时候,刷题当然是不二选择,前面已经提到过四级套路深,所以考试之前,我每天大概会做一篇阅读,设定时间是很重要的,这样可以把握自己的考试节奏,不会太慌张。四级阅读题,一般都会按照文章的顺序来设计题目,一般情况下,四级阅读题的内容不会太少,信息量比较多,而我需要的又仅仅只是那几条有用的信息。那么,首先就先看文章后面的问题,带着问题去读文章,会起到事半功倍的效果,也节省时间。做完一篇阅读之后,需要认真总结错误原因,那么你错的题就错得很有意义,如果只是不停地做题,而不停下来反思原因,那做一万道题也不如做一道题。总结错误之后,同样需要仔细查阅陌生的单词,不断积累,方可在英语阅读中做到游刃有余。

写作翻译方面:毋庸置疑,它们都是一种全面输出的体现,因此,更需要扎实地进行练习。我

在四级考试之前,会准备一个本子,认真写好每一篇作文或是翻译,字迹工整,仔细构思,写完以后和优秀范文对比,学习它的用法,在平时就养成好的习惯,到了考场上才会更加从容。我觉得,写得越多,就会写得越好,优美而实用的句型才会信手拈来。总之,这同样是个坚持的过程,但终究会破茧成蝶、妙笔生花的。

二、运行环境

小编使用的环境:Python3、Pycharm社区版、Pygame模块。内置模块 你安装 好python环

境就可以了。

模块安装:pip install -i https://pypi.douban.com/simple/ +pygame

三、素材(图片等)

图片多,装不下,仅部分哈(懒.jpg)还有字体,音乐背景等等都没展示了哈。

下面是提前准备的单词,大家每天可以更新一下的哈如下几百个是我准备的截图部分。

四、代码展示

1)主程序(英文打字小游戏主入口模块)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

490

491

492

493

494

495

496

497

498

499

500

501

502

503

504

505

506

507

508

509

510

511

512

513

514

515

516

517

518

519

520

521

522

523

524

525

526

527

528

529

530

531

532

533

534

535

536

537

538

539

540

541

542

543

544

545

546

547

548

549

550

551

552

553

554

555

556

557

558

559

560

561

562

563

564

565

566

567

568

569

570

571

572

573

574

575

576

577

578

579

580

581

582

# !/usr/bin/env python

# -*- coding: utf-8 -*-

"""

Author: 顾木子吖

"""

import os

import sys

import time

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) / 2

    game_y = (Game_Info.SCREEN_Y - Game_Info.SCREEN_RECT.height) / 2

    os.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)

  

  

def parser_words() -> dict:

    """

    解析英语单词

    :return {"eng_word": val, "cn_comment": val}

    """

    english_words = []

    word_contents = open(Game_Info.GAME_WORD_TEXT, encoding="gbk")

    for value in word_contents:

        value = value.lstrip()

        word_list = value.split(" ")

        words = [i for i in word_list if i != '']

        if len(words) >= 2:

            # 把解析好的单词和注释封装到字典中,然后加入列表

            english_words.append(

                {"eng_word": words[0], "cn_comment": words[1]})

    return english_words

  

  

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": u"简单", "level_color": "green"},

        2: {"word_fall_speed": 0.5, "level_text": u"上手", "level_color": "blue"},

        3: {"word_fall_speed": 1.0, "level_text": u"中等", "level_color": "orange"},

        4: {"word_fall_speed": 1.5, "level_text": u"困难", "level_color": "red"},

        5: {"word_fall_speed": 2.0, "level_text": u"魔鬼", "level_color": "purple"}

    }

  

    @staticmethod

    def game_init():

        """游戏初始化"""

        # 初始化游戏字体

        pygame.font.init()

  

        # 设置游戏标题和图标

        pygame.display.set_caption(Game_Info.GAME_NAME)

        pygame.display.set_icon(pygame.image.load(Game_Info.GAME_ICON_32))

  

    @staticmethod

    def 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())

  

    def __init__(self):

        self.words = parser_words()

        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) * 10

        self.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 - 10

        set_y = Game_Info.SCREEN_RECT.height - self.game_set_sprite.rect.height - 10

        self.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) / 2

        game_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 + 50

        self.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 + 50

        self.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 + 50

        self.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.1

  

        display_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 = True

            else:

                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 = True

                sys.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.PINK

                    self.quit_sprite.update(self.quit_sprite.text)

                else:

                    self.quit_sprite.color = Game_Info.BLUE

                    self.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.PINK

                    self.reset_sprite.update(self.reset_sprite.text)

                else:

                    self.reset_sprite.color = Game_Info.BLUE

                    self.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 = True

                    sys.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()

  

        # 判断元组中对应的按键索引值 1

        if keys_pressed[pygame.K_BACKSPACE]:

            self.backspace_count += 1

            if 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.x

        img_set_y = self.game_set_sprite.rect.y

        img_set_w = self.game_set_sprite.rect.width

        img_set_h = self.game_set_sprite.rect.height

  

        if (img_set_x <= x <= img_set_x + img_set_w) and \

                (img_set_y <= y <= img_set_y + img_set_h):

            return True

        else:

            return False

  

    def __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 = False

  

    def __random_generate_word(self, word_num=5):

        """

        随机生成单词精灵

        :param word_num:精灵数量 默认5

        :return:

        """

        count = 0

        while 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,

                pygame.sprite.collide_circle_ratio(1)

            )

  

            # 碰撞(释放内存重新随机生成单词精灵)

            if len(words) > 0:

                word_sprite.kill()

                continue

            else:

                self.word_group.add(word_sprite)

                count += 1

            if count >= word_num:

                break

  

    def __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(u"游戏分数: %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_score

            highest_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(u"历史最高: %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 += 10

  

                self.total_score += 1

                self.spell_ok = True

                self.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)

                        # 动画对象状态设置为True

                        animate.visible = True

                        break

  

    def __draw_game_blood(self, color=Game_Info.GREEN):

        """绘制游戏能量"""

  

        if self.game_blood <= 3 * 10:

            color = Game_Info.RED

        if self.game_blood >= 25 * 10:

            color = Game_Info.BLUE

        if 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.5

  

        while 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 -= 1

  

    def __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 = False

        TypingGame.game_quit_flag = False

        TypingGame().start_game()

  

  

def main():

    center_pos()

    # 启动游戏开始界面

    GameStartWin(title="Word Sprite").run()

  

  

if __name__ == '__main__':

    main()

2)游戏配置信息模块

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

# !/usr/bin/env python

# -*- coding: utf-8 -*-

import ctypes

import pygame

import configparser

  

  

class GameConfig(object):

    """游戏配置文件类"""

  

    GAME_INFO = "game_info"                     # 配置文件游戏信息结点名称

    GAME_STYLE = "game_style"                   # 配置文件游戏样式结点名称

    GAME_SCORE = "game_score"                   # 配置文件游戏分数结点名称

  

    config_file_path = "resource/config.cfg"    # 游戏配置文件路径

  

    # 把配置文件类设置成单例模式

    _instance = None

  

    def __new__(cls, *args, **kwargs):

        if cls._instance is None:

            cls._instance = super().__new__(cls)

        return cls._instance

  

    def __init__(self):

  

        self.author = None

        self.game_name = None

        self.version = None

        self.e_mail = None

  

        self.frame_pre_sec = None       # 游戏帧率

        self.word_size = None           # 英文单词的大小

        self.word_normal_color = None   # 单词的正常颜色

        self.spell_ok_color = None      # 单词拼写成功的颜色

        self.game_level = None          # 游戏等级

        self.game_init_blood = None     # 游戏初始血量

        self.history_score_dict = None  # 游戏历史记录

        self.__parser_config()

  

    def __parser_config(self):

        """解析游戏配置文件"""

        self.conf_parser = configparser.ConfigParser()

        self.conf_parser.read(self.config_file_path, encoding='utf-8')

  

        # 游戏开发者信息

        self.author = self.conf_parser.get(self.GAME_INFO, 'author')

        self.game_name = self.conf_parser.get(self.GAME_INFO, 'game_name')

        self.version = self.conf_parser.get(self.GAME_INFO, 'version')

        self.e_mail = self.conf_parser.get(self.GAME_INFO, 'e-mail')

  

        # 游戏样式信息

        self.frame_pre_sec = self.conf_parser.get(self.GAME_STYLE, "frame_pre_sec")

        self.word_size = self.conf_parser.get(self.GAME_STYLE, "word_size")

        self.word_normal_color = self.conf_parser.get(self.GAME_STYLE, "word_normal_color")

        self.spell_ok_color = self.conf_parser.get(self.GAME_STYLE, "spell_ok_color")

        self.game_level = self.conf_parser.get(self.GAME_STYLE, "game_level")

        self.game_init_blood = self.conf_parser.get(self.GAME_STYLE, "game_init_blood")

  

        # {

        #   'level_0': "{'score': None,'use_time': None,'create_time': None}",

        #   'level_1': "{...}",

        #   }

        # 历史最高信息

        self.history_score_dict = dict(self.conf_parser.items(self.GAME_SCORE))

  

    def set_word_size(self, word_size):

        """设置单词大小"""

        self.word_size = word_size

        self.conf_parser.set(self.GAME_STYLE, "word_size", str(word_size))

        self.conf_parser.write(open(self.config_file_path, mode='w'))

  

    def set_game_level(self, game_level):

        """设置游戏等级"""

        self.game_level = game_level

        self.conf_parser.set(self.GAME_STYLE, "game_level", str(game_level))

        self.conf_parser.write(open(self.config_file_path, mode='w'))

  

    def set_game_init_blood(self, game_init_blood):

        """设置游戏的初始血条"""

        self.game_init_blood = game_init_blood

        self.conf_parser.set(self.GAME_STYLE, "game_init_blood", str(game_init_blood))

        self.conf_parser.write(open(self.config_file_path, mode='w'))

  

    def set_word_normal_color(self, word_normal_color):

        """设置单词的正常颜色"""

        self.word_normal_color = word_normal_color

        self.conf_parser.set(self.GAME_STYLE, "word_normal_color", str(word_normal_color))

        self.conf_parser.write(open(self.config_file_path, mode='w'))

  

    def set_spell_ok_color(self, spell_ok_color):

        """设置单词拼写成功后的颜色"""

        self.spell_ok_color = spell_ok_color

        self.conf_parser.set(self.GAME_STYLE, "spell_ok_color", str(spell_ok_color))

        self.conf_parser.write(open(self.config_file_path, mode='w'))

  

    def set_highest_score(self, score_dict, game_level):

        """更新历史最高记录"""

        self.conf_parser.set(self.GAME_SCORE, str(game_level), str(score_dict))

        self.conf_parser.write(open(self.config_file_path, mode='w'))

        self.history_score_dict = dict(self.conf_parser.items(self.GAME_SCORE))

  

  

# 获取系统屏幕分辨率(缩放比例后)

win_api = ctypes.windll.user32

SCREEN_X = win_api.GetSystemMetrics(0)

SCREEN_Y = win_api.GetSystemMetrics(1)

  

game_conf = GameConfig()

  

GAME_MUSICS = ["resource/music/bgm1.mp3", "resource/music/bgm2.mp3"]

GAME_NAME = game_conf.game_name

GAME_LEVEL = {'1': 0.3, '2': 0.5, '3': 1, '4': 1.5, '5': 2}           # 游戏困难等级与单词下落速度相互匹配字典

SCREEN_RECT = pygame.Rect(0, 0, SCREEN_X * 0.85, SCREEN_Y * 0.85)     # 游戏窗口大小(电脑分辨率 * 0.85)

INPUT_RECT_WIDTH = 600

INPUT_RECT_HEIGHT = 100

GAME_BLOOD_RECT = pygame.Rect(SCREEN_RECT.width / 2 - 250, SCREEN_RECT.height - 26, 500, 25)

  

GAME_ICON = "resource/image/rabbit.ico"

GAME_ICON_32 = "resource/image/rabbit_32.png"

GAME_ICON_48 = "resource/image/rabbit_48.png"

VOICE_ICO = "resource/image/voice.png"

MUTE_ICO = "resource/image/mute.png"

GAME_BACKGROUND = "resource/image/game_bg.png"

GAME_OVER_BACKGROUND = "resource/image/game_over.png"

INPUT_BACKGROUND = "resource/image/input_bg.png"

GAME_SET_BLUE = "resource/image/set_blue.png"

GAME_SET_PINK = "resource/image/set_pink.png"

  

GAME_FONT = "resource/font/HUI.TTF"         # 游戏字体

GAME_WORD_TEXT = "resource/en_word.txt"     # 游戏单词文本

  

# 单词拼写成功后的消失动画

KILL_ANIMATION = ["resource/image/animation/" + str(img_num).zfill(3) + ".png" for img_num in range(8)]

  

FRAME_PRE_SEC = int(game_conf.frame_pre_sec)        # 游戏的刷新帧率

WORD_SIZE = int(game_conf.word_size)                # 单词大小

WORD_FALL_SPEED = GAME_LEVEL[str(game_conf.game_level)]  # 单词下落速度

INIT_BLOOD = int(game_conf.game_init_blood)         # 游戏初始血条

  

# 创建单词的时间间隔(毫秒)

CREATE_WORD_INTERVAL = 1000 * 5

  

# 首次生成单词的数量

GENERATE_WORD_NUM = 5

  

# 游戏单词正常颜色和拼写颜色

WORD_NORMAL_COLOR = str(game_conf.word_normal_color)

SPELL_OK_COLOR = str(game_conf.spell_ok_color)

WORD_COLOR = pygame.color.Color(WORD_NORMAL_COLOR)

WORD_SPELL_OK_COLOR = pygame.color.Color(SPELL_OK_COLOR)

  

# 字体颜色

RED = pygame.color.Color("RED")

YELLOW = pygame.color.Color("YELLOW")

BLUE = pygame.color.Color("#70f3ff")

GREEN = pygame.color.Color("GREEN")

WHITE = pygame.color.Color("WHITE")

ORANGE = pygame.color.Color("ORANGE")

PINK = pygame.color.Color("#ff4777")

  

# 创建单词事件

CREATE_WORD_EVENT = pygame.USEREVENT

# 游戏结束事件

GAME_OVER_EVENT = pygame.USEREVENT + 1

# 游戏音乐结束事件

MUSIC_END_EVENT = pygame.USEREVENT + 2

  

  

def main():

    game_conf1 = GameConfig()

    game_conf2 = GameConfig()

    game_conf1.word_size = 100

    game_conf2.game_init_blood = 50

    print(id(game_conf1))

    print(id(game_conf2))

    print(game_conf1.game_init_blood)

    print(game_conf2.word_size)

    socre_dict = game_conf.history_score_dict

    print(dict(socre_dict))

    print(eval(socre_dict['level_1']))

  

    print(GAME_BLOOD_RECT)

    # print(SCREEN_X, SCREEN_Y)

    # print(SCREEN_RECT)

    # print(SCREEN_RECT.size)

    # print(game_conf.frame_pre_sec)

    # print(game_conf.game_level)

    # print(game_conf.word_size)

    # print(game_conf.word_normal_color)

    # print(game_conf.spell_ok_color)

  

    # print(WORD_NORMAL_COLOR)

    # print(SPELL_OK_COLOR)

    # print(int(10.000000001))

    # print(SCREEN_X, SCREEN_Y)

    # print(SCREEN_RECT.size)

  

  

if __name__ == '__main__':

    main()

3)游戏视图模块

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

380

381

382

383

384

385

386

387

388

389

390

391

392

393

394

395

396

397

398

399

400

401

402

403

404

405

406

407

408

409

410

411

412

413

414

415

416

417

418

419

420

421

422

423

424

425

426

427

428

429

430

431

432

433

434

435

436

437

438

439

440

441

442

443

444

445

446

447

448

449

450

451

452

453

454

455

456

457

458

459

460

461

462

463

464

465

466

467

468

469

470

471

472

473

474

475

476

477

478

479

480

481

482

483

484

485

486

487

488

489

490

491

import Game_Info

import threading

import PySimpleGUI as sg

from Game_Info import GameConfig

from tkinter import colorchooser

from Game_Main import TypingGame

  

  

class BaseWin(object):

    """窗口父类"""

    WIN_THEME = sg.theme('DarkBlue1')

    text_color = 'white'

    game_conf = GameConfig()    # 游戏信息配置类

  

    def __init__(self, title):

        self.title = title

        self.window = None

        self.layout = list()

  

    def close_win(self):

        """关闭窗口"""

        if self.window is not None:

            self.window.close()

  

  

class GameStartWin(BaseWin):

    """游戏开始窗口"""

    _voice_flag = True

  

    def __init__(self, title):

        super().__init__(title)

        self.__init_layout()

  

    def __init_layout(self):

        """初始化窗口布局"""

        if self._voice_flag:

            voice_img = Game_Info.VOICE_ICO

        else:

            voice_img = Game_Info.MUTE_ICO

        self.layout = [

            [sg.Text(size=(70, 0)), sg.Image(filename=voice_img, key='voice_control', enable_events=True)],

            [sg.Text(size=(10, 10)), sg.Text('Word  Sprite', font=(u'宋体', 50)), sg.Text(size=(10, 10))],

            [sg.Text(size=(23, 10)), sg.Button(u'开始游戏', font=(u'宋体', 30), key='start_game'), sg.Text(size=(23, 10))],

            [sg.Text(size=(23, 5)), sg.Button(u'游戏设置', font=(u'宋体', 30), key='game_set'), sg.Text(size=(23, 5))],

            [sg.Text(size=(23, 10)), sg.Button(u'历史最高', font=(u'宋体', 30), key='show_score'), sg.Text(size=(23, 10))],

            [

                sg.Text(size=(70, 0)),

                sg.Image(

                    filename=Game_Info.GAME_ICON_48,

                    key='game_ico',

                    enable_events=True

                )

             ]

        ]

  

    def run(self):

        """启动游戏开始窗口"""

        self.window = sg.Window(

            title=self.title,

            icon=Game_Info.GAME_ICON,

            layout=self.layout

        )

        self.__event_handler()

  

    def __event_handler(self):

        """窗口事件监听"""

        while True:

            event, value_dict = self.window.read(timeout=20)

            print(event, value_dict)

  

            # 静音控制

            if self._voice_flag:

                self.window.find_element('voice_control').update(filename=Game_Info.VOICE_ICO)

            else:

                self.window.find_element('voice_control').update(filename=Game_Info.MUTE_ICO)

  

            if event in (sg.WIN_CLOSED, 'Quit'):

                break

            elif event in 'voice_control':

                self.voice_control()

            elif event in 'game_ico':

                self.author_win()

            elif event in 'start_game':

                print('开始游戏')

                self.window.Hide()

                TypingGame.game_over_flag = False

                TypingGame.game_quit_flag = False

                threading.Thread(target=self.start_game).start()    # 利用线程开启游戏防止窗口卡死

            elif event in 'game_set' or TypingGame.game_pause_flag:

                print('游戏设置')

                self.window.Disable()

                self.game_set()

            elif event in 'show_score':

                print('历史最高')

                self.window.Disable()

                self.show_score()

            elif TypingGame.game_quit_flag:

                self.window.UnHide()

        self.window.close()

  

    def voice_control(self):

        """游戏静音状态控制"""

        if self._voice_flag:

            GameStartWin._voice_flag = False

            self.window.find_element('voice_control').update(filename=Game_Info.MUTE_ICO)

        else:

            GameStartWin._voice_flag = True

            self.window.find_element('voice_control').update(filename=Game_Info.VOICE_ICO)

  

    def author_win(self):

        """游戏开发信息窗口"""

        self.window.Disable()

        game_conf = Game_Info.GameConfig()

  

        show_text = '游戏作者: \t' + game_conf.author + '\n\n'\

                    '游戏名称: \t' + game_conf.game_name + '\n\n'\

                    '游戏版本: \t' + game_conf.version + '\n\n'\

                    '作者邮箱: \t' + game_conf.e_mail + '\n'

        sg.Popup(

            show_text,

            title=u'关于作者',

            icon=Game_Info.GAME_ICON,

            font=(u'宋体', 18),

            custom_text=(u'  ★  ', u'  ?  '),

            button_color=('red', '#063288'),

            line_width=50,

        )

        self.window.Enable()

  

    def game_set(self):

        """游戏设置"""

        GameSetWin(u"游戏配置", self).run()

  

    def show_score(self):

        """查看历史最高分"""

        GameScoreWin(u'历史最高', self).run()

  

    @staticmethod

    def start_game():

        """开始游戏"""

        TypingGame().start_game()

  

    @classmethod

    def voice_flag(cls):

        return cls._voice_flag

  

  

class GameExecuteWin(object):

    """游戏运行窗口"""

    pass

  

  

class GameEndWin(object):

    """游戏结束窗口"""

  

    def __init__(self):

        pass

  

  

class GameSetWin(BaseWin):

    """游戏配置信息窗口"""

  

    # 游戏等级对照字典

    game_level_dict = {

        1: {"game_level_num": 5, "game_level_text": u"简单", "game_level_color": "green"},

        2: {"game_level_num": 15, "game_level_text": u"上手", "game_level_color": "blue"},

        3: {"game_level_num": 25, "game_level_text": u"中等", "game_level_color": "orange"},

        4: {"game_level_num": 35, "game_level_text": u"困难", "game_level_color": "red"},

        5: {"game_level_num": 50, "game_level_text": u"魔鬼", "game_level_color": "purple"}

    }

  

    def __init__(self, title, parent_win=None):

        """初始化游戏配置界面"""

        super().__init__(title)

        self.parent_win = parent_win

        self.word_normal_color = self.game_conf.word_normal_color

        self.spell_ok_color = self.game_conf.spell_ok_color

        self.__init_layout()

  

    def __init_layout(self):

        game_level_num = self.game_level_dict[int(self.game_conf.game_level)]["game_level_num"]

        game_level_text = self.game_level_dict[int(self.game_conf.game_level)]["game_level_text"]

        game_level_color = self.game_level_dict[int(self.game_conf.game_level)]["game_level_color"]

  

        self.layout = [

            [

                sg.Text(u'游戏难度等级:', text_color=self.text_color),

                sg.Slider(

                    range=(1, 50), default_value=game_level_num,

                    size=(26, 18), orientation='h', key="game_level",

                    enable_events=True, disable_number_display=True,

                ),

                sg.Button(

                    game_level_text, key='game_level_btn',

                    button_color=(self.text_color, game_level_color),

                ),

            ],

            [

                sg.Text(u'游戏字体大小:', text_color=self.text_color),

                sg.Slider(

                    range=(15, 35), default_value=int(self.game_conf.word_size),

                    size=(26, 18), enable_events=True,

                    orientation='h', disable_number_display=True, key="word_size"

                ),

                sg.Text(

                    str(self.game_conf.word_size), text_color=self.text_color, size=(3, 1),

                    font=("宋体", int(self.game_conf.word_size)),

                    key='word_size_num'

                ),

            ],

            [

                sg.Text(u'游戏初始血条:', text_color=self.text_color),

                sg.Slider(

                    range=(5, 30), default_value=int(self.game_conf.game_init_blood),

                    size=(26, 18), orientation='h',

                    enable_events=True, disable_number_display=True, key='init_blood'

                ),

                sg.Text(

                    str(self.game_conf.game_init_blood), size=(3, 1),

                    text_color=self.text_color, key='blood_num'

                )

            ],

            [

                sg.Text(u'游戏静音状态:', text_color=self.text_color),

                sg.Radio(

                    ' ', default=GameStartWin.voice_flag(), key='voice_open',

                    group_id=1, text_color=self.text_color, enable_events=True

                ),

                sg.Image(filename=Game_Info.VOICE_ICO),

                sg.Text(' ' * 5),

                sg.Radio(

                    ' ', default=not GameStartWin.voice_flag(), key='mute',

                    group_id=1, text_color=self.text_color, enable_events=True

                ),

                sg.Image(filename=Game_Info.MUTE_ICO)

            ],

            [

                sg.Text(u'游戏字体颜色:', text_color=self.text_color),

                sg.Text(

                    '', size=(17, 1),

                    background_color=self.game_conf.word_normal_color,

                    enable_events=True, key='word_normal_color'

                ),

                sg.Text(

                    'HUI', key='word_color_test',

                    text_color=self.game_conf.word_normal_color,

                ),

                sg.Button(u'颜色选择', key='normal_ccb')

            ],

            [

                sg.Text(u'单词拼写颜色:', text_color=self.text_color),

                sg.Text(

                    '', size=(17, 1),

                    background_color=self.game_conf.spell_ok_color,

                    enable_events=True, key='spell_ok_color'

                ),

                sg.Text(

                    'HUI', key='spell_color_test',

                    text_color=self.game_conf.spell_ok_color,

                ),

                sg.Button(u'颜色选择', key='spell_ccb')

            ],

            [

                sg.Submit(u'暂时保存', key='temp_save', pad=((10, 350), (0, 0))),

                sg.Button(u'永久保存', key='permanent')

            ]

        ]

  

    def run(self):

        """开启游戏设置界面"""

        self.window = sg.Window(

            title=self.title,

            icon=Game_Info.GAME_ICON,

            layout=self.layout,

            font=("宋体", 18),

            element_padding=(10, 30),

        )

        # 开启事件监听

        self.__event_handler()

  

    @staticmethod

    def color_callback(color=None):

        """颜色按钮回调方法"""

        return colorchooser.askcolor(color)

  

    def __event_handler(self):

        while True:

            event, value_dict = self.window.read()

            # print(event, value_dict)

            if event in (None, 'Quit'):

                break

            elif event in ('voice_open', 'mute'):

                if value_dict['voice_open']:

                    GameStartWin._voice_flag = True

                else:

                    GameStartWin._voice_flag = False

            elif event in 'game_level':

                game_level = self.get_game_level(int(value_dict[event]))

                game_level_text = self.game_level_dict[game_level]['game_level_text']

                game_level_color = self.game_level_dict[game_level]['game_level_color']

                self.window.find_element('game_level_btn').update(

                    game_level_text,

                    button_color=(self.text_color, game_level_color)

                )

            elif event in 'game_level_btn':

                # 点击按钮切换游戏等级

                game_level = self.get_game_level(int(value_dict['game_level']))

                if game_level == 5:

                    game_level = 0

                game_level_num = self.game_level_dict[game_level + 1]['game_level_num']

                game_level_text = self.game_level_dict[game_level + 1]['game_level_text']

                game_level_color = self.game_level_dict[game_level + 1]['game_level_color']

  

                self.window.find_element('game_level').update(game_level_num)

                self.window.find_element('game_level_btn').update(

                    game_level_text,

                    button_color=(self.text_color, game_level_color)

                )

            elif event in 'word_size':

                word_size_num = value_dict[event]

                self.window.find_element('word_size_num').update(int(word_size_num), font=(u'宋体', int(word_size_num)))

            elif event in 'init_blood':

                blood_num = int(value_dict[event])

                self.window.find_element('blood_num').update(str(blood_num))

            elif event in 'normal_ccb':

                # 游戏单词颜色选择

                self.window.Disable()  # 让游戏配置窗口不可用,不让用户乱点击,防止多开

                choose_colors = self.color_callback(self.game_conf.word_normal_color)

                self.window.Enable()  # 恢复游戏配置窗口

                if None not in choose_colors:

                    self.window.find_element('word_normal_color').update(background_color=choose_colors[1])

                    self.window.find_element('word_color_test').update(text_color=choose_colors[1])

                    self.word_normal_color = choose_colors[1]

            elif event in 'spell_ccb':

                # 单词拼写颜色选择

                self.window.Disable()  # 让游戏配置窗口不可用,不让用户乱点击,防止多开

                choose_colors = self.color_callback(self.game_conf.spell_ok_color)

                self.window.Enable()  # 恢复游戏配置窗口

                if None not in choose_colors:

                    self.window.find_element('spell_ok_color').update(background_color=choose_colors[1])

                    self.window.find_element('spell_color_test').update(text_color=choose_colors[1])

                    self.spell_ok_color = choose_colors[1]

            elif event in ('temp_save', 'permanent'):

                GameSetWin.SAVE_STATUS = True

                game_level = self.get_game_level(int(value_dict['game_level']))

                value_dict['game_level'] = game_level

                value_dict['normal_ccb'] = self.word_normal_color

                value_dict['spell_ccb'] = self.spell_ok_color

                if event in 'temp_save':

                    self.temp_save(value_dict)

                elif event in 'permanent':

                    self.permanent(value_dict)

                break

  

        self.window.close()

        TypingGame.game_pause_flag = False

  

        # 恢复父窗口可用

        if self.parent_win is not None:

            self.parent_win.window.Enable()

  

    def temp_save(self, game_dict):

        """临时保存游戏配置信息(临时有效,重开还原)"""

        """

               {

                   'game_level': 2,

                   'word_size': 26.0,

                   'init_blood': 20.0,

                   'voice_open': True,

                   'mute': False,

                   'normal_ccb': '#00ffff',

                   'spell_ccb': '#ff0000'

               }

        """

        self.game_conf.game_level = game_dict['game_level']

        self.game_conf.word_size = game_dict['word_size']

        self.game_conf.game_init_blood = game_dict['init_blood']

        self.game_conf.word_normal_color = game_dict['normal_ccb']

        self.game_conf.spell_ok_color = game_dict['spell_ccb']

  

    def permanent(self, game_dict):

        """永久保存游戏配置信息(写入配置文件)"""

  

        # 修改配置文件

        self.game_conf.set_game_level(game_dict['game_level'])

        self.game_conf.set_word_size(int(game_dict['word_size']))

        self.game_conf.set_game_init_blood(int(game_dict['init_blood']))

        self.game_conf.set_word_normal_color(game_dict['normal_ccb'])

        self.game_conf.set_spell_ok_color(game_dict['spell_ccb'])

  

    @staticmethod

    def get_game_level(data):

        game_level = 1

        if data <= 10:

            game_level = 1

        elif data <= 20:

            game_level = 2

        elif data <= 30:

            game_level = 3

        elif data <= 40:

            game_level = 4

        elif data <= 50:

            game_level = 5

        return game_level#

  

  

class GameScoreWin(BaseWin):

    """游戏历史分数窗口"""

    heads = [

        '{:4}'.format(u'游戏等级'),

        '{:4}'.format(u'最高分'),

        '{:6}'.format(u'耗 时'),

        '{:4}'.format(u'创建时间'),

    ]

    levels = ['level_1', 'level_2', 'level_3', 'level_4', 'level_5']

  

    def __init__(self, title, parent_win=None):

        super().__init__(title)

        self.parent_win = parent_win

        self.__init_layout()

  

    def __init_layout(self):

        """初始化窗口布局"""

        score_dict = Game_Info.game_conf.history_score_dict       # 游戏历史记录

        level_0, level_1 = eval(score_dict[self.levels[0]]), eval(score_dict[self.levels[1]])

        level_2, level_3 = eval(score_dict[self.levels[2]]), eval(score_dict[self.levels[3]])

        level_4 = eval(score_dict[self.levels[4]])

  

        header = [[sg.Text(h, pad=(31, 30)) for h in self.heads]]

        body = [

            [

                sg.Button(u'简单', button_color=('white', 'green')),

                sg.Text('{:4}'.format(str(level_0['score']))),

                sg.Text('{:6}'.format(str(level_0['use_time']))),

                sg.Text('{:4}'.format(str(level_0['create_time'])))

            ],

            [

                sg.Button(u'上手', button_color=('white', 'blue')),

                sg.Text('{:4}'.format(str(level_1['score']))),

                sg.Text('{:6}'.format(str(level_1['use_time']))),

                sg.Text('{:4}'.format(str(level_1['create_time'])))

            ],

            [

                sg.Button(u'中等', button_color=('white', 'orange')),

                sg.Text('{:4}'.format(str(level_2['score']))),

                sg.Text('{:6}'.format(str(level_2['use_time']))),

                sg.Text('{:4}'.format(str(level_2['create_time'])))

            ],

            [

                sg.Button(u'困难', button_color=('white', 'red')),

                sg.Text('{:4}'.format(str(level_3['score']))),

                sg.Text('{:6}'.format(str(level_3['use_time']))),

                sg.Text('{:4}'.format(str(level_3['create_time'])))

            ],

            [

                sg.Button(u'魔鬼', button_color=('white', 'purple')),

                sg.Text('{:4}'.format(str(level_4['score']))),

                sg.Text('{:6}'.format(str(level_4['use_time']))),

                sg.Text('{:4}'.format(str(level_4['create_time'])))

            ]

        ]

        self.layout = header + body

  

    def run(self):

        """启动游戏历史分数窗口"""

        self.window = sg.Window(

            title=self.title,

            icon=Game_Info.GAME_ICON,

            layout=self.layout,

            font=('宋体', 20),

            element_padding=(46, 30)

        )

        self.__event_handler()

  

    def __event_handler(self):

        """窗口事件监听"""

        while True:

            event, value_dict = self.window.read()

            print(event, value_dict)

            if event in (sg.WIN_CLOSED, 'Quit'):

                self.parent_win.window.Enable()

                break

        self.window.close()

  

  

def main():

    GameStartWin(title="Word Sprite").run()

  

  

if __name__ == '__main__':

    main()

4)PyGame游戏精灵模块

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

import pygame

import random

import Game_Info

from Game_Info import GameConfig

  

  

class BaseSprite(pygame.sprite.Sprite):

    """游戏精灵基类"""

    def __init__(self):

        super().__init__()

        self.image = None

        self.rect = None

  

    def set_pos(self, x, y):

        """设置精灵位置"""

        self.rect.x = x

        self.rect.y = y

  

    def hor_center(self, screen_rect):

        """

        水平居中显示

        :param screen_rect: 游戏屏幕大小

        :return:

        """

        x = screen_rect.width / 2 - self.rect.width / 2

        self.set_pos(x, self.rect.y)

  

  

class ImageSprite(BaseSprite):

    """图片精灵基类"""

  

    def __init__(self, image):

        super().__init__()

        self.image = pygame.image.load(image)

        self.rect = self.image.get_rect()

  

    def transform_scale(self, image, size: tuple):

        """缩放图片大小"""

        self.image = pygame.transform.scale(image, size)

        self.rect = self.image.get_rect()

  

  

class TextSprite(BaseSprite):

    """文字精灵基类"""

  

    def __init__(self, text, size=Game_Info.WORD_SIZE, color=Game_Info.WHITE):

        super().__init__()

        self.text = text

        self.size = size

        self.color = color

  

        # 创建字体

        self.font = pygame.font.Font(Game_Info.GAME_FONT, self.size)

  

        # 根据字体创建显示对象(文字)    render(self,text,antialias,color,background = None)

        self.image = self.font.render(text, True, self.color)

        self.rect = self.image.get_rect()

  

    def update(self, display_text):

        """更新显示的文字"""

        self.text = display_text

        rect_x = self.rect.x

        rect_y = self.rect.y

        self.image = self.font.render(self.text, True, self.color)

        self.rect = self.image.get_rect()

        self.rect.x = rect_x

        self.rect.y = rect_y

  

  

class SpellSprite(TextSprite):

    """文字精灵基类"""

  

    def __init__(self, text, size=Game_Info.WORD_SIZE, color=Game_Info.WORD_SPELL_OK_COLOR):

        super().__init__(text, size, color)

  

    def update(self, display_text, color):

        """更新拼写的单词"""

        self.text = display_text

        self.color = color

        self.image = self.font.render(self.text, True, self.color)

        self.rect = self.image.get_rect()

        # 居中显示

        self.hor_center(Game_Info.SCREEN_RECT)

        self.set_pos(self.rect.x, 40)

  

  

class WordSprite(TextSprite):

    """单词精灵类"""

    game_conf = GameConfig()

  

    def __init__(self, text, cn_comment, speed: float, size=28, color=Game_Info.WORD_COLOR):

        super().__init__(text, size, color)

        self.speed = speed              # 单词下落的速度

        self.cn_comment = cn_comment    # 英文单词的意思

        self.y = float(self.rect.y)     # 用小数存储单词降落的位置(方可设置成小数)

  

    def random_pos(self):

        """随机位置"""

        word_x = random.randint(0, Game_Info.SCREEN_RECT.width - self.rect.width)

        word_y = random.randint(-50, 10)

        self.rect.x = word_x

        self.rect.y = word_y

        self.y = float(self.rect.y)

  

    def update(self, game):

        """更新单词精灵"""

  

        # 判断游戏是否暂停

        if game.game_pause_flag:

            self.speed = 0

        else:

            self.y += self.speed

            self.rect.y = self.y

  

        # 超出游戏屏幕,删除精灵

        if self.rect.y >= Game_Info.SCREEN_RECT.height:

            self.kill()

            # 根据不同游戏等级掉血

            game.game_blood -= int(self.game_conf.game_level) * 3

  

        # 游戏配置信息改变,更新单词

        self.size = int(self.game_conf.word_size)

        self.font = pygame.font.Font(Game_Info.GAME_FONT, self.size)

        self.speed = game.game_level_dict[int(self.game_conf.game_level)]['word_fall_speed']

        self.color = pygame.color.Color(self.game_conf.word_normal_color)

  

        # 游戏分数是10的倍数单词下落速度提升

        if game.total_score > 0 and game.total_score % 100 == 0:

            self.speed += 0.5

  

        # 游戏血条在[45 - 50]区间单词下落速度提升

        if 45 * 10 <= game.game_blood <= 50 * 10:

            self.speed += 1

  

        # 拼写的字母与单词匹配

        if len(str(game.word_content)) >= 1 and \

                str(game.word_content)[0].lower() in str(self.text)[0].lower() and \

                str(game.word_content).lower() in str(self.text).lower():

            self.color = pygame.color.Color(self.game_conf.spell_ok_color)

  

        # 更新单词颜色

        self.image = self.font.render(self.text, True, self.color)

  

  

class Animation(object):

    """动画特效类"""

  

    def __init__(self, screen):

        """初始化动画资源"""

        self.main_screen = screen

        # 加载动画资源

        self.images = [pygame.image.load(img) for img in Game_Info.KILL_ANIMATION]

        # 设置当前动画播放索引

        self.index = 0

        # 动画播放间隔

        self.interval = 2

        self.interval_index = 0

        # 动画位置

        self.position = [0, 0]

        # 是否可见

        self.visible = False

  

    # 设置动画播放的位置

    def set_pos(self, x, y):

        self.position[0] = x

        self.position[1] = y

  

    # 动画播放

    def action(self):

        # 如果爆炸对象状态不可见,则不计算坐标

        if not self.visible:

            return

  

        # 控制每一帧图片的播放间隔

        self.interval_index += 1

        if self.interval_index < self.interval:

            return

        self.interval_index = 0

  

        self.index = self.index + 1

        if self.index >= len(self.images):

            self.index = 0

            self.visible = False

  

    # 绘制动画

    def draw(self):

        # 如果对象不可见,则不绘制

        if not self.visible:

            return

        self.main_screen.screen.blit(self.images[self.index], (self.position[0], self.position[1]))

  

  

def main():

    pass

  

  

if __name__ == '__main__':

    pass

五、效果展示

1)游戏界面

2)游戏设置

?3)随机截图

(打字开始掉下来各种单词,打完之后还会出现相应的单词中文解释)

4)游戏结束

(相应的时间打英文单词一个单词一分,又背景音乐的哦)


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/weixin_55822277/article/details/126311890
相关文章
  • Python爬虫库urllib的使用教程

    Python爬虫库urllib的使用教程
    Python urllib库 Python urllib库用于操作网页URL,并对网页的内容进行抓取处理。 urllib包 包含以下几个模块: urllib.request- 打开和读取URL。 urlli
  • 基于Python实现英语单词小游戏

    基于Python实现英语单词小游戏
    相信大家对于英语四级一点都不陌生了吧? 很多学校都是要求学生必须考过英语四级,不然就不能毕业。 一开始我抱着侥幸心理,心想上高
  • 20非常有用的Python单行代码
    有用的 Python 单行代码片段,只需一行代码即可解决特定编码问题! 在本文中,云朵君将分享20 个 Python 一行代码,你可以在 30 秒或更短的
  • 使用 PyQt5设计下载远程服务器日志文件程序的思

    使用 PyQt5设计下载远程服务器日志文件程序的思
    最近通过 PyQt5 设计了一个下载服务器指定日期日志文件的程序,里面有些有意思的技术点,现在做一些分享。 PyQt5 是一套 Python 绑定 Digia
  • Python hashlib模块详细讲解使用方法
    1.hashlib的简介 hashlib 是一个提供了一些流行的hash(摘要)算法的Python标准库.其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512等 什么是摘
  • python实现华氏温度和摄氏温度转换的方法

    python实现华氏温度和摄氏温度转换的方法
    华氏温度和摄氏温度转换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 TempStr=input(请输入带有符号的温度值,C/c表示摄氏度、F/f表示华氏温度:) if Te
  • Python中PyMySQL的基本操作介绍
    PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库 PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。 如果还未
  • 四种Python机器学习超参数搜索方法总结
    在建模时模型的超参数对精度有一定的影响,而设置和调整超参数的取值,往往称为调参。 在实践中调参往往依赖人工来进行设置调整范围
  • python yield迭代器介绍
    在python深度学习模型读取数据时,经常遇到yield,互联网搜索后,将比较容易理解的说明记录一下。 二、使用步骤 1.引入库 代码如下(示例
  • python实现一个围棋小游戏

    python实现一个围棋小游戏
    一道Python课作业题,大致如下: 编写一个类: 该类Building应具有以下方法: ●一个构造函数,它根本不接受任何参数(除了通常的`self`) ●s
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计