Python迷宮生成器

来源:https://www.cnblogs.com/godforever/archive/2022/07/08/16458100.html
-Advertisement-
Play Games

作為一項古老的智力游戲,千百年來迷宮都散髮著迷人的魅力。但是,手工設計迷宮費時又耗(腦)力,於是,我們有必要製作一個程式:迷宮生成器…… 好吧,我編不下去了。但是,從上面的文字中,我們可以看出,我們此次的主題是:用Python實現一個迷宮生成器。 首先展示一下效果圖: 我們先分析一下所需的庫: 既然 ...


作為一項古老的智力游戲,千百年來迷宮都散髮著迷人的魅力。但是,手工設計迷宮費時又耗(腦)力,於是,我們有必要製作一個程式:迷宮生成器……

好吧,我編不下去了。但是,從上面的文字中,我們可以看出,我們此次的主題是:用Python實現一個迷宮生成器。

首先展示一下效果圖:

我們先分析一下所需的庫:

既然是生成器,每次生成的迷宮一模一樣顯然是說不過去的。因此,我們不可避免地要使用隨機數(Random庫)。迷宮一定是要繪製的,所以需要有一個GUI庫或繪圖庫,這裡我使用Pygame(Tkinter或Turtle其實都可以做到,但畢竟Pygame比較順手)。與Pygame搭配,Sys似乎也是需要的(用於退出程式,但其實不使用似乎也無傷大雅)。然後是Tkinter.filedialog,主要用於詢問保存路徑(生成的迷宮總得保存吧)。當然,用Time加一個計時器似乎是錦上添花。

於是,就有:

#coding:utf-8
import contextlib
with contextlib.redirect_stdout(None):
    import pygame
import random
import sys
import time
from tkinter.filedialog import *

這裡要說明的是,由於導入Pygame時會輸出版本信息等很多內容(這很影響美感),我們需要使用Contextlib阻止它輸出。

接下來,我們需要詢問一些參數:

a=int(input("列數:"))
b=int(input("行數:"))
l=int(input("大小:"))
saveit=input("是否保存:")

然後,就要運行生成迷宮的程式了。同時,我們有必要計錄一下時間(相當於開啟計時器):

print("生成中...")
e = time.time()

然後就是正式生成迷宮。在介紹這部分代碼之前,我們需要瞭解一下演算法:

第一步,生成一個由迷宮單元(白格)和牆(黑格)組成的網格。一行中迷宮單元的數量為迷宮的列數,一列找迷宮單元的數量為迷宮的行數。令左上角的迷宮單元為起點,右下角的迷宮單元為終點,打破起點左邊與終點右邊的牆,如圖所示:

第二步,訪問各迷宮單元。將起點標記為當前迷宮單元,當存在未被訪問的迷宮單元(凡是曾經成為過當前迷宮單元的迷宮單元,都視為已訪問)時,重覆執行:

  • 將周圍的未被訪問的迷宮單元加入表格;
  •  如果表格中有迷宮單元:
    • 將當前迷宮單元入棧(可以理解為將其加入一個叫做棧的表格);
    • 從表格中隨機選擇一個迷宮單元;
    • 打破當前迷宮單元與選擇的迷宮單元之間的牆;
    • 將選擇的迷宮單元標記為當前迷宮單元;
  • 如果表格中沒有迷宮單元:
    • 棧頂迷宮單元出棧(可以理解為將棧中的最後一個元素獲取並刪除);
    • 將出棧的迷宮單元設為當前迷宮單元;

在迴圈結束以後,就會出現像文章開頭效果圖一樣的結果。

接下來,我們就要將文字化的演算法轉化為Python的代碼。

首先,程式是不認識圖片的,它認識的是數據。所以我們需要設置一個二維列表,以此來用一串數據表示當前的圖像。當然,我們可以順便將第一步的設置一起完成:

alist = []
aa=0
need=[]
for j in range(2*a+1):
    if aa==0:
        aa = 1
        alistone = []
        for i in range(2*b+1):
            alistone.append(1)
        alist.append(alistone)
    else:
        aa=0
        alistone = []
        bb=0
        for i in range(2*b+1):
            if bb==0:
                bb=1
                alistone.append(1)
            else:
                bb = 0
                need.append((j,i))
                alistone.append(0)
        alist.append(alistone)
alist[0][1]=0
alist[-1][-2]=0

