国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 用Python寫一個無界面的2048小游戲

用Python寫一個無界面的2048小游戲

2020-08-23 13:58赤木晴子夢 Python

這篇文章主要介紹了用Python寫一個無界面的2048小游戲的相關(guān)資料,需要的朋友可以參考下

以前游戲2048火的時候,正好用其他的語言編寫了一個,現(xiàn)在學(xué)習(xí)python,正好想起來,便決定用python寫一個2048,由于沒學(xué)過python里面的界面編程,所以寫了一個極其簡單的無界面2048。游戲2048的原理和實(shí)現(xiàn)都不難,正好可以拿來練手,要是不知道這游戲的話,可以去網(wǎng)上查一下,或者下載一個到手機(jī)來玩一下,我就不在說其原理。我知道不放圖的話大家一點(diǎn)興趣都沒,下面首先放一張游戲成型圖,然后我們在來講如何一步步用最基礎(chǔ)的知識來實(shí)現(xiàn)。

用Python寫一個無界面的2048小游戲

一、生成4*4的矩陣

  游戲的第一步便是生成一個4*4的矩陣,當(dāng)作我們游戲的主界面,其實(shí)說起來也比較簡單,這里用了最原始的方法,直接用

print將其打印出來。首先我們要生成一個全為0的4*4二維列表,然后用一些類似  '┌ ├└,┤,┘┐│,─,┬,┴'這樣的字符來組成我們的邊框,下面來看一下代碼的實(shí)現(xiàn)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
matix=[[ for i in range()] for i in range()]    # 用列表推導(dǎo)式初始化生成一個*的列表,列表元素全為
# notzero函數(shù)的作用:游戲界面上非零的時候才顯示,當(dāng)為的時候,讓其顯示空,
def notzero(s):                   
  return s if s!= else ''             # 非零的話返回本身,否則返回 ''
def display():                        # 顯示界面函數(shù),用┌ ├└,┤,┘┐│,─,┬,┴ 等顯示邊框,中間顯示*矩陣?yán)锏牡脑?/code>
  print("\r\
┌──┬──┬──┬──┐\n\
%s│%s│%s│%s│\n\
├──┬──┬──┬──┤\n\
%s│%s│%s│%s│\n\
├──┬──┬──┬──┤\n\
%s│%s│%s│%s│\n\
├──┬──┬──┬──┤\n\
%s│%s│%s│%s│\n\
└──┴──┴──┴──┘"\
%(notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),\
 notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),\
 notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),notzero(matix[][]), \
 notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),notzero(matix[][]),)
     )
display()

  來看一下上面代碼的效果,是不是感覺一個游戲的框架已經(jīng)到搭好了,由于初始化的時候,矩陣元素都為零,下面的圖也就沒有顯示出0,是不是很簡單,一個游戲的界面就被我們搭好了,不過畢竟沒學(xué)過界面,所以大家就不要抱怨這界面有多么丑了哈。

用Python寫一個無界面的2048小游戲        

二、初始化生成隨機(jī)數(shù)

這個游戲每次開始的時候都會隨機(jī)在上面的一個矩陣中生成兩個隨機(jī)數(shù)2或4,那么我們要如何來實(shí)現(xiàn)在上面矩陣中隨機(jī)的一個位置生成一個隨機(jī)數(shù)2或4了,當(dāng)然是用到我們前面學(xué)過的random模塊以及divmod(),下面我們就來看一下如何用random模塊實(shí)現(xiàn)著一功能。

?
1
2
3
4
5
6
7
8
9
10
11
12
def init():                      # 初始化矩陣
  initNumFlag =
  while :
    k = if random.randrange(, ) > else  # 當(dāng)生成隨機(jī)數(shù)大于的時候k=否則k= 生成和的概率為:
    s = divmod(random.randrange(, ), )    # 生成矩陣初始化的下標(biāo) 比如divmod(,)的話,s為(,)正好可以作為矩陣下標(biāo)
    if matix[s[]][s[]] == :          # 只有當(dāng)其值不為的時候才賦值,避免第二個值重復(fù)
      matix[s[]][s[]] = k
      initNumFlag +=
      if initNumFlag == :           # 當(dāng)initNumFlag== 的話表示矩陣?yán)飪蓚€隨機(jī)數(shù)都已經(jīng)生成了,退出循環(huán)
        break
