摘要:代碼如下使用新式類此類為地圖模塊封裝的類重新設置游戲數據行數列數獲取沒有數字的位置的個數獲取沒有數字的方格的數量獲取游戲的得數。
代碼如下
import random import math __mataclass__ = type # 使用新式類 # 此類為地圖模塊封裝的類 class map2048(): # 重新設置游戲數據 def reset(self): self.__row = 4 # 行數 self.__col = 4 # 列數 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() # 獲取沒有數字的位置的個數 def get_space_count(self): """ 獲取沒有數字的方格的數量 """ count = 0 for r in self.data: count += r.count(0) return count # 獲取游戲的得數。 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 # 生成隨機位置 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 # 判斷游戲是否結束 def is_gameover(self): for r in self.data: # 如果水平方向還有0,則游戲沒有結束 if r.count(0): return False # 水平方向如果有兩個相鄰的元素相同,則沒有游戲結束 for i in range(self.__col - 1): if r[i] == r[i + 1]: return False for c in range(self.__col - 1): # 豎直方向如果有兩個相鄰的元素相同,則沒有游戲結束 for r in range(self.__row - 1): if self.data[r][c] == self.data[r + 1][c]: return False # 以上都沒有,則游戲結束 return True def left(self): # moveflag 是否成功移動數字標志位,如果有移動則為真值,原地圖不變則為假值 moveflag = False # 將所有數字向左移動來填補左側空格 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 # 判斷是否發生碰幢,如果有碰撞則合并,合并結果靠左,右則填充空格 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 # 再將所有數字向左移動來填補左側空格 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 是否成功移動數字標志位,如果有移動則為真值,原地圖不變則為假值 moveflag = False # 將所有數字向上移動來填補上面空格 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 # 判斷是否發生碰幢,如果有碰撞則合并,合并結果靠上,下面填充空格 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 # 再將所有數字向上移動來填補上面空格 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數據 map_labels = [] # 鼠標按下處理函數 def on_mouse_down(event): print("clicked at", event.x, event.y) # 鍵盤按下處理函數 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="游戲結束! 是否退出游戲!") if mb: exit() else: game.reset() update_ui() # 刷新界面函數 def update_ui(): # 更改各個Label的設置 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 # 設置焦點能接收按鍵事件 frame.focus_set() frame.bind("", on_key_down) # 以下綁定鼠標按下事件 # frame.bind(" ", on_mouse_down) # 以下綁定鼠標移動事件 # frame.bind(" ", on_mouse_down) # 以下綁定鼠標抬起事件 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="分數", 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()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43854.html
摘要:首先安裝確認安裝的是版本版本的是不一樣的生成公私鑰對生成私鑰同時包含公鑰此處為序列化公鑰私鑰并寫入文件存儲序列化私鑰無密碼也可以加入密碼保護私鑰將私鑰寫入文件將公鑰寫入文件也可以采用其他序列化方法比如對公鑰生成格式的序列化字符串輸出類似于 首先 安裝cryptography sudo pip3 install cryptography 確認安裝的是2.1.x版本 (1.x版本的api是...
摘要:將返回進程碼查看實時查看日志關閉殺死進程同步節點結論目前來說和都是可以同步成功節點完全可以放在國外,同步速度會很快,使用連接執行腳本就好有特殊需求國內阿里云也可以同步成功。 ETH公有鏈節點同步 最近區塊鏈公司很多都會搞發糖果活動,一般都能吸引幾萬粉絲,這就來了一個需求,給人家發糖果。主流的geth,parity,甚至imtoken錢包只能輸入地址一筆筆交易,幾萬筆交易人工根本無法完成...
摘要:阿里云,采用與模式類似的方案,解決了進程模式在高并發的情況下性能下降的問題。具體測試結果分析阿里云在高并發下,相比社區版本好很多,更加平穩。阿里云引入了機制后,響應延遲,抖動相比社區版本低了很多。 摘要: 背景 進程模型數據庫,需要為每個會話指派獨立的進程與之服務,在連接數非常多,且大都是活躍連接時,進程調度浪費或引入的開銷甚至遠遠大于實際任務需要的開銷(例如上下文切換,MEMCPY等...
閱讀 2137·2021-11-22 15:22
閱讀 1286·2021-11-11 16:54
閱讀 1807·2021-09-23 11:32
閱讀 3007·2021-09-22 10:02
閱讀 1771·2019-08-30 12:59
閱讀 1085·2019-08-29 16:27
閱讀 622·2019-08-29 13:21
閱讀 2464·2019-08-28 17:57