可以看到,除此以外我們還建立了一個列表need,裡面存儲了所有的迷宮單元。它的作用就是判斷迷宮單元是否被訪問,每次訪問都會將迷宮單元從表格中刪除,當表格中沒有迷宮單元時,就說明所有迷宮單元都被訪問了。

x=1
y=1
need.remove((1, 1))
listing=[]
while len(need)>0:
    aroundit=[]
    try:
        if x-2<0:
            print(1+"1")
        alist[x-2][y]=0
        if (x-2,y) in need:
            aroundit.append("alist[x-1][y],x=(0,x-2)")
    except:
        while False:
            print()
    try:
        alist[x+2][y]=0
        if (x+2,y) in need:
            aroundit.append("alist[x+1][y],x=(0,x+2)")
    except:
        while False:
            print()
    try:
        alist[x][y+2]=0
        if (x,y+2) in need:
            aroundit.append("alist[x][y+1],y=(0,y+2)")
    except:
        while False:
            print()
    try:
        if y-2<0:
            print(1+"1")
        alist[x][y-2]=0
        if (x,y-2) in need:
            aroundit.append("alist[x][y-1],y=(0,y-2)")
    except:
        while False:
            print()
    if len(aroundit)>0:
        listing.append((x,y))
        exec(random.choice(aroundit))
        need.remove((x, y))
    else:
        x,y=listing[-1]
        listing.pop()

而這些內容,就是第二步。其演算法我已經解釋過,唯一一個微小的不同是,在此處我們並沒有在列表中加入相鄰迷宮單元的坐標,而是將其對應的破牆和標記為當前迷宮單元的代碼以字元串的形式存儲在表格中,併在隨機選擇出某個迷宮單元所對應的字元串後,使用exec將其轉換為代碼並運行(這可以節省一些代碼)。

print("完成!用時{}秒".format(time.time()-e))

列印完生成迷宮的用時後,我們需要將表格中的數據轉化為圖像了。當然,在此之前,我們要先確定圖片保存的位置。

if saveit=="1":
    ccc = askdirectory()
    h=""
    bbbbb=1
    while True:
        try:
            open("{}/{}×{}迷宮{}.png".format(ccc,a,b,h),"r")
            h="({})".format(bbbbb)
        except:
            break
        bbbbb+=1

由於使用時有可能選擇不保存圖片,因此要先判斷你的選擇是保存還是不保存。這裡字元“1”表示保存(輸入其他,自然就是不保存了)。然後我們需要讓你選擇保存路徑(askdirectory()詢問的是文件路徑,不需要選擇文件名)。然後,我們要確定文件名稱:“a×b迷宮.png”。這裡需要判斷指定路徑是否存在此名稱的文件,如果存在,則我們需要在後面加上序號。總而言之,通過這串代碼,我們已經將迷宮的路徑+文件名確定了。

pygame.init()
icon=pygame.image.load("迷宮.png")
pygame.display.set_icon(icon)
screen=pygame.display.Info()
screen = pygame.display.set_mode((l*(2*a+1),l*(2*b+1)))
pygame.display.set_caption('迷宮')
screen.fill("white")
c = pygame.Surface((l, l), flags=pygame.HWSURFACE)
c.fill(color='white')
d = pygame.Surface((l, l), flags=pygame.HWSURFACE)
d.fill(color='black')
for i in range(2*a+1):
    for j in range(2*b+1):
        if alist[i][j]==0:
            screen.blit(c, (i*l, j*l))
        elif alist[i][j]==1:
            screen.blit(d, (i*l, j*l))
pygame.display.flip()
if saveit=="1":
    pygame.image.save(screen, "{}/{}×{}迷宮{}.png".format(ccc, a, b, h))
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

代碼中使用的圖片“迷宮.png”(名稱不太對,下載以後要重新命名一下):

這裡主要是Pygame的基本設置,並將表格內容圖像化。每一個數字代表一個方塊,而數字的值則決定了方塊的顏色,數字在表格中的位置決定了方塊的位置。就這樣,我們呢將表格完全轉化成了圖像。當然,我們還需要用pygame.image.save()函數將圖像保存為圖片文件。

這樣,這個生成器似乎完成了。

它運行良好,但當迷宮比較複雜時,暴露出一個問題(下圖是100×100的迷宮):

由於正確路徑過於曲折,在複雜度較高時,這個迷宮的難度會變得極高!

難度高,在某方面上講,的確是好事。但當你向你的朋友們展示這個迷宮時,如果你自己也無法得出正確的路徑,這不是很掃興嗎?

