亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

使用python實現簡單五子棋游戲

系統 1750 0

用python實現五子棋簡單人機模式的練習過程,供大家參考,具體內容如下

第一次寫博客,我盡力把它寫好。

最近在初學python,今天就用自己的一些粗淺理解,來記錄一下這幾天的python簡單人機五子棋游戲的練習,下面是實現過程的理解(是在cmd中運行的):

主要流程: *重點內容*

- 首先是模塊及類的劃分
- 棋子類和棋盤類的方法
- 對策略類里的功能進行細分,調用棋子類和棋盤類
- 寫出判斷輸贏的方法
- 用main函數進行整個游戲進度的控制

模塊及類的劃分

類的劃分涉及到了面向對象的內容,根據五子棋游戲的設定,人和機器依次在一個棋盤里下棋,一方五子連線為贏,初步分為 棋子類、棋盤類 策略類 ,每個類單獨放一個模塊,加上main模塊一共四個模塊。

  • 棋子類包含棋子的坐標和棋子顏色(陣營),及相關get、set方法
  • 棋盤類包含了棋盤的大小和棋盤的狀態 ,及相關get、set方法
  • 棋盤類的功能:接收要放入的棋子,清空棋盤,打印(顯示)棋盤,給出對應位置的狀態
  • 策略類:一個策略類對應一個棋盤類,在構造器里導入一個棋盤類
  • 策略類的功能:人把棋子放入棋盤、機器把棋子放入棋盤、判斷棋局的輸贏

棋子類和棋盤類

棋子類 比較簡單,在棋子的角度,只要接收位置和顏色(陣營),傳出位置和顏色(陣營)即可,其中位置用元組打包傳遞

            
class Chessman(object):
 #初始化
 def __init__(self):
 pass

 def set_pos(self,pos):
 self.pos = pos

 def get_pos(self):
 return self.pos

 def set_color(self,color):
 self.color = color

 def get_color(self):
 return self.color
          

棋盤類 需要用到棋子類,在這之前,先要進行棋盤的設定
在這里棋盤是用列表來構建,分為兩層,實現x,y的位置,棋盤大小設為類屬性

            
#類屬性
 board_size =15
#初始化棋盤
 def __init__(self):
 self.__board = [[0 for i in range(0,Chessboard.board_size+1)] for j in range(0,Chessboard.board_size+1)]
          

清空棋盤類似

            
#清空棋盤,‘+'為棋盤的樣子
def init_board(self):
 #忽略第0行
 for i in range(1,Chessboard.board_size+1):
 for j in range(1,Chessboard.board_size+1):
  self.__board[i][j] = '+'
          

打印也差不多,注意在坐標軸旁放上序列號,這里縱坐標為1-15,橫坐標為a-o

            
# 打印棋盤
 def print_board(self):
 #打印列號
 print(' ', end='')
 for i in range(1,Chessboard.board_size+1):
  c = chr(ord('a') + i-1) # ord 字母轉ASCLL碼
  print(c,end='')
 print()
 #棋盤
 for i in range(1,Chessboard.board_size+1):
  if 1<= i <=9:
  print(' ', end='')
  print(i, end='')
  for j in range(1,Chessboard.board_size+1):
  print(self.__board[i][j], end='')
  print()
          

效果為如下

使用python實現簡單五子棋游戲_第1張圖片

接下來是棋子的放入:

這個可分為兩個方法,一個根據傳入的位置放置傳入的顏色;另一個接收一個棋子類的實例對象,獲取該實例的位置和顏色,調用第一個方法并傳入數值,一定要注意在傳參的時候驗證

            
#寫入對應位置的顏色
 def set_chess(self,pos, color):
 if not isinstance(pos,tuple):
  raise RuntimeError('第一個參數必須為元組')
 if pos[0] <= 0 or pos[0] > Chessboard.board_size:
  raise RuntimeError('行下標越界')
 if pos[1] <=0 or pos[1] > Chessboard.board_size:
  raise RuntimeError('縱下標越界')
 self.__board[pos[0]][pos[1]] = color 

 #把棋子對象擺放到棋盤上 
 def set_chessman(self,chessman):
 if not isinstance(chessman, Chessman):
  raise RuntimeError('類型不對,第一個參數應為ChessMan對象')
 pos = chessman.get_pos()
 color = chessman.get_color()
 self.set_chess(pos,color)


          

