成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

2048 python版本

sorra / 3188人閱讀

摘要:代碼如下使用新式類此類為地圖模塊封裝的類重新設(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

相關(guān)文章

  • python (3.x) 實(shí)現(xiàn)RSA 加簽 驗(yàn)簽 以及key的序列化

    摘要:首先安裝確認(rèn)安裝的是版本版本的是不一樣的生成公私鑰對(duì)生成私鑰同時(shí)包含公鑰此處為序列化公鑰私鑰并寫入文件存儲(chǔ)序列化私鑰無密碼也可以加入密碼保護(hù)私鑰將私鑰寫入文件將公鑰寫入文件也可以采用其他序列化方法比如對(duì)公鑰生成格式的序列化字符串輸出類似于 首先 安裝cryptography sudo pip3 install cryptography 確認(rèn)安裝的是2.1.x版本 (1.x版本的api是...

    kuangcaibao 評(píng)論0 收藏0
  • web3公測(cè)版本教程(一)-ETH公有鏈節(jié)點(diǎn)同步

    摘要:將返回進(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錢包只能輸入地址一筆筆交易,幾萬筆交易人工根本無法完成...

    flybywind 評(píng)論0 收藏0
  • PgSQL · 應(yīng)用案例 · 阿里云 RDS PostgreSQL 高并發(fā)特性 vs 社區(qū)版本

    摘要:阿里云,采用與模式類似的方案,解決了進(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等...

    ThinkSNS 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<