1. 程式人生 > >貪吃蛇“大作戰”(一)

貪吃蛇“大作戰”(一)

com 我們 清除 令行 初始 長大 log ont 動作

  前兩天在博客園看到一個基於Qpython 的貪吃蛇遊戲的代碼,有點好奇貪吃蛇怎麽用Python簡單實現,就開始對這個程序代碼進行分析。下面是我轉載自sunny開始學壞的代碼:

 1 import os,random
 2 sw=[[5,5]]
 3 #lc=[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6]]
 4 lc=[[5,i] for i in range(10)]
 5 s=‘‘
 6 for x in range(500):
 7   w=len(lc)-1
 8   li = [([] * 20) for i in range(20)]
 9   a=input(
請輸入wasd控制:) 10 if a==‘‘11 a=s 12 if a==w13 lc.append([lc[w][0]-1,lc[w][1]]) 14 del lc[0] 15 s=w 16 if a==s17 lc.append([lc[w][0]+1,lc[w][1]]) 18 del lc[0] 19 s=s 20 if a==a21 lc.append([lc[w][0],lc[w][1]-1]) 22 del lc[0] 23 s=
a 24 if a==d25 lc.append([lc[w][0],lc[w][1]+1]) 26 del lc[0] 27 s=d 28 if lc[w] in sw: 29 lc.insert(0,[lc[0][0],lc[0][1]-1]) 30 del sw[0] 31 sw.append([random.randint(0,19),random.randint(0,19)]) 32 for i in lc:li[i[0]][i[1]]= 33 for w in sw:li[w[0]][w[1]]=
34 os.system(clear) 35 for i in li:print(‘‘.join(i))

  以下,我會根據我所理解地,以行號為索引來逐行對上面的代碼進行一個說明:

  行號1:導入Python中的os模塊和random模塊,這兩個都是安裝Python時自帶的模塊,在該程序中要用到這兩個模塊

  行號2:通讀完整個程序了解到列表sw存儲的是果實(貪吃蛇的目標,吃了果實,貪吃蛇會長大變長)的橫縱坐標位置

  行號3:程序註解,看行號4的解釋

  行號4:我們可以將貪吃蛇的整個身體看成N個點的組合(分成N個部分,和積分的原理類似),把各個點的坐標位置相結合可以得到貪吃蛇的身體信息和位置信息;該行采用列表推導式得到貪吃蛇的初始信息lc(lc=[[5,0],[5,1],[5,2],...,[5,9]],初始的貪吃蛇信息為:身長10,頭部坐標[5,9],尾部坐標[5,0])

  行號5:對象s用於存儲貪吃蛇的前進方向信息,即wsad(上下左右)信息(對象s存儲的信息在後面並沒有用到)

  行號6:用於控制貪吃蛇的前進次數,總共可前進500次

  行號7:每次前進前,獲取貪吃蛇頭部點的坐標索引值,即頭部點在lc列表中的索引

  行號8:采用列表推導式得到列表li,利用列表li的‘o’字符模擬供貪吃蛇行走的地圖(背景)

  行號9:等待外部命令,控制貪吃蛇每次前進的方向,以此來控制貪吃蛇成功吃到果實

  行號10、11:判斷外部命令,若外部無前進方向命令,則不進行操作

  行號12、13:判斷外部命令,若外部命令為(w)向上,則為列表lc新增一個頭部點,原頭部點降到第二次序;新增頭部點的坐標為原頭部點的橫坐標-1後的坐標,其縱坐標不變,以此來實現貪吃蛇向上的動作。(此時貪吃蛇的身體長度也+1了)

  行號14:刪除列表lc的第一個點[5,0],即將貪吃蛇的尾部點[5,0]去除,使貪吃蛇的身體總長保持不變(貪吃蛇只有在吃到果實後才能長大變長)

  行號15:將貪吃蛇此次的前進信息存儲在對象s中

  行號16-19:與行號12-15的釋義相同,只貪吃蛇的前進方向為向下

  行號20-23:與行號12-15的釋義相同,只貪吃蛇的前進方向為向左,lc新增頭部點變化的坐標為縱坐標

  行號24-27:與行號12-15的釋義相同,只貪吃蛇的前進方向為向右,lc新增頭部點變化的坐標為縱坐標

  行號28:判斷貪吃蛇的頭部坐標是否與果實坐標重合,即貪吃蛇是否吃到果實

  行號29:若貪吃蛇遲到果實,則在lc的尾部插入一個新的點,新的點的坐標與原尾部坐標相比:橫坐標不變,縱坐標-1;此時貪吃蛇長大了,身體長度+1

  行號30:刪除果實的坐標信息,因貪吃蛇已遲到果實,果實消失,坐標信息自然無效了

  行號31:通過隨機數randint的方式為sw新增一個果實的坐標,位置;一般(0,19)就是界定的貪吃蛇的活動範圍,果實可以在20X20的範圍內隨機出現

  行號32:通過"●"字符將貪吃蛇表現在地圖中

   行號33:通過"◆"字符將果實表現在地圖中

  行號34:清除此次貪吃蛇的“痕跡”,方便下次動作後貪吃蛇的“顯示”

  行號35:在命令行中打印(顯示)出貪吃蛇的前進動作“景象”(包括地圖和果實)

  以上,是我根據原代碼逐行做出的解釋,在之後的博客中會通過圖片更生動地對貪吃蛇的運行機制進行分析介紹,並在python中運行這段代碼,根據運行結果講解。

ps:可通過在python中對源碼逐行修改觀察運行結果的變化來更深層次的了解代碼的運行機制

貪吃蛇“大作戰”(一)