init()
display( )

  來看一下上面代碼的效果,是不是已經(jīng)在兩個隨機(jī)的位置生成了兩個數(shù),如果大家有時間的試一下,可以看見每次執(zhí)行的時候,出現(xiàn)在矩陣上面位置不一樣,而且每次出現(xiàn)的數(shù)也不一樣,因?yàn)槲疑厦嬖O(shè)置了出現(xiàn)2:4的概率為9:1所以大多時候出現(xiàn)2,這也是游戲的需要。到了這里矩陣已經(jīng)可以動起來了,游戲的功能也可以說完成了一半。

用Python寫一個無界面的2048小游戲

三、游戲邏輯部分實(shí)現(xiàn)

   如果玩過這游戲的話就知道,游戲中每次向上下左右移動的時候,比如像下移動的話,所有的數(shù)都會向下移動,碰到相同的數(shù),就會成一個新的數(shù),比如2和2碰到的話,就會生成4,然后再隨機(jī)在其他位置生成一個2或4 ,同理4和4碰到的話也會生成8,直到合成了2048游戲就算成功了,或者說矩陣中的數(shù)字都不能移動那就是Game Over。當(dāng)然我們在手機(jī)上玩游戲的話,隨便滑動一下,所有的數(shù)字就可以向其中一個方向滑動,但是這里沒有界面,條件比較艱苦,所以只能從控制臺讀入用戶輸入的字母,然后一個個來判斷是向哪里移動了,所以我們要寫4個函數(shù)來分別處理用戶的上下左右移動,讓后一個函數(shù)處理在每次用戶移動后,如何添加一個隨機(jī)數(shù),下面先寫一段偽代碼來解釋流程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def addRandomNum():            #每次移動后隨機(jī)在矩陣中在生成一個數(shù)
  pass        
def moveDown():              #向上移動的處理函數(shù)
  pass<br>  addRandomNum()             #移動處理完成后,隨機(jī)生成一個數(shù)
def moveLeft():               #向左移動的處理函數(shù)
  pass
  addRandomNum()
def moveUp():                #向上移動的處理函數(shù)
  pass
  addRandomNum()
def moveRight():              #向右移動的處理函數(shù)
  pass
  addRandomNum()
def main():
  while flag:                          #定義一個死循環(huán),不斷讀入用戶的輸入,然后在做判斷,看是向哪里移動
    d = input(' (↑:w) (↓:s) (←:a) (→:d),q(uit) :“)
    if d == 'a':
      moveLeft()
    elif d == 's':
      moveDown()
    elif d == 'w':
      moveUp()
    elif d == 'd':
      moveRight()
    elif d == 'q':
      break
    else:
      pass

上面是一段為了理解的偽代碼,下面我們來看一下如何實(shí)現(xiàn)移動處理函數(shù),這里是整個游戲中最難處理的部分,完成了這一部分的話,整個游戲也就基本上實(shí)現(xiàn)了,這里我以向下的移動處理函數(shù)為例,其他的都一樣,當(dāng)用戶輸入向下移動的時候,所有的數(shù)字都向下移動,如果碰到相同的數(shù)字要和并,有數(shù)字的方塊向沒有數(shù)字的方塊移動。這里需要用循環(huán)實(shí)現(xiàn),有4列所以最外層的循環(huán)有4次,每一列里面又需要循環(huán)處理,下面來看一下具體怎么實(shí)現(xiàn),

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def addRandomNum():                        # 跟初始化生成隨機(jī)數(shù)一樣,只不過這里只是生成一個隨機(jī)數(shù)
  while :
    k = if random.randrange(, ) > else
    s = divmod(random.randrange(, ), )
    if matix[s[]][s[]] == :
      matix[s[]][s[]] = k
      break
  display()                           # 隨機(jī)數(shù)添加完成后就直接調(diào)用顯示函數(shù),直接顯示一下游戲界面
def moveDown():                                #處理向下移動的函數(shù)
  for i in range():                            #外層次循環(huán)處理例,內(nèi)層兩個層循環(huán),來處理相鄰的兩個數(shù)
    for j in range(, , -):
      for k in range(j - , -, -):
        if matix[k][i] > :                    # 從最下面的數(shù)開始處理相鄰的兩個數(shù)
          if matix[j][i] == :
            matix[j][i] = matix[k][i]            # 如果下面的數(shù)為空,上面的數(shù)字不為空就移動上面的數(shù)為下面的數(shù)
            matix[k][i] =
          elif matix[j][i] == matix[k][i]:          # 如果相鄰的兩個數(shù)相等的話,就和并,并把上面的輸置零,下面的數(shù)變成兩倍
            matix[j][i] *=
            matix[k][i] =
          break
  addRandomNum()                              # 移動完成后再隨機(jī)生成一個數(shù)

寫完了向下移動的處理函數(shù),那么向其他方向的移動函數(shù)也一樣,照著寫,就可以,到這里游戲中最難的部分就完成,可以說勝利就在眼前了,好了在這之前,我們還需要處理一下其他問題,那就是每次移動后都要檢查,游戲是不是Game Over了,還有就是定義一個變量來紀(jì)錄分?jǐn)?shù)了,這些實(shí)現(xiàn)起來都比較簡單。

