python 五子棋-文字版(上)_嵌套



游戏介绍



五子棋游戏相信大家应该都非常熟悉了,作为策略型棋类游戏还是非常经典的,双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜;


五子棋盘是由横纵各15条等距离,垂直交叉的平行线构成,按格子数是14x14个;

       python 五子棋-文字版(上)_井字棋_02      

在一些专业的比赛中,又有禁手一说,禁手是指对局中禁止先行一方(黑方)使用的战术,之所有会出现这样的规则,是因为有棋手说,先行一方(黑方)的优势过大,甚至有必胜的走法。所以会有各种规则来尽量减少先行棋的优势。

       python 五子棋-文字版(上)_数据结构_03      


程序设计思路


本次设计的是终端运行的字符类五子棋,无法实现交叉的效果,最后采用的是在格子里面下棋。


棋子采用两种不同的字符 O 和 X表示,最终的棋盘棋子效果如下:

       python 五子棋-文字版(上)_嵌套_04      


要实现五子棋程序,有几个重要问题需要思考:


1.棋盘采取那种数据结构?


单列表,嵌套列表或者其它的都可以,之前的井字棋由于网格少,采用的是单列表,这里虽然也可以,但是采用嵌套列表可以减少计算;


2.如何想要以那种格式展示棋盘?


网格类型,通过字符串格式化的方法;


3.怎么判断输赢?


  • 全棋盘扫描

判断水平,竖直,左右斜方向有没有五子连珠的


  • 根据最新下棋位置,部分扫描

以当前下棋位置,判断水平,竖直,左右斜方向有没有五子连珠的


4.行棋表示方法


以 6,6 这种格式代表行棋位置


5.模式


  • 人-机 模式

电脑又可分为 随机下 或者 策略下棋(寻找最优价值位置)

  • 人-人 模式




程序代码


伪代码和之前的井字棋一样:


打印显示玩法

决定谁先走

创建一个空棋盘

打印显示当前棋盘

当没有人获胜且不是平局:

    如果轮到玩家

        得到玩家下棋位置

        根据位置更改棋盘

    否则

        计算电脑下棋位置

        根据位置更改棋盘

    打印显示当前棋盘

    切换下棋方

向获胜者祝贺或者说明平局


创建棋盘

       python 五子棋-文字版(上)_井字棋_05      

显示棋盘

       python 五子棋-文字版(上)_嵌套_06      

谁先走

       python 五子棋-文字版(上)_数据结构_07      

得到合法的行棋位置

       python 五子棋-文字版(上)_嵌套_08      

电脑随机


       python 五子棋-文字版(上)_嵌套_09      



输赢判断方法


全局判断

       python 五子棋-文字版(上)_井字棋_10      

局部判断,还未优化,边缘位置未处理

       python 五子棋-文字版(上)_数据结构_11      

询问下棋位置


       python 五子棋-文字版(上)_嵌套_12      


切换行棋方


       python 五子棋-文字版(上)_嵌套_13      


程序主逻辑:


电脑采用的是随机方式,玩家可以选择位置


       python 五子棋-文字版(上)_井字棋_14      


完整代码


import random


row = 10
col = 10


def new_board():
return [[" "]*10 for i in range(row)]


def display_board(board):
for i in range(row):
print(f"{'':-^39}")
for j in range(col):
print(board[i][j],end=" | ")
print()
print(f"{'':-^39}")




def pieces():
is_go_first = input("你想要先走吗? (y/n): ").lower()
if is_go_first == "y":
human, computer = "X", "O"
else:
human, computer = "O", "X"
return human, computer


def legal_moves(board):
moves = []
for i in range(row):
for j in range(col):
if board[i][j] == " ":
moves.append((i,j))
return moves


def computer_move(board):
moves = legal_moves(board)
pos = random.choice(moves)
return pos




def win(board):
# 行判断
for i in range(row):
for j in range(col-4):
if board[i][j] == board[i][j+1] == board[i][j+2] == board[i][j+3] == board[i][j+4] != " ":
return board[i][j]


# 列判断
for j in range(col):
for i in range(row-4):
if board[i][j] == board[i+1][j] == board[i+2][j] == board[i+3][j] == board[i+4][j] != " ":
return board[i][j]


# 左高右低判断
for i in range(row-4):
for j in range(col-4):
if board[i][j] == board[i+1][j+1] == board[i+2][j+2] == board[i+3][j+3] == board[i+4][j+4] != " ":
return board[i][j]


# 左低右高判断
for i in range(4,row):
for j in range(col-4):
if board[i][j] == board[i-1][j+1] == board[i-2][j+2] == board[i-3][j+3] == board[i-4][j+4]!=" ":
return board[i][j]


# 判断是否下完所有位置
for i in range(row):
for j in range(col):
if board[i][j]==" ":
return None
else:
return "平局"


def ask_move_pos(board):
while True:
pos = input("你的输入位置?(x,y):")
str_x, str_y = pos.split(",")
x, y = int(str_x), int(str_y)
if board[x][y] == " ":
return x, y


def next_turn(turn):
if turn == "X":
return "O"
else:
return "X"


board = new_board()
display_board(board)
human,computer = pieces()
turn = "X"
x,y=0,0
while not win:
if turn ==human:
x, y = ask_move_pos(board)
board[x][y]=turn
else:
x,y = computer_move(board)
board[x][y]=turn
display_board(board)
turn = next_turn(turn)

win = win(board)
print(win)


电脑策略下棋(AI)单独讲。


(全文完)


长按二维码,加关注!叶子陪你玩

python 五子棋-文字版(上)_数据结构_15


欢迎转载,转载请注明出处!

欢迎关注公众微信号:叶子陪你玩编程 分享自己的python学习之路