Python3 翻转瓷砖游戏
欢迎来到这篇博客文章,我们将讨论使用Python实现一款有趣的游戏叫做翻转!翻转!是一款在4×4网格上翻转瓷砖来揭示它们的颜色的游戏。游戏的目标是在尽可能少的移动次数内翻转所有的瓷砖。在本文中,我们将通过使用Python实现游戏并解释代码的不同组成部分。
语法
以下包在这个代码中被使用:
- itertools - 这个包提供了一种更简单的迭代集合的方法。
-
tkinter - 这个包为游戏提供了一个图形用户界面(GUI)。
-
random - 这个包提供了生成随机数的函数。
-
ctypes - 这个包提供了对底层Windows函数的访问。
由于这些包都是Python默认库的一部分,不需要额外安装。
步骤
- 当按下按钮时,按钮的颜色会被显示出来,并与之前按下的按钮的颜色进行比较。
-
如果两个颜色匹配,按钮会保持翻转状态,并更新玩家的得分。如果两个颜色不匹配,按钮会翻回去,而玩家的得分不会改变。
-
游戏会一直进行,直到所有按钮都被翻转过来,程序会将玩家的最高分保存在一个名为maxscore.txt的文本文件中。
-
在比较玩家的得分和游戏结束时的最高分时,如果玩家的得分更高,最高分会在文件中被修改。
-
按下按钮会导致按钮的白色背景变化以揭示下面的颜色。
-
当连续按下相同颜色的按钮时,它们保持颠倒状态。通过连续按下两个不同颜色的按钮,它们会恢复正常。
-
当所有的按钮都被翻转过来后,游戏结束并显示玩家的得分。
-
玩家点击按钮翻转它的次数决定了他们的得分。
import itertools
import tkinter as tk
import random
import ctypes
ctypes.windll.shcore.SetProcessDpiAwareness(1)
pressed = -1
tile_flipped = 16
count_move = 0
maxscore = 0
def is_winner():
global maxscore, count_move
if tile_flipped == 0:
if count_move <= maxscore or maxscore == -1:
maxscore = count_move
with open('maxscore.txt', 'w') as f:
f.write(str(maxscore))
win_lbl['text'] = f'CLICKS: {str(count_move)}, BEST: {str(maxscore)}'
def print_count_move():
win_lbl['text'] = f'CLICKS: {str(count_move)}'
def new_game():
global pressed, tile_flipped, btns, colours, count_move, win_lbl, maxscore
pressed = -1
tile_flipped = 16
count_move = 0
btns = {}
win_lbl['text'] = ''
# make the file if it doesn't exist
try:
with open('maxscore.txt', 'r') as f:
pass
except FileNotFoundError:
with open('maxscore.txt', 'w') as f:
f.write('-1')
with open('maxscore.txt', 'r') as f:
maxscore = int(f.readline().strip())
random.shuffle(colours)
k=0
for _, _ in itertools.product(range(4), range(4)):
btn = Button(k)
btns[k] = btn
if k!= len(colours)-1: k+=1
k=0
for i, j in itertools.product(range(4), range(4)):
btns[k].bttn.grid(row=i, column=j, sticky='nsew')
if k!= len(colours)-1: k+=1
class Button:
def __init__(self, k):
self.index = k
self.bttn = tk.Button(frm,width=6, height=2,borderwidth=6, bg='white', activebackground = colours[self.index],command=self.btn_press)
def btn_press(self):
global pressed, count_move
self.bttn.configure(bg=colours[self.index])
count_move += 1
print_count_move()
if pressed == -1:
pressed = self.index
else:
self.compare_pressed_btns()
def compare_pressed_btns(self):
global pressed
global tile_flipped
if colours[self.index] != colours[pressed]:
self.bttn.configure(bg='white')
btns[pressed].bttn.configure(bg='white')
elif self.index != pressed:
self.bttn['state'] = tk.DISABLED
btns[pressed].bttn['state']= tk.DISABLED
tile_flipped -= 2
is_winner()
else:
self.bttn.configure(bg='white')
pressed = -1
window = tk.Tk()
window.title('Flip!')
window.config(bg = 'black')
window.rowconfigure([0,1],weight=1,pad=2)
window.columnconfigure(0,weight =1, pad=2)
frm = tk.Frame(window, bg='Gray')
frm.grid(row = 0, column=0, sticky='nsew')
frm.rowconfigure(list(range(4)), minsize=50, pad=2)
frm.columnconfigure(list(range(4)), minsize=50, pad=2)
btns = {}
colours=['YellowGreen', 'Violet', 'Tomato', 'SlateBlue', 'DarkCyan', 'Orange','DodgerBlue', 'ForestGreen']*2
random.shuffle(colours)
frm2 = tk.Frame(window, bg='Khaki')
win_lbl = tk.Label(frm2,width=19, height=1,bg='PowderBlue',relief=tk.GROOVE,borderwidth=2)
win_lbl.grid(row=0, column=0, padx=5, pady=5, sticky='nsew')
new_game_btn = tk.Button(text='NEW GAME', master=frm2, width=10, height=1, borderwidth=3, bg='Plum', command=new_game)
new_game_btn.grid(row=0, column=1, padx=5, pady=5, sticky = 'nsew')
frm2.grid(row=1, column=0, sticky='nsew')
new_game()
window.mainloop()
输出
解释
- 在这个经过简化的热门记忆游戏Flip中,玩家被提供一个按钮网格,每个按钮最初呈白色,在4×4的网格中,每个按钮下藏着一种颜色。用户的任务是在按钮翻转后将两个按钮的颜色配对,直到剩下没有两个按钮为止,游戏结束。
-
首先导入必要的库,包括random、itertools、用于图形用户界面的tkinter和用于Windows特定功能的ctypes。随机模块用于重新排列按钮音调。设置不同的全局因素,以跟踪游戏的进展。”pressed”用于跟踪最近按钮按下的索引,”tile flipped”显示已配对的按钮数量,”count move”显示已进行的移动次数,而”maxscore”用于记录最大的得分。
显示游戏中的最高分数。
- is_winner 函数负责检查游戏是否已经胜利。它检查所有的方块是否都被翻转,即tile_flipped是否为零,并且如果是,则检查当前的移动次数count_move是否小于或等于先前的最佳得分maxscore。如果是,则更新 maxscore 为新的count_move,并将其写入名为 maxscore.txt 的文件中。最后,更新 win_lbl 标签的文本,显示当前得分和最佳得分。
-
print_count_move 函数更新 win_lbl 标签,显示当前的移动次数。
-
new_game 该函数负责重置游戏。它将变量初始化为默认值,清除“win_lbl”标签,并从maxscore.txt文件中读取以前的最高分。然后,它对颜色列表进行洗牌,并使用Button类创建一个按钮网格。它还设置了按钮在屏幕上的网格布局。 Button类定义了游戏中每个图块的属性和行为。每个按钮都有一个索引值,它对应于它在颜色列表中的位置。它创建一个带有白色背景颜色和与其分配颜色相匹配的活动背景颜色的tk.Button对象。当按钮被点击时,它的背景颜色会更改为其分配的颜色,并增加count_move计数。如果按钮是第一个被点击的按钮,则它会将其索引值存储在pressed变量中。如果它是第二个被点击的按钮,则它会通过调用compare_pressed_btns函数将其颜色与第一个按钮的颜色进行比较。
-
当颜色匹配时,按钮将被禁用,并且翻转的拼图计数将减少。如果颜色不匹配,按钮的背景颜色将被改回白色。
-
最后,代码的主体部分初始化GUI窗口,设置其标题和背景颜色,并创建将容纳游戏板和得分标签及新游戏按钮的frm和frm2框架。还创建win_lbl标签和new_game_btn按钮,并设置它们的属性。然后调用new_game函数开始游戏。最后,使用window.mainloop()进入主事件循环。
应用程序
该项目可以展示图形用户界面(GUI)、按钮和功能的想法;同时,它作为一种利用锐利的图形关联点评估和进一步改进记忆能力的出色方法。该游戏可以进一步修改,包括各种形状、颜色和图像,使其成为初学者学习如何使用Python编程图形用户界面的良好项目。
结论
使用Tkinter工具包和Python 3的Flipping Tiles游戏既有趣又有趣,是学习Python GUI开发的绝佳项目。使用按钮和功能演示了如何使用编程语言和GUI框架制作交互式图形界面,因此这个拼图可以按照个人喜好进行定制,是初学者开始学习Python编程语言的图形用户界面的好地方。