最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于python做一個(gè)2048小游戲

 更新時(shí)間:2024年01月14日 08:53:38   作者:微小冷  
2048的邏輯無(wú)非是操作4*4的方格,每個(gè)方格中有一個(gè)數(shù),這些數(shù)可以移動(dòng),如果兩個(gè)相同的數(shù)字在移動(dòng)時(shí)相撞了,就可以彼此合并,本文將給大家介紹如何基于python做一個(gè)2048小游戲,感興趣的小伙伴跟著小編一起來(lái)看看吧

邏輯設(shè)計(jì)

2048的邏輯無(wú)非是操作4 × 4 的方格,每個(gè)方格中有一個(gè)數(shù),這些數(shù)可以移動(dòng),如果兩個(gè)相同的數(shù)字在移動(dòng)時(shí)相撞了,就可以彼此合并。

而這個(gè)4 × 4的方格,無(wú)非是一個(gè)矩陣。只需設(shè)計(jì)好移動(dòng)邏輯,再用PyGame將這個(gè)方格表現(xiàn)出來(lái)就算大功告成。

2048只有四個(gè)手勢(shì)動(dòng)作,即上下左右,這四個(gè)動(dòng)作所引發(fā)的結(jié)果都可以歸結(jié)為對(duì)單行或者單列的操作,進(jìn)而歸結(jié)為對(duì)一個(gè)列表的操作。

首先,對(duì)列表進(jìn)行操作時(shí),先排除0的影響,在排除0的影響之后,若相鄰元素相等,即可合并。例如對(duì)于[ 0 , 2 , 2 , 0 ],如果向左合并則輸出為[ 4 , 0 , 0 , 0 ]。

def mergeLst(lst):
    lst = [x for x in lst if x] # 刪除lst中的0
    newLst = []
    N, i = len(lst), 0
    while i < N:
        if i<N-1 and lst[i] == lst[i+1]:
            newLst.append(lst[i]*2)
            i += 2
        else:
            newLst.append(lst[i])
            i += 1
    return newLst + (4-len(newLst))*[0]

測(cè)試如下

mergeLst([0,2,2,0]) # [4, 0, 0, 0]
mergeLst([2,2,2,2]) # [4, 4, 0, 0]
mergeLst([2,2,8,4]) # [4, 8, 4, 0]

相應(yīng)地,對(duì)一個(gè)矩陣進(jìn)行合并,只需針對(duì)每一行進(jìn)行操作即可

[mergeLst(x) for x in mat]

對(duì)于上下左右不同按鍵的操作,可以先將矩陣旋轉(zhuǎn),然后再進(jìn)行合并操作,合并之后再逆轉(zhuǎn)回來(lái)。

def rotate(mat):
    newMat = [[[] for _ in mat] for b in mat[0]]
    for i,row in enumerate(mat, 1):
        for j,r in enumerate(row, 0):
            newMat[j][-i] = r
    return newMat

在實(shí)際操作中,左、下、右、上分別對(duì)應(yīng)旋轉(zhuǎn)0,1,2,3次,即

KEY_DCT = {
    pygame.K_LEFT:0,   pygame.K_DOWN:1,
    pygame.K_RIGHT:2,  pygame.K_UP:3
}

從而游戲的總挪動(dòng)邏輯如下

def updateMat(mat, key):
    N = KEY_DCT[key]
    for _ in range(N):
        mat = rotate(mat)
    mat = [mergeLst(x) for x in mat]
    for _ in range(4-N):
        mat = rotate(mat)   # 旋轉(zhuǎn)回來(lái)
    return mat

2048游戲在開(kāi)始之前,需要初始化一個(gè)4x4的矩陣,然后每次操作之前,需要在矩陣中為0的位置隨機(jī)生成一個(gè)數(shù)。隨機(jī)生成的數(shù)的取值范圍決定了游戲的難度,所以生成方式也比較靈活,下面給出一種普通的生成方法

from itertools import product
from random import sample, randint
def addNew(mat):
    ijs = []
    for i,j in product(range(4), range(4)):
        if mat[i][j] == 0:
            ijs.appen((i,j))
    if len(ijs) == 0:
        return False
    i, j = sample(ijs, 1)[0]   # 挑選一個(gè)不為0的點(diǎn)
    x = randint(1,100)
    x = 7 - np.floor(np.log2(x))
    mat[i,j] = int(2**x)
    return True

繪圖邏輯

這個(gè)游戲的繪圖邏輯比較簡(jiǎn)單,只需為矩陣中每個(gè)元素賦予一個(gè)顏色即可。

GRAY = (205, 205, 205)
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
SIZE = 80

def setColor(N):
    if N == 0:
        return (233, 233, 233)
    n = int(math.log2(N))
    delta = int(255/15)
    return (255-n*delta, n*delta, (128+n*delta)%255)


def draw(win, font, mat):
    for i,j in product(range(4), range(4)):
        ch = str(mat[i][j])
        rect = (j*SIZE, i*SIZE, SIZE, SIZE)
        c = setColor(mat[i][j])
        pygame.draw.rect(win, c, rect)
        pygame.draw.rect(win, GRAY, rect, 5)

        txt = font.render(ch, True, GREEN)
        offset =  (0.5 - len(ch)/10)*SIZE
        xy = (j*SIZE+offset, (i+0.3)*SIZE)
        win.blit(txt, xy)

主循環(huán)

最后,實(shí)現(xiàn)游戲的主循環(huán)如下

