iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
1
自我挑戰組

程式設計師大冒險系列 第 21

[21/150]踩地雷(Python)10189 - Minesweeper

有玩過踩地雷嗎?今天來挑戰踩地雷遊戲製作,首先要了解後端資料庫數據運作。


大綱


10189 - Minesweeper


程式碼講解

#測試程式
import sys 

def test(fun):
    if(fun=="inp"):#def inp()開關
        return 0
    elif(fun=="swee"):#def swee()開關
        return 0

測試系統
這是方便你觀看程式運作過程
但是輸出會需要依照題目規定

def inp():
    sinp=sys.stdin.readline()
    sinp=sinp.replace("\n","")
    fiect=1
    #測資讀入
    while(sinp!="0 0"):
        hei,wei=map(int,sinp.split())#地圖高跟寬
        if(test("inp")):print(hei,wei)
        #地圖讀入
        swmap=[]
        for i in range(hei):
            sinp=sys.stdin.readline()
            sinp=sinp.replace("\n","").replace(".","0") 
            swmap.append(list(sinp))
            if(test("inp")):print(sinp)
        if(test("inp")):print(swmap)
        print("Field #%d:"%fiect)
        fiect+=1
        swee(swmap,hei,wei)
        sinp=sys.stdin.readline()
        sinp=sinp.replace("\n","")

測資讀取

#主程式
def swee(st,h,w):
#這邊做預處理,如果地雷的鄰居也是地雷,鄰居不變。("*":"*")
#如果鄰居是數字,那麼加一處理
    swst={"*":"*","0":"1","1":"2","2":"3","3":"4","4":"5","5":"6","6":"7","7":"8","8":"8"}
    for j in range(h):
        for i in range(w):
            if(st[j][i]=="*"):
                for sti in range(-1,2,1):
                    for stj in range(-1,2,1):
                        if(((sti+j)in range(h))&((stj+i)in range(w))):
                            st[sti+j][stj+i]=swst.get(st[sti+j][stj+i])
#答案輸出                            
    for sth in range(h):
        for stw in range(w):
            print("%s"%st[sth][stw],end="")
        print("")
    print("")
        
inp()    

總結

剛開始會因為陣列索引超出範圍,產生編譯錯誤。
後來先判斷索引值範圍,再做處理。

其實我蠻想圖片解說題目,然後講解程式碼運作。
下一題開始,會嘗試上下篇做解說。
感謝撥冗閱讀,下期再見。


上一篇
[20/150]排序解題(Python)之九乘九乘法迴圈進階299-Train Swapping
下一篇
[22/150]第四週學習總結
系列文
程式設計師大冒險115
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言