因此,一個尋路演算法變得非常有必要。

尋路演算法的大體思路:

在生成的迷宮中,白格為路,黑格為牆。將起點設置為當前位置,重覆執行直到終點成為當前位置:

  • 將當前位置標記為正確路徑;
  • 將周圍未標記的路加入一個表格;
  • 如果表格不空:
    • 將當前位置入棧;
    • 從表格中隨機選擇一條路,並將其設為當前位置;
  • 如果表格是空的:
    • 棧頂的路出棧;
    • 將其設為當前位置;

通過這個演算法,我們可以試出正確的路徑(如圖):

代碼的實現:

x2=0
y2=1
listing2=[]
while not(alist[-1][-2]==2):
    alist[x2][y2]=3
    around2=[]
    try:
        if x2-1<0:
            print(1+"1")

        if alist[x2-1][y2]==0:
            around2.append("x2=x2-1")
    except:
        while False:
            print()
    try:

        if alist[x2+1][y2]==0:
            around2.append("x2=x2+1")
    except:
        while False:
            print()
    try:

        if alist[x2][y2+1]==0:
            around2.append("y2=y2+1")
    except:
        while False:
            print()
    try:
        if y2-1<0:
            print(1+"1")
        if alist[x2][y2-1]==0:
            around2.append("y2=y2-1")
    except:
        while False:
            print()
    if len(around2)>0:
        listing2.append((x2,y2))
        exec(random.choice(around2))
    else:
        alist[x2][y2]=2
        x2,y2=listing2[-1]
        listing2.pop()
alist[-1][-2]=3
for i in range(len(alist)):
    for j in range(len(alist[0])):
        if alist[i][j]==2:
            alist[i][j]=0

同時,圖像繪製的過程也要作出一些改動,以顯示正確路徑:

if saveit=="1":
    ccc = askdirectory()
    h=""
    bbbbb=1
    while True:
        try:
            open("{}/{}×{}迷宮{}.png".format(ccc,a,b,h),"r")
            open("{}/{}×{}迷宮(正確線路){}.png".format(ccc,a,b,h),"r")
            h="({})".format(bbbbb)
        except:
            break
        bbbbb+=1
pygame.init()
icon=pygame.image.load("迷宮.png")
pygame.display.set_icon(icon)
screen=pygame.display.Info()
screen = pygame.display.set_mode((l*(2*a+1),l*(2*b+1)))
pygame.display.set_caption('迷宮')
screen.fill("white")
if saveit=="1":
    c = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    c.fill(color='white')
    d = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    d.fill(color='black')
    f = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    f.fill(color='white')
    for i in range(2 * a + 1):
        for j in range(2 * b + 1):
            if alist[i][j] == 0:
                screen.blit(c, (i * l, j * l))
            elif alist[i][j] == 1:
                screen.blit(d, (i * l, j * l))
            else:
                screen.blit(f, (i * l, j * l))
    pygame.image.save(screen, "{}/{}×{}迷宮{}.png".format(ccc, a, b, h))
    c = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    c.fill(color='white')
    d = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    d.fill(color='black')
    f = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    f.fill(color='red')
    for i in range(2 * a + 1):
        for j in range(2 * b + 1):
            if alist[i][j] == 0:
                screen.blit(c, (i * l, j * l))
            elif alist[i][j] == 1:
                screen.blit(d, (i * l, j * l))
            else:
                screen.blit(f, (i * l, j * l))
    pygame.image.save(screen, "{}/{}×{}迷宮(正確線路){}.png".format(ccc, a, b, h))
c = pygame.Surface((l, l), flags=pygame.HWSURFACE)
c.fill(color='white')
d = pygame.Surface((l, l), flags=pygame.HWSURFACE)
d.fill(color='black')
f = pygame.Surface((l, l), flags=pygame.HWSURFACE)
f.fill(color='white')
for i in range(2*a+1):
    for j in range(2*b+1):
        if alist[i][j]==0:
            screen.blit(c, (i*l, j*l))
        elif alist[i][j]==1:
            screen.blit(d, (i*l, j*l))
        else:
            screen.blit(f,(i*l, j*l))
