资讯详情

Python 打字小游戏开发,来体验不一样的打字游戏乐趣(完结篇)

Python 开发打字游戏,体验不同的打字游戏乐趣(结尾)

  • 资源下载
  • 完整代码
Python 开发打字游戏,体验不同的打字游戏乐趣(第一篇) 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

标签: tdt1对射型光电开关传感器tdt2对射电眼传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台