摘要:代碼如下使用新式類此類為地圖模塊封裝的類重新設(shè)置游戲數(shù)據(jù)行數(shù)列數(shù)獲取沒有數(shù)字的位置的個(gè)數(shù)獲取沒有數(shù)字的方格的數(shù)量獲取游戲的得數(shù)。
代碼如下
import random import math __mataclass__ = type # 使用新式類 # 此類為地圖模塊封裝的類 class map2048(): # 重新設(shè)置游戲數(shù)據(jù) def reset(self): self.__row = 4 # 行數(shù) self.__col = 4 # 列數(shù) self.data = [ [0 for x in range(self.__col)] for y in range(self.__row)] # self.data = [[x + 4 * y for x in range(self.__col)] # for y in range(self.__row)] # self.data = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] self.fill2() self.fill2() def __init__(self): self.reset() # 獲取沒有數(shù)字的位置的個(gè)數(shù) def get_space_count(self): """ 獲取沒有數(shù)字的方格的數(shù)量 """ count = 0 for r in self.data: count += r.count(0) return count # 獲取游戲的得數(shù)。 def get_score(self): s = 0 for r in self.data: for c in r: s += 0 if c < 4 else c * int((math.log(c, 2) - 1.0)) return s # 填充2到空位置,如果填度成功返回True,如果已滿,則返回False, def fill2(self): blank_count = self.get_space_count() if 0 == blank_count: return False # 生成隨機(jī)位置 pos = random.randrange(0, blank_count) offset = 0 for r in self.data: for ci in range(self.__col): if 0 == r[ci]: if offset == pos: r[ci] = 2 return True offset += 1 # 判斷游戲是否結(jié)束 def is_gameover(self): for r in self.data: # 如果水平方向還有0,則游戲沒有結(jié)束 if r.count(0): return False # 水平方向如果有兩個(gè)相鄰的元素相同,則沒有游戲結(jié)束 for i in range(self.__col - 1): if r[i] == r[i + 1]: return False for c in range(self.__col - 1): # 豎直方向如果有兩個(gè)相鄰的元素相同,則沒有游戲結(jié)束 for r in range(self.__row - 1): if self.data[r][c] == self.data[r + 1][c]: return False # 以上都沒有,則游戲結(jié)束 return True def left(self): # moveflag 是否成功移動(dòng)數(shù)字標(biāo)志位,如果有移動(dòng)則為真值,原地圖不變則為假值 moveflag = False # 將所有數(shù)字向左移動(dòng)來填補(bǔ)左側(cè)空格 for times in range(self.__col - 1): for r in self.data: for c in range(self.__col - 1): if 0 == r[c]: moveflag = True r[c] = r[c + 1] r[c + 1] = 0 # 判斷是否發(fā)生碰幢,如果有碰撞則合并,合并結(jié)果靠左,右則填充空格 for r in self.data: for c in range(self.__col - 1): if r[c] == r[c + 1]: moveflag = True r[c] *= 2 r[c + 1] = 0 # 再將所有數(shù)字向左移動(dòng)來填補(bǔ)左側(cè)空格 for times in range(self.__col - 1): for r in self.data: for c in range(self.__col - 1): if 0 == r[c]: moveflag = True r[c] = r[c + 1] r[c + 1] = 0 return moveflag # 游戲右移操作 def right(self): for r in self.data: r.reverse() moveflag = self.left() for r in self.data: r.reverse() return moveflag # 游戲上移操作 def up(self): # moveflag 是否成功移動(dòng)數(shù)字標(biāo)志位,如果有移動(dòng)則為真值,原地圖不變則為假值 moveflag = False # 將所有數(shù)字向上移動(dòng)來填補(bǔ)上面空格 for times in range(self.__row - 1): for c in range(self.__col): for r in range(self.__row - 1): if 0 == self.data[r][c]: moveflag = True self.data[r][c] = self.data[r + 1][c] self.data[r + 1][c] = 0 # 判斷是否發(fā)生碰幢,如果有碰撞則合并,合并結(jié)果靠上,下面填充空格 for c in range(self.__col): for r in range(self.__row - 1): if self.data[r][c] == self.data[r + 1][c]: moveflag = True self.data[r][c] *= 2 self.data[r + 1][c] = 0 # 再將所有數(shù)字向上移動(dòng)來填補(bǔ)上面空格 for times in range(self.__row - 1): for c in range(self.__col): for r in range(self.__row - 1): if 0 == self.data[r][c]: moveflag = True self.data[r][c] = self.data[r + 1][c] self.data[r + 1][c] = 0 return moveflag # 游戲下移操作 def down(self): self.data.reverse() moveflag = self.up() self.data.reverse() return moveflag import sys if (sys.version_info > (3, 0)): from tkinter import * from tkinter import messagebox else: from Tkinter import * game = map2048() keymap = { "a": game.left, "d": game.right, "w": game.up, "s": game.down, "Left": game.left, "Right": game.right, "Up": game.up, "Down": game.down, "q": exit, } game_bg_color = "#bbada0" mapcolor = { 0: ("#cdc1b4", "#776e65"), 2: ("#eee4da", "#776e65"), 4: ("#ede0c8", "#f9f6f2"), 8: ("#f2b179", "#f9f6f2"), 16: ("#f59563", "#f9f6f2"), 32: ("#f67c5f", "#f9f6f2"), 64: ("#f65e3b", "#f9f6f2"), 128: ("#edcf72", "#f9f6f2"), 256: ("#edcc61", "#f9f6f2"), 512: ("#e4c02a", "#f9f6f2"), 1024: ("#e2ba13", "#f9f6f2"), 2048: ("#ecc400", "#f9f6f2"), 4096: ("#ae84a8", "#f9f6f2"), 8192: ("#b06ca8", "#f9f6f2"), } # 游戲各方塊的lable數(shù)據(jù) map_labels = [] # 鼠標(biāo)按下處理函數(shù) def on_mouse_down(event): print("clicked at", event.x, event.y) # 鍵盤按下處理函數(shù) def on_key_down(event): keysym = event.keysym if keysym in keymap: if keymap[keysym](): game.fill2() update_ui() if game.is_gameover(): mb = messagebox.askyesno(title="gameover", message="游戲結(jié)束! 是否退出游戲!") if mb: exit() else: game.reset() update_ui() # 刷新界面函數(shù) def update_ui(): # 更改各個(gè)Label的設(shè)置 for r in range(len(game.data)): for c in range(len(game.data[0])): number = game.data[r][c] label = map_labels[r][c] label["text"] = str(number) if number else "" label["bg"] = mapcolor[number][0] label["foreground"] = mapcolor[number][1] label_score["text"] = str(game.get_score()) # 以下為2048的界面 root = Tk() root.title("2048") # root.iconbitmap("./favicon.ico") # 48x48 ico bitmap frame = Frame(root, width=300, height=300, bg=game_bg_color) frame.grid(sticky= N + E + W +S) # 按鍵事件見:http://blog.csdn.net/qq_25600055/article/details/46942035 # 設(shè)置焦點(diǎn)能接收按鍵事件 frame.focus_set() frame.bind("", on_key_down) # 以下綁定鼠標(biāo)按下事件 # frame.bind(" ", on_mouse_down) # 以下綁定鼠標(biāo)移動(dòng)事件 # frame.bind(" ", on_mouse_down) # 以下綁定鼠標(biāo)抬起事件 frame.bind(" ", on_mouse_down) # 見 :http://blog.csdn.net/wjciayf/article/details/50550947 # 初始化圖形界面 for r in range(len(game.data)): row = [] for c in range(len(game.data[0])): value = game.data[r][c] text = "" if 0 == value else str(value) label = Label(frame, text=text, width=4, height=2, font=("黑體", 30, "bold")) label.grid(row=r, column=c, padx=5, pady=5, sticky= N + E + W +S) row.append(label) map_labels.append(row) bottom_row = len(game.data) print("button", str(bottom_row)) label = Label(frame, text="分?jǐn)?shù)", font=("黑體", 30, "bold"), bg="#bbada0", fg="#eee4da") label.grid(row=bottom_row, column=0, padx=5, pady=5) label_score = Label(frame, text="0", font=("黑體", 30, "bold"), bg="#bbada0", fg="#ffffff") label_score.grid(row=bottom_row, columnspan=2, column=1, padx=5, pady=5) def reset_game(): game.reset() update_ui() # restart_button = Button(frame, text="重新開始", command=reset_game) restart_button = Button(frame, text="重新開始", font=("黑體", 16, "bold"), # width=4, height=2, bg="#8f7a66", fg="#f9f6f2", command=reset_game) restart_button.grid(row=bottom_row, column=3, padx=5, pady=5) update_ui() root.mainloop()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/43854.html
摘要:首先安裝確認(rèn)安裝的是版本版本的是不一樣的生成公私鑰對(duì)生成私鑰同時(shí)包含公鑰此處為序列化公鑰私鑰并寫入文件存儲(chǔ)序列化私鑰無密碼也可以加入密碼保護(hù)私鑰將私鑰寫入文件將公鑰寫入文件也可以采用其他序列化方法比如對(duì)公鑰生成格式的序列化字符串輸出類似于 首先 安裝cryptography sudo pip3 install cryptography 確認(rèn)安裝的是2.1.x版本 (1.x版本的api是...
摘要:將返回進(jìn)程碼查看實(shí)時(shí)查看日志關(guān)閉殺死進(jìn)程同步節(jié)點(diǎn)結(jié)論目前來說和都是可以同步成功節(jié)點(diǎn)完全可以放在國(guó)外,同步速度會(huì)很快,使用連接執(zhí)行腳本就好有特殊需求國(guó)內(nèi)阿里云也可以同步成功。 ETH公有鏈節(jié)點(diǎn)同步 最近區(qū)塊鏈公司很多都會(huì)搞發(fā)糖果活動(dòng),一般都能吸引幾萬粉絲,這就來了一個(gè)需求,給人家發(fā)糖果。主流的geth,parity,甚至imtoken錢包只能輸入地址一筆筆交易,幾萬筆交易人工根本無法完成...
摘要:阿里云,采用與模式類似的方案,解決了進(jìn)程模式在高并發(fā)的情況下性能下降的問題。具體測(cè)試結(jié)果分析阿里云在高并發(fā)下,相比社區(qū)版本好很多,更加平穩(wěn)。阿里云引入了機(jī)制后,響應(yīng)延遲,抖動(dòng)相比社區(qū)版本低了很多。 摘要: 背景 進(jìn)程模型數(shù)據(jù)庫(kù),需要為每個(gè)會(huì)話指派獨(dú)立的進(jìn)程與之服務(wù),在連接數(shù)非常多,且大都是活躍連接時(shí),進(jìn)程調(diào)度浪費(fèi)或引入的開銷甚至遠(yuǎn)遠(yuǎn)大于實(shí)際任務(wù)需要的開銷(例如上下文切換,MEMCPY等...
閱讀 2159·2021-11-22 15:22
閱讀 1299·2021-11-11 16:54
閱讀 1830·2021-09-23 11:32
閱讀 3021·2021-09-22 10:02
閱讀 1781·2019-08-30 12:59
閱讀 1095·2019-08-29 16:27
閱讀 631·2019-08-29 13:21
閱讀 2470·2019-08-28 17:57