python井字棋。分与人机和朋友下的那种

怎么用python做井字棋游戏,废话不多说上代码!

觉得有帮助送我上去!!!!!!!!!!!!!!!!!!!

(这行不是代码:比较繁琐没简化。为什么?问就是头发没了)
import time
import random
def printf(a):
    for i in range(len(a)):
        print(a[i])
def luozi(a,b,c):#落子方法。参数说明a:棋盘。b:位置(是逻辑位置哦注意转换)。c:棋子
    del a[int(b[0])-1][int(b[1])-1:int(b[1])]
    a[int(b[0])-1].insert(int(b[1])-1,c)
def shuying(a,b):#判断输赢的方法
    for i in range(0,2):
        if a[i][0]==a[i][1]==a[i][2]==b:
            return 1
    for i in range(0,2):
        if a[0][i]==a[1][i]==a[2][i]==b:
            return 1
    if a[0][0]==a[1][1]==a[2][2]==b or a[0][2]==a[1][1]==a[2][0]==b:
        return 1
    else:return 0
def duzi(a,b,c):#ai防守堵子方法b被堵方,c是堵方。就是将15种赢的方法遍历一遍
    for i in range(0,2):
        if a[i][0]==a[i][1]==b and a[i][2]=='0':
            luozi(a,[i+1,3],c)
            return 0
        if a[i][0]==a[i][2]==b and a[i][1]=='0':
            luozi(a,[i+1,2],c)
            return 0
        if a[i][1]==a[i][2]==b and a[i][0]=='0':
            luozi(a,[i+1,1],c)
            return 0
        if a[0][i]==a[1][i]==b and a[2][i]=='0':
            luozi(a,[3,i+1],c)
            return 0
        if a[0][i]==a[2][i]==b and a[1][i]=='0':
            luozi(a,[2,i+1],c)
            return 0
        if a[1][i]==a[2][i]==b and a[0][i]=='0':
            luozi(a,[1,i+1],c)
            return 0
    if a[0][0]==a[1][1]==b and a[2][2]=='0':
        luozi(a,[3,3],c)
        return 0
    if a[0][0]==a[2][2]==b and a[1][1]=='0':
        luozi(a,[2,2],c)
        return 0
    if a[1][1]==a[2][2]==b and a[0][0]=='0':
        luozi(a,[1,1],c)
        return 0
    if a[0][2]==a[1][1]==b and a[2][0]=='0':
        luozi(a,[3,1],c)
        return 0
    if a[0][2]==a[2][0]==b and a[1][1]=='0':
        luozi(a,[2,2],c)
        return 0
    if a[1][1]==a[2][0]==b and a[0][2]=='0':
        luozi(a,[1,3],c)
        return 0
def ailuozi(a,c):#ai进攻落子算法,和上面差不多
    for i in range(0,2):
        if a[i][0]==a[i][1]==c and a[i][2]=='0':
            luozi(a,[i+1,3],c)
            return 0
        if a[i][0]==a[i][2]==c and a[i][1]=='0':
            luozi(a,[i+1,2],c)
            return 0
        if a[i][1]==a[i][2]==c and a[i][0]=='0':
            luozi(a,[i+1,1],c)
            return 0
        if a[0][i]==a[1][i]==c and a[2][i]=='0':
            luozi(a,[3,i+1],c)
            return 0
        if a[0][i]==a[2][i]==c and a[1][i]=='0':
            luozi(a,[2,i+1],c)
            return 0
        if a[1][i]==a[2][i]==c and a[0][i]=='0':
            luozi(a,[1,i+1],c)
            return 0
    if a[0][0]==a[1][1]==c and a[2][2]=='0':
        luozi(a,[3,3],c)
        return 0
    if a[0][0]==a[2][2]==c and a[1][1]=='0':
        luozi(a,[2,2],c)
        return 0
    if a[1][1]==a[2][2]==c and a[0][0]=='0':
        luozi(a,[1,1],c)
        return 0
    if a[0][2]==a[1][1]==c and a[2][0]=='0':
        luozi(a,[3,1],c)
        return 0
    if a[0][2]==a[2][0]==c and a[1][1]=='0':
        luozi(a,[2,2],c)
        return 0
    if a[1][1]==a[2][0]==c and a[0][2]=='0':
        luozi(a,[1,3],c)
        return 0
