Python 开发打字游戏,体验不同的打字游戏乐趣(结尾)
- 资源下载
- 完整代码
资源下载
https://download.csdn.net/download/qq_59142194/85969323
完整代码
在前面的第二篇文章中,对类中的功能进行了简要的解释,现在主要剩下了 configuration_project()函数和monitoring_data()函数。 configuration_project()函数是依次实例化、调用功能、创建玩家(自己)和计算机玩家对象、打开线程调用死循环的方法; 而monitoring_data()函数是实时监控车辆移动时的数据变化time.sleep(2.5) # 休眠2.五秒钟后才开始,这车真正停在窗户上,赛道和树开始向后移动,两者的移动速度等于玩家自己的打字速度(player.car.speed = dt.typspeed #使车速快 = 打字速度)。
player_car_s = player.car.speed #让车此时已移动的距离加上车速 timesleep3_posx_s_list[player.username] = player_car_s for i, caroop in enumerate(caroop_list[1:]): caroop.car.posx = caroop.car.speed - player.car.speed timesleep3_posx_s_list[caroop.username] = timesleep3_posx_s_list[caroop.username] caroop.car.speed该代码实时记录了每辆车的行程。
if max(timesleep3_posx_s_list.values()) > gw.road.road_length:这里面就是将timesleep3_posx_s_list游戏结束时,最大的旅程大于我们开始时的初始化。(FLAG = False)。最后,在整个代码中time.sleep()我自己调试的休眠时间是一个很好的值。
import tkinter as tk import threading,random,time,datetime import inspect import ctypes from tkinter import ttk from pygame import mixer FLAG = True # 定义一个信号量来判断前面的车是否到达终点,游戏结束变成False CARFLAG = True # 定义汽车在窗户上移动时的信号量,当汽车在窗户上静止时变成False ROAD = '' # 赛道(Python,Java,MySql赛道) # 玩家类 class Player: def __init__(self,username): self.username = 玩家 username # 创建小车 def car_create(self,c,carposy_list): self.car = Car('./sucai/car1.png', carposy_list, 'img1', self.username) self.car_img = tk.PhotoImage(file=self.car.filepath) c.create_image(self.car.posx, self.car.posy, image=self.car_img, tag=self.car.cartag) c.create_text(self.car.posx-30, self.car.posy, text=self.car.username, font=("Purisa", 16), fill='white', tag=self.car.username) # 电脑类 class Computer: def __init__(self,username='[电脑]'): self.username = username # 创建小车 def car_create(self,c,filepath, posy, cartag, username): self.car = Car(filepath, posy, cartag, username) self.car_img = tk.PhotoImage(file=self.car.filepath) c.create_image(self.car.posx, self.car.posy, image=self.car_img, tag=self.car.cartag) c.create_text(self.car.posx-30, self.car.posy, text=self.car.username, font=("Purisa", 16), fill='white',tag=self.car.username) # 赛道类 class Road: def __init__(self,roadtype): self.text = [] with open(f'./sucai/{ roadtype}关键字.txt', mode='r', encoding='utf-8') as f: for line in f: self.text.append(line.strip().split('\t')[0]) self.road_number = int(len(self.text)*1.2) if ROAD == 'Python' else int(len(self.text)*1.5) # 赛道的数量 self.road_length = (self.road_number - 3) * 1000 # 需要跑完赛道的长度 self.road_s = 0.0 # 起点线 def begin(self,c): c.create_rectangle(100, 50, 150, 352, fill='#FFF6EE', tag='begin') c.create_text(135, 200, text='R\ne\na\nd\ny\ni\nn\ng\n \nG\nO', font=("Purisa", 20), fill='black', tag='begin') # 终点线 def destination(self,c): self.c_end = c.create_text(self.road_length - 120, 200, text='终\n点', font=("Purisa", 52), fill='white',tag='end') # 路相对于车移动 def roadmove(self,c,tag_road): global FLAG,player self.tag_road = tag_road if FLAG: self.road_s += player.car.speed if self.road_s > 1000: self.road_s = 0.0 if self.tag_road: c.delete(self.tag_road.pop(0)) for i in range(1, self.road_number + 1): c.move(i, -player.car.speed, 0) c.move(self.c_end, -player.car.speed, 0) # 小树类 class Tree: speed = 0 def __init__(self, posx,posy,filepath,treetag='tree'): self.posx = posx self.posy = posy self.filepath = filepath self.treetag = treetag # 创建树 def tree_create(self,c): self.tree_img = tk.PhotoImage(file=self.filepath) c.create_image(self.posx, self.posy, image=self.tree_img, tag=self.treetag) # 树相对于车移动 def treemove(self, c): global FLAG,player if FLAG: if self.posx >10: self.speed = player.car.speed self.posx -= self.speed c.delete(self.treetag) c.create_image(self.posx, self.posy, image=self.tree_img, tag=self.treetag) else: self.posx = random.randint(550,950) self.speed = player.car.speed self.posx -= self.speed c.create_image(self.posx, self.posy, image=self.tree_img, tag=self.treetag) # 小车类 class Car: speed = 2.0 # 初始化小车的移动速度 posx = 70 # 初始化小车的初始位置,x轴方向 car_move_distance = [] # 记录小车,以初始化速度speed = 2.0开始移动的路程 def __init__(self, filepath, posy, cartag, username): self.filepath = filepath self.posy = posy self.cartag = cartag self.username = username # 小车移动方法 def car_move(self,c,car_img): global FLAG print(self.username,'准备就绪...') self.car_img = car_img def run(): if FLAG: if CARFLAG: self.posx += self.speed self.car_move_distance = [] self.car_move_distance.append((self.cartag, self.posx)) c.delete(self.cartag) c.create_image(self.posx, self.posy, image=self.car_img, tag=self.cartag) c.delete(self.username) c.create_text(self.posx, self.posy, text=self.username, font=("Purisa", 13), fill='white',tag=self.username) else: c.delete(self.cartag) c.create_image(self.posx, self.posy, image=self.car_img, tag=self.cartag) c.delete(self.username) c.create_text(self.posx, self.posy, text=self.username, font=("Purisa", 13), fill='white',tag=self.username) c.after(10, run) else: print(f'{ self.username} 小车停止') run() # 小车移动速度随时变化 def car_speed_change(self): global FLAG,player time.sleep(2.3) while FLAG: if player.car.speed < 14: self.speed = random.uniform(player.car.speed - 0.3, player.car.speed + 0.7) elif 14 < player.car.speed < 18: self.speed = random.uniform(player.car.speed - 0.8, player.car.speed + 0.5) else: self.speed = random.uniform(19 - 1.1, 19 + 0.3) time.sleep(1) # 打字类 class display_text: def __init__(self, gw): self.gw = gw self.l1_oop = [] # 存储提示
标签对象 self.l2_oop = [] # 存储玩家打字时的标签对象 self.cpm_list = [] #用正确的总输入字符次数除以总花费的时间(以分钟为单位) self.typspeed = 0.0 # 记录打字的速度 self.anwser = '' # 拼接答案 self.text = self.gw.road.text # 单词内容 self.text2 = self.text.copy() self.text.extend(self.text2) # 单词内容翻倍 x 2 self.text_number = len(self.text) / 2 # 单词个数 self.loading_text() # 加载打字内容 def loading_text(self): col = 1 # 列数 number = 20 # 每页展示20个字 for i, text in enumerate(self.text[:number]): l1 = tk.Label(gw.text_frame, text=text, bg='white', font=('微软雅黑', 15)) l2 = tk.Label(gw.text_frame, text='', bg='white', font=('微软雅黑', 15)) if i < int(number / 2): l1.grid(row=1, column=col, ) l2.grid(row=2, column=col, ) elif int(number / 2) <= i < number: l1.grid(row=3, column=col - int(number / 2), ) l2.grid(row=4, column=col - int(number / 2), ) col += 1 l1.focus_set() l1.bind("<Key>", self.l_bind) self.l1_oop.append(l1) self.l2_oop.append(l2) # 标签绑定键盘事件 def l_bind(self, event): # print(f"事件触发键盘输入:{event.char},对应的ASCII码:{event.keycode}") global FLAG if not FLAG: return if not self.text: return if event.keycode == 8: self.anwser = '' self.l2_oop[0].configure(text='') return if not 65 <= event.keycode <= 90: return self.anwser += event.char self.l2_oop[0].configure(text=self.anwser, bg='#FFFAE3') result = self.text[0] if self.anwser.strip() == result: self.cpm_list.append(result) self.l1_oop[0].configure(fg='red') self.text.remove(result) self.l1_oop.pop(0) self.l2_oop.pop(0) self.anwser = '' if not self.l1_oop and len(self.text) != 0: gw.text_frame.destroy() gw.display_text_frame() self.loading_text() return if len(self.anwser) >= len(result): self.anwser = '' # 检测打字速度, 每分钟输入了多少字符 def typing_speed(self): global FLAG time_ = 0 while FLAG: time_ += 1 try: self.cpm = round(len(''.join(self.cpm_list)) / time_ * 60) self.wpm = round(len(self.cpm_list) / (time_ / 60))# 用来表示打字速度,即每分钟打多少个字(或单词) gw.cpm_label.configure(text=f'cpm:{ self.cpm}') gw.wpm_label.configure(text=f'wpm:{ self.wpm}') except: self.cpm = 0 self.wpm = 0 self.typspeed = self.cpm / 12 time.sleep(1) # 游戏窗口类 class GameWindow: bgcolor = '#68696E' # 画布颜色 root = tk.Tk() root.title('打字小游戏开发') screenwidth = root.winfo_screenwidth() screenheight = root.winfo_screenheight() def __init__(self): pass # 窗口页面的大小 def window_page_size(self,windowsize): rootwidth, rootheight = windowsize rootposx = int((self.screenwidth - rootwidth) / 2) rootposy = int((self.screenheight - rootheight) / 2) - 100 self.root.geometry('{}x{}+{}+{}'.format(rootwidth, rootheight, rootposx, rootposy)) time.sleep(0.1) # 选择赛道 def select_road(self): def func(event): global FLAG,CARFLAG,ROAD FLAG = True CARFLAG = True road = event.widget["text"] print(road) ROAD = road[:-2] self.select_road_frame.destroy() self.window_page_size((1000, 560)) self.create_canvas() configuration_project(ROAD) self.recording_time() self.display_typing_speed() self.replay_button() self.return_button() self.window_page_size((500, 300)) self.select_road_frame = tk.Frame(self.root) self.select_road_frame.place(x=0, y=0, width=500, height=300) for road in ['Python赛道','Java赛道','MySql赛道']: b = tk.Bu