使用python中的turtle庫實現棋盤棋子的控制。
程式功能:遊戲雙方輪流使用滑鼠進行落子,並自動判定勝負
查閱資料可知,標準五子棋棋盤大小為15格*15格
考慮電腦螢幕大小,取棋盤大小為420*420
用灰色填充棋盤區域
color('grey')
begin_fill()
penup()
goto(-210,-210)
pendown()
goto(-210,210)
goto(210,210)
goto(210,-210)
goto(-210,-210)
end_fill()
color('black')
for i in range(-210,211,30):
penup()
goto(i,-550)
pendown()
goto(i,550)
for i in range(-210,211,30):
penup()
goto(-550,i)
pendown()
goto(550,i)
此處使用了奇怪的實現方式,不建議學習。**如下:
for i in range(1,16):
for j in range(1,16):
for x in range(-240+30*i-15,-240+30*i+15):
for y in range(240-30*j-15,240-30*j+15):
p[(x,y)]=(i,j)
p是從螢幕上點的座標到棋盤上的行、列數的對映
用乙個 bool變數表示 [當前是白方回合]
def play(x,y):
global t
t=not t
每次呼叫play函式都交換落子權
if t:
color('white')
draw(p[0],p[1])
m[p]=-1
else:
color('black')
draw(p[0],p[1])
m[p]=1
if (x,y) not in p:
t=not t
return
p=p[(x,y)]
if m[p]!=0:
t=not t
return
其中m的含義在交換落子權處可以看出。
m[p]=1表示p點有黑棋,m[p]=-1表示有白棋,m[p]=0表示沒有棋子
def game_end(x,y):
global gmov
for i in tw:
tot[i]=0
xn=x+i[0]
yn=y+i[1]
while (xn in range(1,16)) and (yn in range(1,16)) and m[(xn,yn)]==m[(x,y)]:
tot[i]=tot[i]+1
xn=xn+i[0]
yn=yn+i[1]
for i in range(4):
if tot[tw[i]]+tot[tw[7-i]]+1 >= 5:
begin_fill()
penup()
goto(-210,-210)
pendown()
goto(-210,210)
goto(210,210)
goto(210,-210)
goto(-210,-210)
end_fill()
print("game over")
gmov=true
return
如上,在每次落子後向周圍8個方向搜尋連續的相同顏色的棋子的個數。
from turtle import *
ht()
speed(0)
rt(90)
gmov=false
# 15*15
def drawnet():
# too slow?
# use:
# tracer(false)
color('grey')
begin_fill()
penup()
goto(-210,-210)
pendown()
goto(-210,210)
goto(210,210)
goto(210,-210)
goto(-210,-210)
end_fill()
color('black')
for i in range(-210,211,30):
penup()
goto(i,-550)
pendown()
goto(i,550)
for i in range(-210,211,30):
penup()
goto(-550,i)
pendown()
goto(550,i)
t=true
m={}
p={}
for i in range(1,16):
for j in range(1,16):
for x in range(-240+30*i-15,-240+30*i+15):
for y in range(240-30*j-15,240-30*j+15):
p[(x,y)]=(i,j)
m[(i,j)]=0
tw=[(-1,-1),(-1,0),(-1,1),(0,-1),(0,1),(1,-1),(1,0),(1,1)]
tot={}
def game_end(x,y):
global gmov
for i in tw:
tot[i]=0
xn=x+i[0]
yn=y+i[1]
while (xn in range(1,16)) and (yn in range(1,16)) and m[(xn,yn)]==m[(x,y)]:
tot[i]=tot[i]+1
xn=xn+i[0]
yn=yn+i[1]
for i in range(4):
if tot[tw[i]]+tot[tw[7-i]]+1 >= 5:
begin_fill()
penup()
goto(-210,-210)
pendown()
goto(-210,210)
goto(210,210)
goto(210,-210)
goto(-210,-210)
end_fill()
print("game over")
gmov=true
return
def draw(i,j):
x=-240+30*i
y=240-30*j
penup()
goto(x-5,y)
pendown()
begin_fill()
circle(5)
end_fill()
def play(x,y):
if(gmov):
return
global t
t=not t
if (x,y) not in p:
t=not t
return
p=p[(x,y)]
if m[p]!=0:
t=not t
return
if t:
color('white')
draw(p[0],p[1])
m[p]=-1
else:
color('black')
draw(p[0],p[1])
m[p]=1
game_end(p[0],p[1])
def undo(x,y):
print("sorry,not supported yet.")
setup(550,550)
drawnet()
onscreenclick(play,1,none)
onscreenclick(undo,3,none)
done()
Python實現AI五子棋
開發工具 python版本 3.6.4 graphics模組。環境搭建 安裝python並新增到環境變數即可。注 graphics模組在相關檔案中已經提供,就是乙個py檔案,直接放在當前路徑或者放到python安裝資料夾下的site packages資料夾內均可。原理簡介 對於五子棋這樣的博弈類ai...
Java實現五子棋
一定義常量類 public class constant二定義我們的棋盤類 public class chess private void playchess 錯誤輸入 if str.length 2 正常輸入的情況 判斷是否越界 if isoverstep str else end if 判斷是否...
C 實現五子棋
自己寫了一下午,但是還是除錯的時候存在很多問題 繼續改善繼續調整 game.h define game h define row 5 define col 5 void displayboard char board row col int row,int col void gameplayer c...