pygame.display.flip()
aaaaaaa = 0
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.MOUSEBUTTONDOWN:
            if aaaaaaa == 1:
                aaaaaaa = 0
                c = pygame.Surface((l, l), flags=pygame.HWSURFACE)
                c.fill(color='white')
                d = pygame.Surface((l, l), flags=pygame.HWSURFACE)
                d.fill(color='black')
                f = pygame.Surface((l, l), flags=pygame.HWSURFACE)
                f.fill(color='white')
                for i in range(2 * a + 1):
                    for j in range(2 * b + 1):
                        if alist[i][j] == 0:
                            screen.blit(c, (i * l, j * l))
                        elif alist[i][j] == 1:
                            screen.blit(d, (i * l, j * l))
                        else:
                            screen.blit(f, (i * l, j * l))
                pygame.display.flip()
            else:
                aaaaaaa = 1
                c = pygame.Surface((l, l), flags=pygame.HWSURFACE)
                c.fill(color='white')
                d = pygame.Surface((l, l), flags=pygame.HWSURFACE)
                d.fill(color='black')
                f = pygame.Surface((l, l), flags=pygame.HWSURFACE)
                f.fill(color='red')
                for i in range(2 * a + 1):
                    for j in range(2 * b + 1):
                        if alist[i][j] == 0:
                            screen.blit(c, (i * l, j * l))
                        elif alist[i][j] == 1:
                            screen.blit(d, (i * l, j * l))
                        else:
                            screen.blit(f, (i * l, j * l))
                pygame.display.flip()

通過這些改動,顯示正確路徑的效果就實現了。生成完成以後,視窗上顯示的是沒有正確路徑的迷宮,而點擊視窗後,正確的路徑就會顯示(再次點擊隱藏)。

剛剛那張100×100的迷宮,其正確路徑是:

可以看出,本文中所用的演算法生成的迷宮,其正確路徑還是非常曲折的(難度很高)。你何不將其發給你的朋友,讓其破解一下呢?

完整的代碼:

#coding:utf-8
import contextlib
with contextlib.redirect_stdout(None):
    import pygame
import random
import sys
import time
from tkinter.filedialog import *
a=int(input("列數:"))
b=int(input("行數:"))
l=int(input("大小:"))
saveit=input("是否保存:")
print("生成中...")
e = time.time()
alist = []
aa=0
need=[]
for j in range(2*a+1):
    if aa==0:
        aa = 1
        alistone = []
        for i in range(2*b+1):
            alistone.append(1)
        alist.append(alistone)
    else:
        aa=0
        alistone = []
        bb=0
        for i in range(2*b+1):
            if bb==0:
                bb=1
                alistone.append(1)
            else:
                bb = 0
                need.append((j,i))
                alistone.append(0)
        alist.append(alistone)
alist[0][1]=0
alist[-1][-2]=0
x=1
y=1
need.remove((1, 1))
listing=[]
while len(need)>0:
    aroundit=[]
    try:
        if x-2<0:
            print(1+"1")
        alist[x-2][y]=0
        if (x-2,y) in need:
            aroundit.append("alist[x-1][y],x=(0,x-2)")
    except:
        while False:
            print()
    try:
        alist[x+2][y]=0
        if (x+2,y) in need:
            aroundit.append("alist[x+1][y],x=(0,x+2)")
    except:
        while False:
            print()
    try:
        alist[x][y+2]=0
        if (x,y+2) in need:
            aroundit.append("alist[x][y+1],y=(0,y+2)")
    except:
        while False:
            print()
    try:
        if y-2<0:
            print(1+"1")
        alist[x][y-2]=0
        if (x,y-2) in need:
            aroundit.append("alist[x][y-1],y=(0,y-2)")
    except:
        while False:
            print()
    if len(aroundit)>0:
        listing.append((x,y))
        exec(random.choice(aroundit))
        need.remove((x, y))
    else:
        x,y=listing[-1]
        listing.pop()
x2=0
y2=1
listing2=[]
while not(alist[-1][-2]==2):
    alist[x2][y2]=3
    around2=[]
    try:
        if x2-1<0:
            print(1+"1")

        if alist[x2-1][y2]==0:
            around2.append("x2=x2-1")
    except:
        while False:
            print()
    try:

        if alist[x2+1][y2]==0:
            around2.append("x2=x2+1")
    except:
        while False:
            print()
    try:

        if alist[x2][y2+1]==0:
            around2.append("y2=y2+1")
    except:
        while False:
            print()
    try:
        if y2-1<0:
            print(1+"1")
        if alist[x2][y2-1]==0:
            around2.append("y2=y2-1")
    except:
        while False:
            print()
    if len(around2)>0:
        listing2.append((x2,y2))
        exec(random.choice(around2))
    else:
        alist[x2][y2]=2
        x2,y2=listing2[-1]
        listing2.pop()
