Python實(shí)現(xiàn)極限車(chē)神游戲的示例代碼
導(dǎo)語(yǔ)
今天小編要為大家介紹一款小編自己用代碼碼出來(lái)的賽車(chē)風(fēng)格的打字小游戲
取名暫定為《極限車(chē)神》打字小游戲。
這款Pygame小游戲在玩法上可以說(shuō)十分創(chuàng)新,不僅能游戲還能學(xué)到很多不同類(lèi)型的編程代碼關(guān)鍵字的語(yǔ)言,比如我就做了這幾款類(lèi)型:Python、Java等。
下面我們就來(lái)看一下這款賽車(chē)風(fēng)格打字微信小游戲《極限車(chē)神》具體怎么玩吧!
正文
讓我們先來(lái)看看這款Pygame的經(jīng)典點(diǎn)評(píng)吧,讓大家快速了解一下《極限車(chē)神》打字小游戲
**關(guān)鍵詞:**休閑、賽車(chē)、競(jìng)技、競(jìng)速、操作、打字、闖關(guān)、限時(shí)。
**氪金指數(shù):**0氪金。
推薦星數(shù):4星(滿星5星)
難度星數(shù):5星(滿星5星)
這是一款有點(diǎn)考驗(yàn)玩家打字速度操作水平的賽車(chē)游戲,玩起來(lái)還有點(diǎn)意思,考驗(yàn)大家手速的時(shí)候到啦。平常打字看鍵盤(pán)的小可愛(ài)你準(zhǔn)備好了嘛?
一、環(huán)境準(zhǔn)備
1)運(yùn)行環(huán)境
本文用到的環(huán)境如下——
Python3、Pycharm社區(qū)版,第三方模塊:Tkinter、Pygame。部分自帶的庫(kù)只要安裝完P(guān)ython就可以直接使用了
一般安裝:pip install +模塊名 鏡像源安裝:pip install -i https://pypi.douban.com/simple/+模塊名 (之前有說(shuō)過(guò)安裝報(bào)錯(cuò)的幾種方式跟解決方法,不會(huì)安裝的可以去看下,還有很多國(guó)內(nèi)鏡像源也有文章的)
還有準(zhǔn)備一些數(shù)據(jù)源素材等這些大家可以用自己準(zhǔn)備的哦!
圖片文本素材等如下——
小游戲當(dāng)然要有音樂(lè)更配啦~
二、代碼實(shí)現(xiàn)
1)導(dǎo)入庫(kù)
import tkinter as tk import threading,random,time,datetime import inspect import ctypes from tkinter import ttk from pygame import mixer
2)主程序
FLAG = True # 定義一個(gè)信號(hào)量,用于判斷最前面的小車(chē)是否到達(dá)終點(diǎn),游戲結(jié)束變?yōu)镕alse CARFLAG = True # 定義小車(chē)真正在窗口上移動(dòng)時(shí)的信號(hào)量,當(dāng)小車(chē)在窗口上靜止不動(dòng)時(shí)變?yōu)镕alse ROAD = '' # 賽道(Python,Java,MySql賽道) # 玩家類(lèi) class Player: def __init__(self,username): self.username = '[玩家]'+username # 創(chuàng)建小車(chē) 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) # 電腦類(lèi) class Computer: def __init__(self,username='[電腦]'): self.username = username # 創(chuàng)建小車(chē) 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) # 賽道類(lèi) class Road: def __init__(self,roadtype): self.text = [] with open(f'./sucai/{roadtype}關(guān)鍵字.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) # 賽道的數(shù)量 self.road_length = (self.road_number - 3) * 1000 # 需要跑完賽道的長(zhǎng)度 self.road_s = 0.0 # 起點(diǎn)線 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') # 終點(diǎn)線 def destination(self,c): self.c_end = c.create_text(self.road_length - 120, 200, text='終\n點(diǎn)', font=("Purisa", 52), fill='white',tag='end') # 路相對(duì)于車(chē)移動(dòng) 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) # 小樹(shù)類(lèi) class Tree: speed = 0 def __init__(self, posx,posy,filepath,treetag='tree'): self.posx = posx self.posy = posy self.filepath = filepath self.treetag = treetag # 創(chuàng)建樹(shù) 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) # 樹(shù)相對(duì)于車(chē)移動(dòng) 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) # 小車(chē)類(lèi) class Car: speed = 2.0 # 初始化小車(chē)的移動(dòng)速度 posx = 70 # 初始化小車(chē)的初始位置,x軸方向 car_move_distance = [] # 記錄小車(chē),以初始化速度speed = 2.0開(kāi)始移動(dòng)的路程 def __init__(self, filepath, posy, cartag, username): self.filepath = filepath self.posy = posy self.cartag = cartag self.username = username # 小車(chē)移動(dòng)方法 def car_move(self,c,car_img): global FLAG print(self.username,'準(zhǔn)備就緒...') 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} 小車(chē)停止') run() # 小車(chē)移動(dòng)速度隨時(shí)變化 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) # 打字類(lèi) class display_text: def __init__(self, gw): self.gw = gw self.l1_oop = [] # 存儲(chǔ)提示標(biāo)簽對(duì)象 self.l2_oop = [] # 存儲(chǔ)玩家打字時(shí)的標(biāo)簽對(duì)象 self.cpm_list = [] #用正確的總輸入字符次數(shù)除以總花費(fèi)的時(shí)間(以分鐘為單位) self.typspeed = 0.0 # 記錄打字的速度 self.anwser = '' # 拼接答案 self.text = self.gw.road.text # 單詞內(nèi)容 self.text2 = self.text.copy() self.text.extend(self.text2) # 單詞內(nèi)容翻倍 x 2 self.text_number = len(self.text) / 2 # 單詞個(gè)數(shù) self.loading_text() # 加載打字內(nèi)容 def loading_text(self): col = 1 # 列數(shù) number = 20 # 每頁(yè)展示20個(gè)字 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) # 標(biāo)簽綁定鍵盤(pán)事件 def l_bind(self, event): # print(f"事件觸發(fā)鍵盤(pán)輸入:{event.char},對(duì)應(yīng)的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 = '' # 檢測(cè)打字速度, 每分鐘輸入了多少字符 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))# 用來(lái)表示打字速度,即每分鐘打多少個(gè)字(或單詞) 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) # 游戲窗口類(lèi) class GameWindow: bgcolor = '#68696E' # 畫(huà)布顏色 root = tk.Tk() root.title('打字小游戲開(kāi)發(fā)') screenwidth = root.winfo_screenwidth() screenheight = root.winfo_screenheight() def __init__(self): pass # 窗口頁(yè)面的大小 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.Button(self.select_road_frame, text=road,font=('華文行楷', 26),relief=tk.RAISED,cursor='hand2',width=12,height=1) b.pack(pady=20) b.bind("<Button-1>", func) # 創(chuàng)建一張畫(huà)布 def create_canvas(self): self.canvas = tk.Canvas(self.root, width=1000, height=400, bg=self.bgcolor) self.canvas.place(x=0, y=0) # 創(chuàng)建一條路——賽道 def create_road(self,roadtype): # self.road = Road('Java') # 實(shí)列化一個(gè)路的對(duì)象(Java類(lèi)型的路) self.road = Road(roadtype) # 實(shí)列化一個(gè)路的對(duì)象(Python類(lèi)型的路) self.road_img = tk.PhotoImage(file='./sucai/road.png') self.c_road = [self.canvas.create_image(i, 200, image=self.road_img, tag=f'c_road{i}') for i in range(500, self.road.road_number * 1000, 1000)] self.tag_road = [f'c_road{i}' for i in range(500, (self.road.road_number - 2) * 1000, 1000)] # 創(chuàng)建兩棵樹(shù) def create_tree(self): self.tree1 = Tree(posx=160, posy=350,filepath='./sucai/tree1.png',treetag='tree1') self.tree1.tree_create(self.canvas) self.tree2 = Tree(posx=230, posy=340,filepath='./sucai/tree2.png', treetag='tree2') self.tree2.tree_create(self.canvas) # 創(chuàng)建跑程進(jìn)度條 def displayprogressbar(self,caroop_list): maximum = self.road.road_length self.progressbar_list = [] for i in range(4): progressbar = ttk.Progressbar(self.canvas, length=200, maximum=maximum) progressbar.place(x=10, y= 20 if i == 0 else i*40 + 20) tk.Label(self.canvas,text=caroop_list[i].username,fg='#191970').place(x=215,y=20 if i == 0 else i*40 + 20) self.progressbar_list.append(progressbar) # 重新開(kāi)始按鈕 def replay_button(self): def function(): global FLAG,CARFLAG,end_label_list,dt FLAG = False CARFLAG = False for t in threading.enumerate()[1:]: stop_thread(t) self.canvas.destroy() self.text_frame.destroy() if end_label_list: for i in end_label_list: i.destroy() del dt FLAG = True CARFLAG = True self.create_canvas() configuration_project(ROAD) self.recording_time() self.return_button() self.replaybutton_img = tk.PhotoImage(file='./sucai/replay.png') tk.Label(self.root,text='重新開(kāi)始').place(x=920,y=480) replaybutton = tk.Button(self.root, image=self.replaybutton_img, command=function) replaybutton.place(x=910,y=400) # 返回按鈕 def return_button(self): def function(): global FLAG,CARFLAG,ROAD,end_label_list,dt FLAG = False CARFLAG = False ROAD = '' for t in threading.enumerate()[2:]: stop_thread(t) self.canvas.destroy() self.text_frame.destroy() self.cpm_label.destroy() self.wpm_label.destroy() if end_label_list: for i in end_label_list: i.destroy() del dt self.select_road() self.returnbutton_img = tk.PhotoImage(file='./sucai/return.png') returnbutton = tk.Button(self.root,text='返回',image=self.returnbutton_img,command=function) returnbutton.place(x=900,y=50) # 記錄游戲時(shí)間 def recording_time(self): time_label = tk.Label(self.canvas, text='時(shí)長(zhǎng):00:00:00', font=("華文行楷", 15), background='#DAEFE6') time_label.place(x=870, y=20) start_time = datetime.datetime.now() def run(): global FLAG if FLAG: time_label.after(1000, run) update_time = datetime.datetime.now() - start_time self.time_ = f'時(shí)長(zhǎng):{update_time}'.split('.')[0] time_label.configure(text=self.time_) # 不顯示時(shí)長(zhǎng)的毫秒值 run() # 展示文本 def display_text_frame(self): self.text_frame = tk.Frame(self.root, bg='white') self.text_frame.place(x=100, y=400, width=800, height=150) # 顯示打字速度 def display_typing_speed(self): self.cpm_label = tk.Label(self.root,text='cpm:0', font=("微軟雅黑", 13),fg='#A52A2A') self.cpm_label.place(x=8,y=410) self.wpm_label = tk.Label(self.root, text='wpm:0', font=("微軟雅黑", 13),fg='#A52A2A') self.wpm_label.place(x=8, y=440) # 播放背景音樂(lè)函數(shù) def playmusic(self,): global FLAG mixer.init() mixer.music.load('./sucai/bgmusic.mp3') mixer.music.play() while FLAG: time.sleep(2) mixer.music.stop() # 顯示窗口 def displaywindow(self): self.root.resizable(False, False) self.root.mainloop() def _async_raise(tid, exctype): tid = ctypes.c_long(tid) if not inspect.isclass(exctype): exctype = type(exctype) res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype)) if res == 0: raise ValueError("invalid thread id") elif res != 1: ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None) raise SystemError("PyThreadState_SetAsyncExc failed") # 停止正在運(yùn)行中的線程 def stop_thread(thread): _async_raise(thread.ident, SystemExit) # 監(jiān)測(cè)小車(chē)移動(dòng)時(shí)的數(shù)據(jù)變化 def monitoring_data(gw,caroop_list,dt): global FLAG,CARFLAG,end_label_list time.sleep(2.5) # 休眠2.5秒后才開(kāi)始 gw.displayprogressbar(caroop_list) #顯示完成跑道的進(jìn)度條 gw.canvas.delete('begin') # 刪除起點(diǎn)線 gw.road.destination(gw.canvas) # 創(chuàng)建終點(diǎn)線 player_car_s = player.car.car_move_distance[0][1] timesleep3_posx_s_list = {} for i in caroop_list: timesleep3_posx_s_list[i.username] = i.car.car_move_distance[0][1] print(i.username,'已跑起來(lái)') while FLAG: CARFLAG = False for idx,p in enumerate(gw.progressbar_list): p['value'] = timesleep3_posx_s_list[caroop_list[idx].username] if max(timesleep3_posx_s_list.values()) > gw.road.road_length: FLAG = False ranking = sorted(timesleep3_posx_s_list.items(), key=lambda x: x[1]) # 排名 for idx,username in enumerate(ranking[::-1]): l = tk.Label(gw.root, text=username[0] + f' 第{idx + 1}名', font=('微軟雅黑', 28), bg='white') l.pack(pady=30) end_label_list.append(l) print('游戲結(jié)束') return # player.car.speed = 30 player.car.speed = dt.typspeed #使小車(chē)速度 = 打字速度 player_car_s += player.car.speed #讓小車(chē)此時(shí)已移動(dòng)的路程加上小車(chē)速度 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 gw.road.roadmove(gw.canvas, gw.tag_road) # 賽道相對(duì)小車(chē)的速度,開(kāi)始移動(dòng) gw.tree1.treemove(gw.canvas) # 樹(shù)1相對(duì)小車(chē)的速度,開(kāi)始移動(dòng) gw.tree2.treemove(gw.canvas) # 樹(shù)2相對(duì)小車(chē)的速度,開(kāi)始移動(dòng) time.sleep(0.0095) # 配置運(yùn)行流程 def configuration_project(roadtype): print('游戲開(kāi)始') global player,gw,dt,end_label_list tplaymusic = threading.Thread(target=gw.playmusic) # 開(kāi)啟一個(gè)播放背景音樂(lè)的線程 tplaymusic.setDaemon(True) tplaymusic.start() gw.create_road(roadtype) # 創(chuàng)建賽道 gw.create_tree() # 創(chuàng)建樹(shù) gw.road.begin(gw.canvas) #創(chuàng)建一條起點(diǎn)線 gw.display_text_frame() # 創(chuàng)建展示文本的frame end_label_list = [] # 游戲結(jié)束時(shí),存放顯示名次的標(biāo)簽列表 caroop_list = [] # 添加所有玩家(小車(chē))對(duì)象 carposy_list = [90, 147, 250, 309] # 定義四個(gè)小車(chē)初始化的y軸坐標(biāo) player = Player('yyds') # 創(chuàng)建一個(gè)真人玩家對(duì)象 player.car_create(gw.canvas, carposy_list[0]) # 生成一個(gè)屬于真人玩家的小車(chē) caroop_list.append(player) for i in range(3): #創(chuàng)建三個(gè)電腦玩家 computer = Computer(f'[電腦]{i+1}') computer.car_create(gw.canvas,f'./sucai/car{i+2}.png', carposy_list[i+1], f'img{i+2}', computer.username)# 生成屬于電腦玩家的小車(chē) caroop_list.append(computer) for caroop in caroop_list: tcm = threading.Thread(target=caroop.car.car_move,args=(gw.canvas,caroop.car_img)) # 為每一個(gè)玩家開(kāi)啟一個(gè)線程,用來(lái)啟動(dòng)各自的小車(chē) tcm.setDaemon(True) tcm.start() tcsc = threading.Thread(target=caroop.car.car_speed_change) #為每一輛小車(chē)定時(shí)隨機(jī)改變小車(chē)的移動(dòng)速度 tcsc.setDaemon(True) tcsc.start() dt = display_text(gw) # 實(shí)例化一個(gè)打字所用的文本內(nèi)容對(duì)象 tdt = threading.Thread(target=dt.typing_speed) # 開(kāi)啟線程來(lái)記錄打字的速度 tdt.setDaemon(True) tdt.start() tmd = threading.Thread(target=monitoring_data, args=(gw, caroop_list, dt)) # 開(kāi)啟線程來(lái)記錄每一輛小車(chē)移動(dòng)時(shí)的數(shù)據(jù)變化 tmd.setDaemon(True) tmd.start() def start(): global gw gw = GameWindow() # 實(shí)例化一個(gè)游戲窗口對(duì)象 gw.select_road() # 選擇賽道 gw.displaywindow() if __name__ == '__main__': start()
三、效果實(shí)現(xiàn)
這款《極限車(chē)神打字小游戲》顧名思義就是一個(gè)打字的游戲,只有打字速度快,你的賽車(chē)才能
跑起來(lái)哦。游戲分為三個(gè)賽道,都是關(guān)于不同編程的關(guān)鍵字英文,邊玩游戲還能提升自己哦,
兩全其美哦!
1)游戲界面
?2)Python賽道游戲界面
3)賽道起飛
到此這篇關(guān)于Python實(shí)現(xiàn)極限車(chē)神游戲的示例代碼的文章就介紹到這了,更多相關(guān)Python極限車(chē)神游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python入門(mén)_淺談字符串的分片與索引、字符串的方法
下面小編就為大家?guī)?lái)一篇Python入門(mén)_淺談字符串的分片與索引、字符串的方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05Python+tkinter實(shí)現(xiàn)一個(gè)繪圖風(fēng)格控件
這篇文章主要為大家詳細(xì)介紹了Python如何利用tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的繪圖風(fēng)格控件,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2023-09-09Python實(shí)現(xiàn)自動(dòng)識(shí)別數(shù)字驗(yàn)證碼
這篇文章主要為大家詳細(xì)介紹了如何使用Python來(lái)自動(dòng)識(shí)別數(shù)字驗(yàn)證碼,以便在需要時(shí)自動(dòng)填寫(xiě)或驗(yàn)證驗(yàn)證碼,有需要的小伙伴可以參考一下2024-04-04