用python写个AI井字棋!

闲来无事就写个pytho版本简单的Ai井字棋,供大家参考….

import os

# 每个方格对应的棋子类型
class Role:
    Player = 1
    Empty = 0
    AI = -1
# 剩余空表格总数,为0时判断平局
EmptyCount=9
# 游戏表格
Tabel=[[0,0,0],[0,0,0],[0,0,0]]
# 是否让 AI 先手
AIFirst=True

def ShouldAttack():
    return HaveTwoPiece(Role.AI)

def ShouldDefend():
    return HaveTwoPiece(Role.Player)

def SetPiece(x,y,role):
    global EmptyCount
    EmptyCount  -= 1
    #print(role ,"在 ",x ,"," , y ," 落子 ")
    global Tabel
    Tabel[x][y] = role

def HaveTwoPiece(role):
    global Tabel
    for i in range(0,3):
        #横向匹配行
        if (Tabel[i][0] == Tabel[i][1] and Tabel[i][0] ==role and Tabel[i][2] ==  Role.Empty):
            SetPiece(i,2,Role.AI)
            return True
        elif (Tabel[i][0] == Tabel[i][2] and Tabel[i][0] == role and Tabel[i][1] ==  Role.Empty):
            SetPiece(i, 1, Role.AI)
            return True
        elif (Tabel[i][1] == Tabel[i][2] and Tabel[i][1] == role and Tabel[i][0] ==  Role.Empty):
            SetPiece(i, 0, Role.AI)
            return True
        #纵向匹配行
        elif (Tabel[0][i] == Tabel[1][i] and Tabel[0][i] == role and Tabel[2][i] ==  Role.Empty):
            SetPiece(2, i, Role.AI)
            return True
        elif (Tabel[0][i] == Tabel[2][i] and Tabel[0][i] == role and Tabel[1][i] ==  Role.Empty):
            SetPiece(1, i, Role.AI)
            return True
        elif (Tabel[1][i] == Tabel[2][i] and Tabel[1][i] == role and Tabel[0][i] ==  Role.Empty):
            SetPiece(0, i, Role.AI)
            return True

    #对角线匹配行
    if (Tabel[0][0] == Tabel[1][1] and Tabel[0][0] == role and Tabel[2][2] ==  Role.Empty):
        SetPiece(2,2, Role.AI)
        return True
    elif (Tabel[1][1] == Tabel[2][2] and Tabel[1][1] == role and Tabel[0][0] ==  Role.Empty):
        SetPiece(0, 0, Role.AI)
        return True
    elif (Tabel[0][2] == Tabel[1][1] and Tabel[0][2] == role and Tabel[2][0] ==  Role.Empty):
        SetPiece(2, 0, Role.AI)
        return True
    elif (Tabel[1][1] == Tabel[2][0] and Tabel[1][1] == role and Tabel[0][2] ==  Role.Empty):
        SetPiece(0, 2, Role.AI)
        return True
    else:
        #不存在上述行
        return False

def AIStart():
    if (ShouldAttack()):
        print("AI 发起攻击!")
    elif (ShouldDefend()):
        print("AI 发起拦截!")
    elif (Center()):
        print("AI 占领中心点!")
    else:
        print("AI 进入垃圾时间...")
        PlanB()

def Center():
    global Tabel
    if (Tabel[1][1] ==  Role.Empty):
        SetPiece(1,1,Role.AI)
        return True
    else:
        return False