四、游戲紀(jì)錄分?jǐn)?shù)和檢查游戲是否結(jié)束

  游戲結(jié)束的標(biāo)志是矩陣中所有的數(shù)都不為0,而且所有相鄰的數(shù)都不能合并,根據(jù)這個我們就可以來寫一個函數(shù)來判斷游戲是否GG,至于分?jǐn)?shù)紀(jì)錄,我們只需定義一個變量,然后每次有何并的時候,就加上一定的分?jǐn)?shù)即可。下面我們來看檢查函數(shù)的實(shí)現(xiàn)。

?
1
2
3
4
5
6
7
def check():            
  for i in range(4):        #按每一排循環(huán)4 次
    for j in range(3):      # 如果矩陣中有0存在,或者有相鄰的數(shù)就表示游戲還可以繼續(xù)經(jīng)行,否則就是GG
      if matix[i][j] == 0 or matix[i][j] == matix[i][j + 1] or matix[j][i] == matix[j + 1][i]:
        return True
  else:
    return False

五、完整游戲源碼  

  完成了上面的部分,整個游戲的過程就實(shí)現(xiàn)了,下面附上整個游戲的源碼。游戲還有很多不夠完善的地方,比如說游戲中如果出現(xiàn)2048的話,就表示玩家勝利,游戲結(jié)束,但是我這里沒有做處理,所以這個游戲可以一直玩到4096....沒有結(jié)束,除非你游戲中GG了,要處理也很簡單,還可以將矩陣存在文件中,完成一個游戲存檔的功能。有興趣的話大家去實(shí)現(xiàn)一下。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import random
score = 0                         # 紀(jì)錄游戲的分?jǐn)?shù)
matix = [[0 for i in range(4)] for i in range(4)] # 初始化生成一個4*4的列表
def notzero(s):
  return s if s != 0 else ''
def display():
  print("\r\
     ┌──┬──┬──┬──┐\n\
     %4s%4s%4s%4s│\n\
     ├──┬──┬──┬──┤\n\
     %4s%4s%4s%4s│\n\
     ├──┬──┬──┬──┤\n\
     %4s%4s%4s%4s│\n\
     ├──┬──┬──┬──┤\n\
     %4s%4s%4s%4s│\n\
     └──┴──┴──┴──┘" \
     % (notzero(matix[0][0]), notzero(matix[0][1]), notzero(matix[0][2]), notzero(matix[0][3]), \
       notzero(matix[1][0]), notzero(matix[1][1]), notzero(matix[1][2]), notzero(matix[1][3]), \
       notzero(matix[2][0]), notzero(matix[2][1]), notzero(matix[2][2]), notzero(matix[2][3]), \
       notzero(matix[3][0]), notzero(matix[3][1]), notzero(matix[3][2]), notzero(matix[3][3]),)
     )
def init():                               # 初始化矩陣
  initNumFlag = 0
  while 1:
    k = 2 if random.randrange(0, 10) > 1 else 4       # 隨機(jī)生成 2 或 4
    s = divmod(random.randrange(0, 16), 4)          # 生成矩陣初始化的下標(biāo)
    if matix[s[0]][s[1]] == 0:                  # 只有當(dāng)其值不為0的時候才賦值,避免第二個值重復(fù)
      matix[s[0]][s[1]] = k
      initNumFlag += 1
      if initNumFlag == 2:
        break
  display()
def addRandomNum():                        #處理完移動后添加一個新的隨機(jī)數(shù)
  while 1:
    k = 2 if random.randrange(0, 10) > 1 else 4
    s = divmod(random.randrange(0, 16), 4)
    if matix[s[0]][s[1]] == 0:
      matix[s[0]][s[1]] = k
      break
  display()
def check():                            #檢查游戲是否GG
  for i in range(4):
    for j in range(3):
      if matix[i][j] == 0 or matix[i][j] == matix[i][j + 1] or matix[j][i] == matix[j + 1][i]:
        return True
  else:
    return False
