日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python写游戏棋牌游戏_使用python实现简单五子棋游戏

發布時間:2024/9/30 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python写游戏棋牌游戏_使用python实现简单五子棋游戏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

發布時間:2020-08-29 06:12:30

來源:腳本之家

閱讀:73

作者:weixin_42874933

用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()

效果為如下

接下來是棋子的放入:

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

#寫入對應位置的顏色

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写游戏棋牌游戏_使用python实现简单五子棋游戏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。