python画五子棋棋盘_python 五子棋-文字版(上)

游戏介绍

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

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

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

程序设计思路

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

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

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

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

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

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

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

3.怎么判断输赢?

全棋盘扫描

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

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

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

4.行棋表示方法

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

5.模式

人-机 模式

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

人-人 模式

程序代码

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

打印显示玩法

决定谁先走

创建一个空棋盘

打印显示当前棋盘

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

如果轮到玩家

得到玩家下棋位置

根据位置更改棋盘

否则

计算电脑下棋位置

根据位置更改棋盘

打印显示当前棋盘

切换下棋方

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

创建棋盘

显示棋盘

谁先走

得到合法的行棋位置

电脑随机

输赢判断方法

全局判断

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

询问下棋位置

切换行棋方

程序主逻辑:

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

完整代码

import randomrow = 10col = 10def 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, computerdef legal_moves(board):moves = []for i in range(row):for j in range(col):if board[i][j] == " ":moves.append((i,j))return movesdef computer_move(board):moves = legal_moves(board)pos = random.choice(moves)return posdef 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 Noneelse: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, ydef 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,0while not win:if turn ==human:x, y = ask_move_pos(board)board[x][y]=turnelse:x,y = computer_move(board)board[x][y]=turndisplay_board(board)turn = next_turn(turn)win = win(board)print(win)

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

(全文完)

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值