接下來的根據棋盤位置獲取棋子顏色的方法主要是為了策略類的判定輸贏準備的

            
#根據棋盤位置獲取棋子的顏色
 def get_chess(self,pos):
 if pos[0] <= 0 or pos[0] > Chessboard.board_size:
  raise RuntimeError('行下標越界')
 if pos[1] <=0 or pos[1] > Chessboard.board_size:
  raise RuntimeError('縱下標越界')
 return self.__board[pos[0]][pos[1]]
          

策略類

策略類要用到前面兩類,有更多名稱的方法或屬性的要用,所以要更仔細一點搞清楚哪個是哪個
首先傳入一個棋盤實例對象

            
#初始化要把棋盤對象傳入
 def __init__(self,chessboard):
 self.__chessboard = chessboard
          

人下棋:策略類負責把人輸入的東西字符串變成x,y坐標,寫入棋子對象

            
def parse_user_input(self,input,chessman):
 if not isinstance(chessman,Chessman):
  raise RuntimeError('類型不對,第一個參數必須為Chessman對象')

 ret = input.split(',')
 value1 = ret[0]
 value2 = ret[1]
 #轉換成坐標
 pos_x = int(value1)
 pos_y = ord(value2) - ord('a') +1
 chessman.set_pos((pos_x, pos_y))
 #print(ret)
          

機器下棋:這里具體策略暫用隨機數代替了(有空在想,略過略過~)

            
#電腦下棋的策略
 def computer_go(self, chessman):
 if not isinstance(chessman,Chessman):
  raise RuntimeError('類型不對,第一個參數必須為Chessman對象')
 while True:

  # pos_x和pos_y在1~15之間隨機生成一個數
  pos_x = math.ceil(random.random()*Chessboard.board_size)
  pos_y = random.randint(1,15)
  #判斷是否為空,否則重新生成坐標
  if self.__chessboard.get_chess((pos_x,pos_y)) == '+':
  print('電腦下棋的位置:%d,%d'%(pos_x,pos_y))
  chessman.set_pos((pos_x,pos_y))
  break
          

判斷當前棋局的勝負:每一方下棋都要判斷一次,因此可根據當前下的一子的范圍來判斷是否在上下左右和兩斜排有連續五子,如果有則勝利。

斜排主要是x,y的判斷范圍比較難定,其他的差不多。以下是本寶寶絞盡腦汁想到的判斷方法(特別是斜排的),檢查到目前是沒有問題的,或許還有更好的方法:

            
#判斷勝負
 #當擺放一個棋子,判斷是否贏
 def is_won(self,pos,color):
 #垂直方向的范圍
 start_x = 1
 end_x = 15
 if pos[0] -4 >=1:
  start_x =pos[0] - 4
 if pos[0] +4 <=15:
  end_x = pos[0]+4
 #垂直方向的判斷
 count = 0
 for pos_x in range(start_x, end_x+1):
  if self.__chessboard.get_chess((pos_x, pos[1])) == color:
  count +=1
  if count >=5:
   return True
  else:
  # 一旦斷開 統計數清0
  count = 0

 #水平方向的范圍 
 start_y = 1
 end_y = 15
 if pos[1] -4 >=1:
  start_y =pos[1] - 4
 if pos[1] +4 <=15:
  end_y = pos[1]+4
 #水平方向的判斷
 count = 0
 for pos_y in range(start_y, end_y+1):
  if self.__chessboard.get_chess((pos[0], pos_y)) == color:
  count +=1
  if count >=5:
   return True
  else:
  # 一旦斷開 統計數清0
  count = 0

 #左上右下方向判斷
 count = 0
 s=pos[0] - pos[1]
 start=start_x
 end=end_y+s
 if pos[0]>pos[1]:
  start=start_y+s
  end=end_x
 for index in range(start, end+1):
  if self.__chessboard.get_chess((index, index-s)) == color:
  count +=1
  if count >=5:
   return True
  else:
  # 一旦斷開 統計數清0
  count = 0

 #左下右上方向判斷
 count = 0
 s=pos[0] + pos[1]
 if pos[0]+pos[1]<=16:
  start=start_x
  end=s-start_y

 if pos[0]+pos[1]>16:
  start=s-start_y
  end=start_x

 if s>=6 and s<=12:
  for index in range(start, end+1):
  if self.__chessboard.get_chess((index, s-index)) == color:
   count +=1
   if count >=5:
   return True
  else:
   # 一旦斷開 統計數清0
   count = 0
 return False
          