def AI(a,b,c,d,e):#b表示人,c表示AI,d表示方式谁先下1人先下。0ai先下,e表示第几轮下棋了很有必要。
    if d==1:
        if a[1][1]==b and e==1:#如果井字棋中心位置是人下的,ai只能下四角不然ai输。
            #定义随机下四角
            suiji=[[1,1],[1,3],[3,1],[3,3]]
            suiji1=random.choice(suiji)
            luozi(a,suiji1,c)
            return 0
        if a[1][1]==b and e==2 and ((a[0][0]==b and a[2][2]==c) or (a[0][2]==b and a[2][0]==c) or (a[2][0]==b and a[0][2]==c) or (a[2][2]==b and a[0][0]==c)):#一个特殊情况,其他情况就先调用进攻方法再调用防守方法(下面会做介绍)
            suiji=[[1,1],[1,3],[3,1],[3,3]]
            while True:
                suiji1=random.choice(suiji)
                if a[suiji1[0]-1][suiji1[1]-1]=='0':
                    luozi(a,suiji1,c)
                    break
            return 0
        if a[1][1]==b and e==2:
            if ailuozi(a,c)==0:
                return 0
            else:
                duzi(a,b,c)
                return 0
        if a[1][1]==b and e>2:
            if ailuozi(a,c)==0:
                return 0
            else:
                duzi(a,b,c)
                return 0
        if a[1][1]!=b and e==1:
            luozi(a,[1][1],c)
            return 0
        if a[1][1]!=b and e>=2:
            if ailuozi(a,c)==0:
                return 0
            else:
                duzi(a,b,c)
                return 0
        else:
            if ailuozi(a,c)==0:
                return 0
            else:
                duzi(a,b,c)
                return 0
    if d==2 and e==2:
        if a[0][1]==b or a[1][0]==b or a[1][2]==b or a[2][1]==b:
            suiji=[[1,1],[1,3],[3,1],[3,3]]
            suiji1=random.choice(suiji)
            luozi(a,suiji1,c)
            return 0
        if a[0][0]==b or a[0][2]==b or a[2][0]==b or a[2][2]==b:
            suiji=[[1,1],[1,3],[3,1],[3,3]]#随机落子害好复杂没时间了
            while True:
                suiji1=random.choice(suiji)
                if a[suiji1[0]-1][suiji1[1]-1]=='0':
                    luozi(a,suiji1,c)
                    break
            return 0
    if d==2 and e>2:
        if ailuozi(a,c)==0:
            return 0
        else:
            duzi(a,b,c)
            return 0
while True:
    game=int(input("选择与谁下?1:与你的朋友。2:与AI下。3:退出游戏"))
    a=[['0','0','0'],['0','0','0'],['0','0','0']]#注意是str'0'
    if game==1:
        b1=input("你用什么符号?")
        b2=input("你对手用什么符号?")
        printf(a)
        while True:
            c=list(input("请落子(标准是数字,数字举例(11)就是在第一行,第一列落子)"))
            luozi(a,c,b1)
            printf(a)
            if shuying(a,b1)==1:
                print(b1,"方胜利")
                break
            c=list(input("(对手)请落子(标准是数字,数字举例(11)就是在第一行,第一列落子)"))
            luozi(a,c,b2)
            printf(a)
            if shuying(a,b2)==1:
                print(b2,"方胜利")
                break
            if '0' not in a[0] and '0' not in a[1] and '0' not in a[2]:
                print('平局!')
                break
        print("游戏结束:")
    if game==2:
        p=int(input("谁先下?1:AI这么强当然是我先下拉。2:AI算什么让它先下。"))
        b2='x'
        if p==1:
            e=1
            b1=input("你用什么符号?AI用的是x符号")
            printf(a)
            while True:
                c=list(input("请落子(标准是数字,数字举例(11)就是在第一行,第一列落子)"))
                luozi(a,c,b1)
                printf(a)
                print("AI落子")
                time.sleep(1)
                if shuying(a,b1)==1:
                    print("怎么可能你尽然胜利了!")
                    break
                AI(a,b1,b2,p,e)
                e+=1
                printf(a)
                if shuying(a,b2)==1:
                    print("AI胜利,AI表示你这个人类很谦虚")
                    break
                if '0' not in a[0] and '0' not in a[1] and '0' not in a[2]:
                    print('平局')
                    break
        if p==2:
            b1=input("你用什么符号?AI用的是x符号")
            del a[1][1:2];a[1].insert(1,b2)
            printf(a)
            c=list(input("请落子(标准是数字,数字举例(11)就是在第一行,第一列落子)"))
            luozi(a,c,b1)
            printf(a)
            e=2
            while True:
                AI(a,b1,b2,p,e)
                e+=1
                print("AI落子")
                time.sleep(1)
                printf(a)
                if shuying(a,b2)==1:
                    print("AI胜利")
                    str1='哈哈哈,愚蠢的人类还敢小看我!'
                    for i in str1:
                        time.sleep(0.5)
                        print(i,end="")
                    break
                c=list(input("请落子(标准是数字,数字举例(11)就是在第一行,第一列落子)"))
                luozi(a,c,b1)
                printf(a)
                if shuying(a,b1)==1:
                    print("怎么可能你尽然胜利了!")
                    break 
                if '0' not in a[0] and '0' not in a[1] and '0' not in a[2]:
                    print('平局')
                    break
    if game==3:
        break

相关说明

前两轮就是下,第三轮就要用到堵子和进攻方法。(这里就体现了参数e的重要性了)
先进攻:判断那个方法(15种)可以赢。注意我进攻方法每种情况都return了,就是防止连续判断。

if ailuozi(a,c)==0:
                return 0
            else:
                duzi(a,b,c)
                return 0
   

time包就是更加真实吧
最后还可以加上,判断棋盘上先有没有棋子。没有才可以下(很简单的代码加在每次落子前面)根据返回值来判断。

def panduan(a,c)#a还是棋盘c是一个含两个元素的list
    if a[int(c[0])-1][int(c[1])-1]!='0':
        print("该位置已经有棋子了!请重新落子")
        return 0
    else:
        luozi(a,c,b)#b棋子
        return 1
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值