def PlanB():
    global Tabel
    #先角原则:
    #判断敌方是否占领了对角线两端,若存在则尝试占领剩余两角
    if (Tabel[0][0] == Tabel[2][2] and Tabel[0][0] == Role.Player):
        if (Tabel[0][2] == Role.Empty): SetPiece(0, 2, Role.AI)
        elif (Tabel[2][0]==  Role.Empty): SetPiece(2, 0, Role.AI)
    elif (Tabel[0][2] == Tabel[2][0] and Tabel[0][2] == Role.Player):
        if (Tabel[0][0] == Role.Empty): SetPiece(0, 0, Role.AI)
        elif (Tabel[2][2] == Role.Empty): SetPiece(2, 2, Role.AI)

    #判断敌方是否占领了相邻两棱,若存在则尝试占领两棱相对的一角
    elif ((Tabel[0][1] == Role.Player and Tabel[1][0] == Role.Player) and Tabel[0][0] == Role.Empty):
        SetPiece(0, 0, Role.AI)
    elif ((Tabel[0][1] == Role.Player and Tabel[1][2] == Role.Player) and Tabel[0][2] == Role.Empty):
        SetPiece(0, 2, Role.AI)
    elif ((Tabel[2][1] == Role.Player and Tabel[1][0] == Role.Player) and Tabel[2][0] == Role.Empty):
        SetPiece(2, 0, Role.AI)
    elif ((Tabel[2][1] == Role.Player and Tabel[1][2] == Role.Player) and Tabel[2][2] == Role.Empty):
        SetPiece(2, 2, Role.AI)

    #玩家占领棱位,我方占领对角
    elif ((Tabel[0][1] == Role.Player or Tabel[1][0] == Role.Player) and Tabel[2][2] == Role.Empty):
        SetPiece(2, 2, Role.AI)
    elif ((Tabel[0][1] == Role.Player or Tabel[1][2] == Role.Player) and Tabel[2][0] == Role.Empty):
        SetPiece(2, 0, Role.AI)
    elif ((Tabel[2][1] == Role.Player or Tabel[1][0] == Role.Player) and Tabel[0][2] == Role.Empty):
        SetPiece(0, 2, Role.AI)
    elif ((Tabel[2][1] == Role.Player or Tabel[1][2] == Role.Player) and Tabel[0][0] == Role.Empty):
        SetPiece(0, 0, Role.AI)

    #随便找空角下子
    elif (Tabel[0][0] == Role.Empty):
        SetPiece(0, 0, Role.AI)
    elif (Tabel[0][2] == Role.Empty):
        SetPiece(0, 2, Role.AI)
    elif (Tabel[2][0] == Role.Empty):
        SetPiece(2, 0, Role.AI)
    elif (Tabel[2][2] == Role.Empty):
        SetPiece(2, 2, Role.AI)
    elif (Tabel[0][1] == Role.Empty):
        SetPiece(0, 1, Role.AI)
    elif (Tabel[1][0] == Role.Empty):
        SetPiece(1, 0, Role.AI)
    elif (Tabel[1][2] == Role.Empty):
        SetPiece(1, 2, Role.AI)
    elif (Tabel[2][1] == Role.Empty):
        SetPiece(2, 1, Role.AI)

def GetWinner():
    global Tabel
    for i in range(0,3):
        if (Tabel[i][0] == Tabel[i][1] and Tabel[i][0] == Tabel[i][2] and Tabel[i][0] != 0):
            return Tabel[i][0]
        if (Tabel[0][i] == Tabel[1][i] and Tabel[0][i] == Tabel[2][i] and Tabel[0][i] != 0):
            return Tabel[0][i]

    #对角线
    if (Tabel[0][0] == Tabel[1][1] and Tabel[1][1] == Tabel[2][2] and Tabel[1][1]!=0):
        return Tabel[1][1]
    if (Tabel[0][2] == Tabel[1][1] and Tabel[1][1] == Tabel[2][0] and Tabel[1][1] != 0):
        return Tabel[1][1]
    else:
        #平局
        return Role.Empty

def PlayerInput(Error=0):
    global Tabel
    # 把错误代码传送给输出函数,用于显示错误信息
    PrintGame(Error)
    #这里严防输入参数过多或过少,必须要是两个数字用逗号分开,否则出错
    x,y=map(int,input("\n请输入落子坐标(以逗号分开,介于[0~2],[0~2]之间):").split(","))
    if (0<= x and x <=2) and (0<=y and y<=2):
        if (Tabel[x][y]==Role.Empty):
            SetPiece(x,y,Role.Player)
        else:
            PlayerInput(2)
    else:
        PlayerInput(1)

def PrintGame(Error=0):
    global Tabel
    os.system('cls')
    print("※ 0  1  2")
    for x in range(0,3):
        Line =" " + str(x)
        for y in range(0,3):
            if Tabel[x][y]==Role.Player:
                Line += " ●"
            elif Tabel[x][y]==Role.AI:
                Line +=" ×"
            elif Tabel[x][y]==Role.Empty:
                Line +=" □"
        print(Line)
    if Error ==1:
        print("\n输入坐标越界,请重新输入!")
    elif Error ==2:
        print("\n输入的坐标已经有棋子,请重新输入!")

def ResetGame():
    os.system('cls')
    global AIFirst
    global Tabel
    global EmptyCount
    print("\n游戏结束,重置游戏!");
    Tabel = [[0,0,0],[0,0,0],[0,0,0]];
    EmptyCount = 9;
    #每次游戏结束后,交换AI和玩家先手
    AIFirst = not AIFirst
    if AIFirst: AIStart()
    PrintGame();

if AIFirst: AIStart()
while True:
    PlayerInput()
    AIStart()
    Winner = GetWinner()
    PrintGame()
    if (Winner == Role.Empty):
        if (EmptyCount<=0):
            print("\n棋逢对手!双方平局!\n")
            ResetGame()
    else:
        if Winner==Role.Player:
            print("\n游戏结束!胜利者:Player\n")
        elif Winner ==Role.AI:
            print("\n游戏结束!胜利者:AI\n")
        os.system("pause")
        ResetGame()

猜你喜欢

转载自blog.csdn.net/qq_41058594/article/details/81085205