alist[-1][-2]=3
for i in range(len(alist)):
    for j in range(len(alist[0])):
        if alist[i][j]==2:
            alist[i][j]=0
print("完成!用時{}秒".format(time.time()-e))
if saveit=="1":
    ccc = askdirectory()
    h=""
    bbbbb=1
    while True:
        try:
            open("{}/{}×{}迷宮{}.png".format(ccc,a,b,h),"r")
            open("{}/{}×{}迷宮(正確線路){}.png".format(ccc,a,b,h),"r")
            h="({})".format(bbbbb)
        except:
            break
        bbbbb+=1
pygame.init()
icon=pygame.image.load("迷宮.png")
pygame.display.set_icon(icon)
screen=pygame.display.Info()
screen = pygame.display.set_mode((l*(2*a+1),l*(2*b+1)))
pygame.display.set_caption('迷宮')
screen.fill("white")
if saveit=="1":
    c = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    c.fill(color='white')
    d = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    d.fill(color='black')
    f = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    f.fill(color='white')
    for i in range(2 * a + 1):
        for j in range(2 * b + 1):
            if alist[i][j] == 0:
                screen.blit(c, (i * l, j * l))
            elif alist[i][j] == 1:
                screen.blit(d, (i * l, j * l))
            else:
                screen.blit(f, (i * l, j * l))
    pygame.image.save(screen, "{}/{}×{}迷宮{}.png".format(ccc, a, b, h))
    c = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    c.fill(color='white')
    d = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    d.fill(color='black')
    f = pygame.Surface((l, l), flags=pygame.HWSURFACE)
    f.fill(color='red')
    for i in range(2 * a + 1):
        for j in range(2 * b + 1):
            if
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 線程簡介 程式:程式時指令和數據的有序集合,其本身沒有任何運行的含義,是一個靜態的概念 進程:執行程式的一次執行過程,或是正在運行的一個程式,是一個動態的過程。由它自身的產生、存在和消亡的過程 線程是由進程創建的,是進程的一個實體。通常在一個進程中可以包含若幹個線程,當然一個進程中至少有一個線 ...
  • 日期時間的處理,是軟體開發中極其常見的場景,JAVA中與日期、時間相關的一些類與API方法也很多,這裡結合平時的編碼實踐全面的整理了下,希望可以幫助大家釐清其中的門道,更加游刃有餘的面對此方面的處理~ ...
  • 1.許可權管理-用戶管理-高級搜索-手機號搜索不可用 1.1現象 1.2解決思路 1.2.1 定位介面 介面名:system/user/list 請求方式:GET請求 1.2.3 確定bug所在位置 bug定位:在執行查詢的sql處,沒有添加手機號搜索的條件 此處沒有根據phone進行搜索 1.2.4 ...
  • python可視化案例,包含:條形圖、環形圖、折線圖、堆疊柱形圖、詞雲圖等。 ...
  • 由於網上搜索 PowerJob MapReduce 都是設計原理,demo也展示個空殼子,沒有演示Map到Reduce結果怎麼傳遞,對於沒有MR開發經驗的人來說並沒有什麼幫助,所以這裡寫了一個有完整計算意義的demo供參考。 代碼功能: 實現一個sum累加。 任務輸入參數: batchSize=10 ...
  • 因為webman是常駐記憶體框架 當前進程初始化一次後就不會再初始化了 所以構造函數里傳遞request是不好用的。 這裡使用中間件來代替 瞭解中間件: 中間件一般用於攔截請求或者響應。例如執行控制器前統一驗證用戶身份,如用戶未登錄時跳轉到登錄頁面。例如響應中增加某個header頭。例如統計某個uri ...
  • 數組 java數組是一個容器,保存著一組值,當數組創建之後,數組的的長度就固定了。 1.數組的定義 1.聲明數組 int array=null; 聲明瞭數組之後,數組是空的,沒什麼實際意義 2.創建數組 ​ array=new[10]; 3.給元素中數組賦值 array[0]=0; 註:數組的下標是 ...
  • lab1 要求按照論文實現一個mapReduce 框架 lab1 :https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 論文:https://zhuanlan.zhihu.com/p/122571315 在mrsequential.go文件中有個單機版 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...