接下來再用一個判斷勝利方的方法調用上面的策略

            
#判斷對象放置后,勝負是否已分
 def is_wonman(self,chessman):
 if not isinstance(chessman,Chessman):
  raise RuntimeError('類型不對,第一個參數必須為Chessman對象')
 pos = chessman.get_pos()
 color = chessman.get_color()
 #調用is_won()獲取它的返回值
 return self.is_won(pos,color)
          

main模塊

main模塊用來對整個游戲的玩法格局進行控制。
main函數實現一局的流程,這里用循環來實現簡單的人機輪流下棋。因為添加了用戶選擇先后的功能,所以代碼暫時被我弄得繁瑣了(捂臉)還可以精簡的,這里就先放這個:

            
def main():
 chessboard =Chessboard()
 chessboard.init_board()
 chessboard.print_board()
 engine = Engine(chessboard)
 count=0
 select = int(input('用戶選擇先后:(先:1,后:2)'))
 #先
 while True:
 chessman = Chessman()
 chessman.set_color('x')
 if select==1:
  i = input('人下棋,請輸入下棋坐標(格式:x,y):')
  engine.parse_user_input(i, chessman)#轉換成坐標
 else:
  #電腦下棋
  print('電腦下棋:')
  engine.computer_go(chessman)
 # 把該棋子對象放到棋盤上
 chessboard.set_chessman(chessman)
 count +=1
 #打印棋盤
 chessboard.print_board()
 if engine.is_wonman(chessman):
  if select==1:
  print('人贏了!')

  else:
  print('電腦贏了!')
  break
 if count == 225:
  print('平局!')
  break


 #后 
 chessman = Chessman()
 chessman.set_color('o')
 if k==1:
  #電腦下棋
  print('電腦下棋:')
  #電腦給棋子生成策略(位置)
  engine.computer_go(chessman)
 else:
  i = input('人下棋,請輸入下棋坐標(格式:x,y):')
  engine.parse_user_input(i, chessman)#轉換成坐標
 #下棋
 chessboard.set_chessman(chessman)
 count +=1
 chessboard.print_board()
 if engine.is_wonman(chessman):
  if k==1:
  print('電腦贏了!')
  else:
  print('人贏了!')
  break
 if count == 225:
  print('平局!')
  break
          

主線程作為程序入口操控每個棋局:

            
if __name__ == '__main__':
 while True:
 print('開始一局!')
 #調用main方法
 main()
 s=int(input('是否再來一局:(是:1,否:0)'))
 if s!=1:
  break
 print('游戲結束!') 
          

五子棋的簡單人機模式就是綜上所述的了,不過這個代碼中輸入的地方沒加檢查,所以坐標輸入一定要是數字加逗號加字母的格式才行,可以加正則表達式進行判斷。放上效果圖:

使用python實現簡單五子棋游戲_第2張圖片

使用python實現簡單五子棋游戲_第3張圖片

使用python實現簡單五子棋游戲_第4張圖片

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲精品国产福利在线观看 | 国产精品高清在线观看93 | 欧美中文在线观看 | 久久91精品久久91综合 | 亚洲国产综合久久精品 | 老司机午夜在线视频免费 | 久草在在线 | 欧美影院一区二区三区 | 国产老年人性视频 | 一级a毛片免费观看久久精品 | 视频在线成人 | 在线亚洲免费 | 综合久久久久久久 | 久久国产精品老女人 | 热久久影院 | 欧美大片天天免费看视频 | 色天天综合 | 视频大全在线观看免费 | 四虎永久免费地址在线网站 | 国产精品亚洲专一区二区三区 | 韩国精品欧美一区二区三区 | 成人精品一区二区三区中文字幕 | 亚州视频在线 | 奇米影视777me | 色久悠悠在线观看 | 久久黄色视屏 | 99久久久精品 | 久久亚洲精品人成综合网 | 日日狠狠久久偷偷四色综合免费 | 中文字幕久久综合伊人 | 免费久久久久 | 成人性色生活片免费网 | 毛片一区二区三区 | 久久高清免费 | 亚洲区 欧美区 | 欧美一级美片在线观看免费 | 伊人插| 精久久| 日日摸天天摸狠狠摸视频 | 奇米影视奇奇米色狠狠色777 | 国内精品久久久久 |