def moveRight():                         # 向右移動處理函數(shù)
  global score
  for i in range(4):
    for j in range(3, 0, -1):
      for k in range(j - 1, -1, -1):
        if matix[i][k] > 0:
          if matix[i][j] == 0:
            matix[i][j] = matix[i][k]
            matix[i][k] = 0
          elif matix[i][j] == matix[i][k]:
            matix[i][j] *= 2
            score += matix[i][j]       #將當(dāng)前數(shù)作為score加上
            matix[i][k] = 0
          break
  addRandomNum()
def moveUp():
  global score
  for i in range(4):
    for j in range(3):
      for k in range(j + 1, 4):
        if matix[k][i] > 0:
          if matix[j][i] == 0:
            matix[j][i] = matix[k][i]
            matix[k][i] = 0
          elif matix[k][i] == matix[j][i]:
            matix[j][i] *= 2
            score += matix[j][i]
            matix[k][i] = 0
          break
  addRandomNum()
def moveDown():
  global score
  for i in range(4):
    for j in range(3, 0, -1):
      for k in range(j - 1, -1, -1):
        if matix[k][i] > 0:
          if matix[j][i] == 0:
            matix[j][i] = matix[k][i]
            matix[k][i] = 0
          elif matix[j][i] == matix[k][i]:
            matix[j][i] *= 2
            score += matix[j][i]
            matix[k][i] = 0
          break
  addRandomNum()
def moveLeft():
  global score
  for i in range(4):
    for j in range(3):
      for k in range(1 + j, 4):
        if matix[i][k] > 0:
          if matix[i][j] == 0:
            matix[i][j] = matix[i][k]
            matix[i][k] = 0
          elif matix[i][j] == matix[i][k]:
            matix[i][j] *= 2
            score += matix[i][j]
            matix[i][k] = 0
          break
  addRandomNum()
def main():
  print("    \033[33;1mWelcome to the Game of 2048!\033[0m")
  flag = True
  init()
  while flag:                                    #循環(huán)的標(biāo)志
    print('        \033[33;1m You Score:%s\033[0m' % (score))
    d = input('\033[33;1m (↑:w) (↓:s) (←:a) (→:d),q(uit) :\033[0m'#不斷處理用戶輸入
    if d == 'a':                                  
      moveLeft()
      if not check():                             #檢查游戲是否GG
        print('GG')
        flag = False                             #GG的話直接退出
    elif d == 's':
      moveDown()
      if not check():
        print('GG')
        flag = False
    elif d == 'w':
      moveUp()
      if not check():
        print('GG')
        flag = False
    elif d == 'd':
      moveRight()
      if not check():
        print('GG')
        flag = False
    elif d == 'q':                          # 退出
      break
    else:                                # 對用戶的其他輸入不做處理
      pass
if __name__ == '__main__':
  main()

最后在附上一張圖片最為結(jié)束

 用Python寫一個無界面的2048小游戲  

以上所述是小編給大家介紹的用Python寫一個無界面的2048小游戲,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對服務(wù)器之家網(wǎng)站的支持!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 午夜精品一区二区三区在线播放 | 九九在线精品视频 | 麻豆一区二区三区 | 亚洲一区成人在线观看 | 国产精品亚洲视频 | 久久久小视频 | 国产精品美女久久久久久久久久久 | 午夜国产精品视频 | 国产精品高清在线观看 | 欧美日韩国产一区二区三区在线观看 | 久久久久久久av | www.中文字幕 | 欧美成人精品一区二区三区在线看 | 亚洲精品乱码久久久久久金桔影视 | 国产高清视频 | 国产精品99久久免费观看 | 日韩精品在线观看视频 | 自拍第1页| 国产精品福利视频 | 亚洲免费观看视频 | 亚洲欧美精品一区二区 | 国产精品久久久久久久 | 国产高清一区二区 | 蜜桃视频一区二区三区 | 久久精品91 | 欧美大片免费高清观看 | 韩日一区 | 欧美成人免费在线视频 | 午夜免费av| 国产精品久久99 | 亚洲精品久久久久久国产精华液 | 国产一区中文字幕 | 亚洲国产成人av | 毛片网站大全 | 色视频www在线播放国产人成 | 日韩中文字幕在线观看 | 免费一区二区三区 | 国产激情精品一区二区三区 | 久久精品国产免费 | 91综合在线观看 | 精品一区电影 |