1. 程式人生 > >python的一個小遊戲之五子棋

python的一個小遊戲之五子棋

原始碼如下:

from tkinter import *

root = Tk()


canvas = Canvas(root,width = 400,height = 300)


###global clounm


curwho= 1 ##1 yellow -1 blue
over   = False


num = 10
xcount = (400/num)
ycount = (300/num)


winpos = [[0 for col in range(11)]for row in range(11)]
#print(winpos)


def xycheck(xline,yline,csum):
    global curwho,winpos


    xtmp = xline
    ytmp = yline
    while xtmp >= 0:
        #print('whowin while2',xtmp)
        xtmp = xtmp -1
        if winpos[xtmp][yline] == curwho:
            csum = csum + 1
        else:
            break


    xtmp = xline
    while xtmp <= 10:
        #print('whowin while3',xtmp)
        xtmp = xtmp + 1
        if winpos[xtmp][yline] == curwho:
            csum = csum + 1
        else:
            break
    return csum






def udcheck(xline,yline,csum):
    global curwho,winpos


    xtmp = xline
    ytmp = yline
    while ytmp >= 0:
        #print('whowin while2',ytmp)
        ytmp = ytmp -1
        if winpos[xline][ytmp] == curwho:
            csum = csum + 1
        else:
            break


    ytmp = yline
    while ytmp <= 10:
        #print('whowin while3',ytmp)
        ytmp = ytmp + 1
        if winpos[xline][ytmp] == curwho:
            csum = csum + 1
        else:
            break
    return csum




def lwcheck(xline,yline,csum):
    global curwho,winpos
    xtmp = xline
    ytmp = yline
    while ytmp >= 0 and xtmp>=0:
        #print('whowin while2',xtmp,ytmp)
        ytmp = ytmp -1
        xtmp = xtmp -1
        if winpos[xtmp][ytmp] == curwho:
            csum = csum + 1
        else:
            break


    xtmp = xline
    ytmp = yline
    while ytmp <= 10 and xtmp<=10:
        #print('whowin while3',xtmp,ytmp)
        ytmp = ytmp + 1
        xtmp = xtmp + 1
        if winpos[xtmp][ytmp] == curwho:
            csum = csum + 1
        else:
            break
    return csum


def rwcheck(xline,yline,csum):
    global curwho,winpos
    xtmp = xline
    ytmp = yline
    while ytmp<=10 and xtmp>=0:
        #print('whowin while2',xtmp,ytmp)
        ytmp = ytmp +1
        xtmp = xtmp -1
        if winpos[xtmp][ytmp] == curwho:
            csum = csum + 1
        else:
            break


    xtmp = xline
    ytmp = yline
    while ytmp >= 0 and xtmp<=10:
        #print('whowin while3',xtmp,ytmp)
        ytmp = ytmp - 1
        xtmp = xtmp + 1
        if winpos[xtmp][ytmp] == curwho:
            csum = csum + 1
        else:
            break
    return csum




def winmessage():
    global curwho
    if curwho == 1:
        msg = 'Red player Win'
    else:
        msg = 'Blue player Win'
    messagebox.showinfo(title='Gameover',message = msg)
    




##判斷勝負
def whowin(xline,yline):
    global winpos,curwho,xyIsover,over
    #print('whowin begin',xline)
    csum = 1
    xyIsover = False
    #print('whowin while1 csum is:',csum)
    #print('Isover is:',xyIsover)


    csum1 = xycheck(xline,yline,csum)
    csum2 = udcheck(xline,yline,csum)
    csum3 = lwcheck(xline,yline,csum)
    csum4 = rwcheck(xline,yline,csum)


    ctmp = (csum1 if csum1>csum2 else csum2)
    ctmp = (ctmp if ctmp>csum3 else csum3)
    ctmp = (ctmp if ctmp>csum4 else csum4)


    if ctmp >= 5:
        over = True
        return curwho
    else:
        return 0


                    


##繪製棋子
def pcricle(x,y,size,color):
    canvas.create_oval(x,y,x+size,y+size,fill = color)


##確定事件位置呼叫繪製
def paint(event):
    global curwho,over,xcount,ycount,winpos
    if over:
        return
    col = 'blue'
    if curwho == 1:
        col = 'red'


    ###標識每個可繪點的狀態,防止多次重繪
    #print('eventx is :\n ,eventy is :\n',event.x,event.y)
    #print('xcount is:ycount is :',xcount,ycount)
    x = event.x
    y = event.y
    xpos = 0
    ypos = 0
    numx = int(x/xcount)
    numy = int(y/ycount)


    if x - numx*xcount <= xcount/3:
        xpos = numx*xcount
    elif x - numx*xcount > xcount/3 and x - numx*xcount < xcount*2/3:
        return
    else:
        xpos = (numx+1)*(xcount)


    if y - numy*ycount <= ycount/3:
        ypos = numy*ycount
    elif y - numy*ycount > ycount/3 and y - numy*ycount < ycount*2/3:
        return
    else:
        ypos = (numy+1)*(ycount)


    #print('xpos is :\n ,ypos is :\n',xpos,ypos)


    ##如果當前的位置已經下棋子了,不繪圖,返回
    if winpos[int(xpos/xcount)][int(ypos/ycount)] != 0:
        return 0
    
    pcricle(xpos - xcount*0.3,ypos -xcount*0.3,xcount*0.6,col)
    
    ##設定位置為已經記錄,1表示red,-1表示blue
    xline = int(xpos/xcount)
    yline = int(ypos/ycount)
    if curwho == 1:
        winpos[xline][yline] = 1
    else:
        winpos[xline][yline] = -1
    #print(winpos)


    #print('here ok')
    win = whowin(xline,yline)
    if win != 0:
        winmessage()
        return -1
    else:
        curwho = curwho*(-1)
        return 0
    
#end paint




img = PhotoImage(file = 't01b24a8ad021f824a2.gif')
canvas.create_image(200,0,image = img,anchor = 'n',tags = 't1')






for line in range(0,num):
    xline = 'x%d'%line
    canvas.create_line(line*xcount,0,line*xcount,300,fill = '#FFFF00',tags = xline)
    canvas.tag_bind(xline,'<Button-1>',paint)
    #pcricle(line*xcount+5,2,xcount*0.65,'#FFFF00')
    


for line in range(0,num):
    yline = 'y%d'%line
    canvas.create_line(0,ycount*line,400,ycount*line,fill = '#FFFF00',tags = yline)
    canvas.tag_bind(yline,'<Button-1>',paint)






canvas.pack(side= LEFT,expand =YES,fill = BOTH)


root.geometry('400x300+500+300')
root.title('Line5')
root.resizable(False,False)

root.mainloop()

其中在載入圖片為隨意找的一個

實現的是最低階的五子棋實現,目前只可以在本機人人對弈,接下來會嘗試實現本機人機對戰