专栏首页python3python井字棋算法及代码

python井字棋算法及代码

井字棋盘看起来像一个大的井字符号(#),有9 个空格,可以包含X、O 或 关于落子问题 由于只能采用键盘输入,所以需要对棋盘进行坐标表示; 即直接用1-9个9个数字来表示位置, 7|8|9 -+-+- 4|5|6 -+-+- 1|2|3 其索引顺序与数字键盘上的数字键排列一致,下棋时看着数字键下,较为简便。 计算机的算法--寻找最佳落子位置 首先简单的将棋盘划分为三个部分——中心(1),角(4),边(4)。 中心虽然只有一个但却不是最重要的,三个部分落子的优先顺序依次为:角、中心、边。 因此,井字棋的计算机算法计算最佳落子位置的顺序如下: 1 直接落子获胜 2 阻止玩家获胜 3 在角上落子 4 在中心落子 5 在边上落子

游戏流程 1、开始 2、选子 X或者O 3、随机先手 4、轮流下棋 5、是否分出胜负 5.1 分出胜负 跳到6 5.2 未分出胜负 跳到4 6、再来一局 6.1是, 跳到2 6.2否, 退出

游戏代码: import random

def printBoard(borad): print(borad[7] + '|' + borad[8] + '|' + borad[9]) print('-+-+-') print(borad[4] + '|' + borad[5] + '|' + borad[6]) print('-+-+-') print(borad[1] + '|' + borad[2] + '|' + borad[3])

'''printBoard 定义了棋盘打印输出函数 与数字键盘排列一致'''

def inputPlayerLetter(): '''#让玩家选择棋子 返回一个列表,显示玩家和电脑的棋子类型 ''' letter = '' while not (letter == 'X' or letter == 'O'): print('Do you want to be X or O?') letter = input().upper()

if letter == 'X':
    return ['X', 'O']
else:
    return ['O', 'X']

def whoGoesFirst(): '''随机先手''' if random.randint(0, 1) == 0: return 'Computer' else: return 'Player'

def playAgain(): '''再玩一次?''' print('Do you want to play again?(yes or no)') return input().lower().startswith('y')

def makeMove(board, letter, move): '''落子''' board[move] = letter

def isWinner(board, occupy):

判断是否获胜

return ((board[1] == occupy and board[2] == occupy and board[3] == occupy) or
        (board[4] == occupy and board[5] == occupy and board[6] == occupy) or
        (board[7] == occupy and board[8] == occupy and board[9] == occupy) or
        (board[1] == occupy and board[4] == occupy and board[7] == occupy) or
        (board[2] == occupy and board[5] == occupy and board[8] == occupy) or
        (board[3] == occupy and board[6] == occupy and board[9] == occupy) or
        (board[1] == occupy and board[5] == occupy and board[9] == occupy) or
        (board[3] == occupy and board[5] == occupy and board[7] == occupy))

def getBoardCopy(board):

复制一份棋盘给电脑落子使用

depuBoard = []

for i in board:
    depuBoard.append(i)

return depuBoard

def isSpaceFree(board, move):

判断这个位置是否有子,无子返回True

return board[move] == ' '

def getPlayerMove(board): move = ' ' while move not in '1 2 3 4 5 6 7 8 9'.split() or not isSpaceFree(board, int(move)): print('What is your next move?(1-9)') move = input() return int(move)

def choosePossibleMoverFromList(board, moveList):

随机返回一个可以落子的坐标,若无子可下,则返回None

possibleMoves = []
for i in moveList:
    if isSpaceFree(board, i):
        possibleMoves.append(i)

if len(possibleMoves) != 0:
    return random.choice(possibleMoves)
else:
    return None

def getComputerMove(board, computerLetter):

确定电脑的落子位置

if computerLetter == 'X':
    playerLetter == 'O'
else:
    playerLetter == 'X'

'''先判断电脑方能否通过一次落子直接获得游戏胜利'''
for i in range(1, 10):
    copy = getBoardCopy(board)
    if isSpaceFree(copy, i):
        makeMove(copy, computerLetter, i)
        if isWinner(copy, computerLetter):
            return i

'''判断玩家下一次落子是否获胜,若能,则再该点落子'''
for i in range(1, 10):
    copy = getBoardCopy(board)
    if isSpaceFree(copy, i):
        makeMove(copy, playerLetter, i)
        if isWinner(copy, playerLetter):
            return i

'''若角上能落子,则在角上落子'''
move = choosePossibleMoverFromList(board, [1, 3, 5, 7])

if move != None:
    return move

'''若中心能落子,则在中心落子'''
if isSpaceFree(board, 5):
    return 5

'''若边上能落子,则在边上落子'''
return choosePossibleMoverFromList(board, [2, 4, 6, 8])

def isBoardFull(board): ''' 如果棋盘满了,返回True''' for i in range(1, 10): if isSpaceFree(board, i): return False return True

print('Welcome to the TicTacToe game!')

while True:

update board

theBoard = [' '] * 10
playerLetter, computerLetter = inputPlayerLetter()

turn = whoGoesFirst()

print('The ' + turn + ' will go first.')

gameIsPlaying = True

while gameIsPlaying:
    if turn == 'Player':
        # 玩家回合
        printBoard(theBoard)
        move = getPlayerMove(theBoard)
        makeMove(theBoard, playerLetter, move)

        if isWinner(theBoard, playerLetter):
            printBoard(theBoard)
            print('Wow!!!You win the game!!!')
            gameIsPlaying = False
        else:
            if isBoardFull(theBoard):
                printBoard(theBoard)
                print('The game is tie')
                break
            else:
                turn = 'Computer'

    else:
        # 电脑回合
        move = getComputerMove(theBoard, computerLetter)
        makeMove(theBoard, computerLetter, move)

        if isWinner(theBoard, computerLetter):
            printBoard(theBoard)
            print('Oh!,The computer win!,You lose.')
            gameIsPlaying = False
        else:
            if isBoardFull(theBoard):
                printBoard(theBoard)
                print('The game is tie')
                break
            else:
                turn = 'Player'

if not playAgain():
    break

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • (1)并发编程实现的基础

    #允许多个程序同时进入内存并运行。即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,...

    py3study
  • python 游戏(滑动拼图Slide_

    实现16宫格滑动拼图,实现3个按钮(重置用户操作,重新开始游戏,解密游戏),后续难度,额外添加重置一次的按钮,解密算法的植入,数字改变为图片植入

    py3study
  • 细品慢酌QuickTest关键视图(3)

          本篇文章对QuickTest下关键字视图的条件语句及循环语句进行图文并茂的介绍,与前几篇博文为一系列博文,读者能够连续阅读,能够起到更好的学习效果。

    py3study
  • 前后端分离和模块化-58到家微信首页重构之路

    微信钱包内的58到家全新首页已经上线,感兴趣的同学们可以在微信中打开“我的->钱包->58到家”查看。 58到家全新首页提出重构主要是为了解决以下问题: 每个城...

    寒月十八
  • 微信钱包中58到家首页为什么这么快

    原文标题《前后端分离和模块化-58到家微信首页重构之路》【深度前端干货】 微信钱包内的58到家全新首页已经上线,感兴趣的同学们可以在微信中打开“我的->钱包->...

    架构师之路
  • 章文嵩:开源,LVS,以及留下的无数传说

    三年前,在中关村的技术沙龙遇到了章文嵩,有技术人员的气质,也有一些文人的感觉,也有一些创业者的软疲态。

    纯洁的微笑
  • LeetCode | 两数之和

    努力在北京混出人样
  • LeetCode | 两数之和

    努力在北京混出人样
  • nginx0.1.0之http模块初始化源码分析(4)

    我们继续分析ngx_http_block函数剩余的代码,剩下的代码就是处理phases和监听的端口、地址、servername的。

    theanarkh
  • 力扣题目汇总(旋转数字,移除元素,找不同)

    1.我们称一个数 X 为好数, 如果它的每位数字逐个地被旋转 180 度后,我们仍可以得到一个有效的,且和 X 不同的数。要求每位数字都要被旋转。

    小小咸鱼YwY

扫码关注云+社区

领取腾讯云代金券