前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python 五子棋-文字版(上)

python 五子棋-文字版(上)

作者头像
叶子陪你玩
发布2020-10-30 11:15:10
1.7K0
发布2020-10-30 11:15:10
举报

游戏介绍

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

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

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

程序设计思路

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

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

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

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

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

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

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

3.怎么判断输赢?

  • 全棋盘扫描

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

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

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

4.行棋表示方法

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

5.模式

  • 人-机 模式

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

  • 人-人 模式

程序代码

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

打印显示玩法

决定谁先走

创建一个空棋盘

打印显示当前棋盘

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

如果轮到玩家

得到玩家下棋位置

根据位置更改棋盘

否则

计算电脑下棋位置

根据位置更改棋盘

打印显示当前棋盘

切换下棋方

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

创建棋盘

显示棋盘

谁先走

得到合法的行棋位置

电脑随机

输赢判断方法

全局判断

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

询问下棋位置

切换行棋方

程序主逻辑:

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

完整代码

代码语言:javascript
复制
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学习之路

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 叶子陪你玩编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 游戏介绍
  • 程序设计思路
    • 1.棋盘采取那种数据结构?
      • 2.如何想要以那种格式展示棋盘?
        • 3.怎么判断输赢?
          • 4.行棋表示方法
            • 5.模式
            • 程序代码
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档