def gui():
    pygame.init()
    win = pygame.display.set_mode(
        (4 * SIZE, 4 * SIZE))
    pygame.display.set_caption("迷宮游戲")
    font.init()
    f = font.Font('C:\\WINDOWS\\Fonts\\ARLRDBD.TTF', 32)
    running = True

    mat = [[0]*4 for _ in range(4)]
    addNew(mat)
    while running:
        win.fill(WHITE)
        for evt in pygame.event.get():
            if evt.type == pygame.QUIT:
                return
            if evt.type == pygame.KEYDOWN and evt.key in KEY_DCT:
                newMat = updateMat(mat, evt.key)
                if newMat!=mat:
                    mat = newMat
                    running = addNew(mat)
        draw(win, f, mat)
        # 判斷玩家是否到達(dá)出口
        if max([max(x) for x in mat])==2048:
            print("恭喜通關(guān)")
            running = False
        if min([min(x) for x in mat])>0:
            print("游戲失敗")
            running = False

        pygame.display.update()

游戲效果如下

以上就是基于python做一個(gè)2048小游戲的詳細(xì)內(nèi)容,更多關(guān)于python 2048小游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 用python修改excel表某一列內(nèi)容的操作方法

    用python修改excel表某一列內(nèi)容的操作方法

    這篇文章主要介紹了用python修改excel表某一列內(nèi)容的操作代碼,在實(shí)現(xiàn)過(guò)程中用到openpyxl這個(gè)庫(kù),要生成隨機(jī)數(shù)就要有random這個(gè)庫(kù),具體代碼跟隨小編一起看看吧
    2021-06-06
  • python版本五子棋的實(shí)現(xiàn)代碼

    python版本五子棋的實(shí)現(xiàn)代碼

    五子棋是常見(jiàn)的一款小游戲,五子棋問(wèn)題是人工智能中的一個(gè)經(jīng)典問(wèn)題。這篇文章主要介紹了python版本五子棋的實(shí)現(xiàn)代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • 利用Python封裝MySQLHelper類實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查功能

    利用Python封裝MySQLHelper類實(shí)現(xiàn)數(shù)據(jù)庫(kù)的增刪改查功能

    Python 連接 MySQL 的方法有很多,常用的有 pymysql 和 mysql-connector-python 兩種庫(kù),本文主要介紹了如何封裝一個(gè)MySQLHelper類,實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增刪改查功能,感興趣的可以了解一下
    2023-06-06
  • Django 實(shí)現(xiàn)jwt認(rèn)證的示例

    Django 實(shí)現(xiàn)jwt認(rèn)證的示例

    這篇文章主要介紹了Django 實(shí)現(xiàn)jwt 認(rèn)證的示例,幫助大家更好的理解和學(xué)習(xí)使用django,感興趣的朋友可以了解下
    2021-04-04
  • python 實(shí)現(xiàn)控制鼠標(biāo)鍵盤

    python 實(shí)現(xiàn)控制鼠標(biāo)鍵盤

    這篇文章主要介紹了python 控制鼠標(biāo)鍵盤的示例,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下
    2020-11-11
  • 快速了解Python相對(duì)導(dǎo)入

    快速了解Python相對(duì)導(dǎo)入

    這篇文章主要介紹了快速了解Python相對(duì)導(dǎo)入,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • python3讀取圖片并灰度化圖片的四種方法(OpenCV、PIL.Image、TensorFlow方法)總結(jié)

    python3讀取圖片并灰度化圖片的四種方法(OpenCV、PIL.Image、TensorFlow方法)總結(jié)

    這篇文章主要介紹了python3讀取圖片并灰度化圖片的四種方法(OpenCV、PIL.Image、TensorFlow方法)總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Python中docstring(文檔字符串)用法示例詳解

    Python中docstring(文檔字符串)用法示例詳解

    這篇文章主要介紹了Python中docstring(文檔字符串)用法的相關(guān)資料,文檔字符串(docstring)是 Python 提供的一種標(biāo)準(zhǔn)化方式,用于為模塊、類、函數(shù)或方法添加說(shuō)明性文字,是代碼自解釋性的重要體現(xiàn),需要的朋友可以參考下
    2025-10-10
  • python使用庫(kù)爬取m3u8文件的示例

    python使用庫(kù)爬取m3u8文件的示例

    本文主要介紹了python使用庫(kù)爬取m3u8文件的示例,可以使用requests、m3u8、ffmpeg等庫(kù),實(shí)現(xiàn)獲取、解析、下載視頻片段并合并等步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-06-06
  • 一文詳解NumPy數(shù)組迭代與合并

    一文詳解NumPy數(shù)組迭代與合并

    NumPy?數(shù)組迭代是訪問(wèn)和處理數(shù)組元素的重要方法,它允許您逐個(gè)或成組地遍歷數(shù)組元素,NumPy?提供了多種函數(shù)來(lái)合并數(shù)組,用于將多個(gè)數(shù)組的內(nèi)容連接成一個(gè)新數(shù)組,本文給大家詳細(xì)介紹了NumPy數(shù)組迭代與合并,需要的朋友可以參考下
    2024-05-05

最新評(píng)論

琼结县| 宕昌县| 太仓市| 陇西县| 临桂县| 富民县| 花莲县| 隆安县| 纳雍县| 镇安县| 禄劝| 深州市| 德化县| 启东市| 新昌县| 涿州市| 庄河市| 大宁县| 英吉沙县| 泊头市| 美姑县| 苍山县| 察隅县| 泰安市| 松潘县| 肇东市| 惠东县| 石屏县| 福安市| 巴青县| 徐汇区| 东台市| 根河市| 神池县| 临邑县| 亳州市| 兖州市| 渝中区| 松潘县| 吉隆县| 叙永县|