游戏介绍
五子棋游戏相信大家应该都非常熟悉了,作为策略型棋类游戏还是非常经典的,双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜;
五子棋盘是由横纵各15条等距离,垂直交叉的平行线构成,按格子数是14x14个;
在一些专业的比赛中,又有禁手一说,禁手是指对局中禁止先行一方(黑方)使用的战术,之所有会出现这样的规则,是因为有棋手说,先行一方(黑方)的优势过大,甚至有必胜的走法。所以会有各种规则来尽量减少先行棋的优势。
程序设计思路
本次设计的是终端运行的字符类五子棋,无法实现交叉的效果,最后采用的是在格子里面下棋。
棋子采用两种不同的字符 O 和 X表示,最终的棋盘棋子效果如下:
要实现五子棋程序,有几个重要问题需要思考:
1.棋盘采取那种数据结构?
单列表,嵌套列表或者其它的都可以,之前的井字棋由于网格少,采用的是单列表,这里虽然也可以,但是采用嵌套列表可以减少计算;
2.如何想要以那种格式展示棋盘?
网格类型,通过字符串格式化的方法;
3.怎么判断输赢?
全棋盘扫描
判断水平,竖直,左右斜方向有没有五子连珠的
根据最新下棋位置,部分扫描
以当前下棋位置,判断水平,竖直,左右斜方向有没有五子连珠的
4.行棋表示方法
以 6,6 这种格式代表行棋位置
5.模式
人-机 模式
电脑又可分为 随机下 或者 策略下棋(寻找最优价值位置)
人-人 模式
程序代码
伪代码和之前的井字棋一样:
打印显示玩法
决定谁先走
创建一个空棋盘
打印显示当前棋盘
当没有人获胜且不是平局:
如果轮到玩家
得到玩家下棋位置
根据位置更改棋盘
否则
计算电脑下棋位置
根据位置更改棋盘
打印显示当前棋盘
切换下棋方
向获胜者祝贺或者说明平局
创建棋盘
显示棋盘
谁先走
得到合法的行棋位置
电脑随机
输赢判断方法
全局判断
局部判断,还未优化,边缘位置未处理
询问下棋位置
切换行棋方
程序主逻辑:
电脑采用的是随机方式,玩家可以选择位置
完整代码
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学习之路