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

python井字棋快来看看孩子的头发
怎么用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