classic game:Tic-Tac-Toe

This is the place to post any code that you want to share with the community. Only completed scripts should be posted here.

classic game:Tic-Tac-Toe

Postby jelseg » Mon Jun 17, 2013 11:58 am

I'm new to python and this was the first real game I made, I added the GUI later. To play you just click on the board.

Code: Select all
import random
import pygame
import sys
import time
pygame.init()

height=350
width=350

clock=pygame.time.Clock()
font=pygame.font.Font(None,height/5-10)
label1=font.render("you won!",0,(0,0,0))
label2=font.render("you lost!",0,(0,0,0))
label3=font.render("play again?",0,(0,0,0))
label4=font.render("Yes",0,(0,0,0))
label5=font.render("No",0,(0,0,0))

class Bord:
    def __init__(self,H,W):
        self.H=H
        self.W=W
        self.bord=[0,0,0,0,0,0,0,0,0,0]
        self.coordinaten=[0,(25,25+2*(self.H-50)/3),(25+(self.W-50)/3,25+2*(self.H-50)/3),(25+2*(self.W-50)/3,25+2*(self.H-50)/3),(25,25+(self.W-50)/3),(25+(self.W-50)/3,25+(self.W-50)/3),(25+2*(self.W-50)/3,25+(self.W-50)/3),(25,25),(25+(self.W-50)/3,25),(25+2*(self.W-50)/3,25)]
        self.surface=pygame.display.set_mode((W,H))
        pygame.display.set_caption('tic-tac-toe')
        if self.H <= self.W:
            self.R=(self.H-50)/6-7
        else :
            self.R=(self.W-50)/6-7
        self.posible=[1,2,3,4,5,6,7,8,9]
       
    def draw(self):
        self.surface.fill((236,199,113))
        pygame.draw.rect(self.surface,(0,0,0),(25,25,self.H-50,self.W-50),3)
        pygame.draw.line(self.surface,(0,0,0),(25+(self.W-50)/3,25),(25+(self.W-50)/3,self.H-25))
        pygame.draw.line(self.surface,(0,0,0),(25+2*(self.W-50)/3,25),(25+2*(self.W-50)/3,self.H-25))
        pygame.draw.line(self.surface,(0,0,0),(25,25+(self.H-50)/3),(self.W-25,25+(self.H-50)/3))
        pygame.draw.line(self.surface,(0,0,0),(25,25+2*(self.H-50)/3),(self.W-25,25+2*(self.H-50)/3))

    def drawX(self,number):
        self.bord[number]=1
        self.posible.remove(number)
        pygame.draw.line(self.surface,(22,22,22),(self.coordinaten[number][0]+5,self.coordinaten[number][1]+5),(self.coordinaten[number][0]+(self.W-50)/3-5,self.coordinaten[number][1]+(self.H-50)/3-5),4)
        pygame.draw.line(self.surface,(22,22,22),(self.coordinaten[number][0]+5,self.coordinaten[number][1]+(self.H-50)/3-5),(self.coordinaten[number][0]+(self.W-50)/3-5,self.coordinaten[number][1]+5),4)

    def drawO(self,number):
        self.bord[number]=2
        self.posible.remove(number)
        pygame.draw.circle(self.surface,(22,22,22),(self.coordinaten[number][0]+(self.W-50)/6,self.coordinaten[number][1]+(self.H-50)/6),self.R,4)

    def ask(self):
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                pygame.quit()
                return 0
            if event.type==pygame.MOUSEBUTTONDOWN:
                x,y=event.pos
                if x>25 and x<(25+(self.W-50)/3):
                    if y>25 and y<(25+(self.H-50)/3):
                        return 7
                    if y>(25+(self.H-50)/3) and y<(25+2*(self.H-50)/3):
                        return 4
                    if y>(25+2*(self.H-50)/3) and y<(self.H-25):
                        return 1
                elif x>(25+(self.W-50)/3) and x<(25+2*(self.W-50)/3):
                    if y>25 and y<(25+(self.H-50)/3):
                        return 8
                    if y>(25+(self.H-50)/3) and y<(25+2*(self.H-50)/3):
                        return 5
                    if y>(25+2*(self.H-50)/3) and y<(self.H-25):
                        return 2
                elif x>(25+2*(self.W-50)/3) and x<(self.W-25):
                    if y>25 and y<(25+(self.H-50)/3):
                        return 9
                    if y>(25+(self.H-50)/3) and y<(25+2*(self.H-50)/3):
                        return 6
                    if y>(25+2*(self.H-50)/3) and y<(self.H-25):
                        return 3

    def reset(self):
        self.bord=[0,0,0,0,0,0,0,0,0,0]
        self.posible=[1,2,3,4,5,6,7,8,9]
       


def won(lijst,who):  #who is 1(for X) or 2 (for O)
    if lijst[1]==lijst[2]==lijst[3]==who or lijst[4]==lijst[5]==lijst[6]==who or lijst[7]==lijst[8]==lijst[9]==who or lijst[1]==lijst[4]==lijst[7]==who or lijst[5]==lijst[2]==lijst[8]==who or lijst[9]==lijst[6]==lijst[3]==who or lijst[1]==lijst[5]==lijst[9]==who or lijst[7]==lijst[5]==lijst[3]==who :
        return True
    else:
        return False

def canwin(lijst,who,posible):
    for i in posible:
        f=lijst[:]
        f[i]=who
        if won(f,who):
            return i
    return 0

def AI(bord):
    a=canwin(bord.bord,1,bord.posible)
    b=canwin(bord.bord,2,bord.posible)
    if a<>0:
        bord.drawX(a)
    elif b<>0:
        bord.drawX(b)
    else:
        freecorner=[]
        for i in [1,3,7,9]:
            if i in bord.posible:
                freecorner+=[i]
        g=len(freecorner)
        if g==0:
            if 5 in bord.posible:
                bord.drawX(5)
            else:
                c=len(bord.posible)-1
                d=random.randint(0,c)
                e=bord.posible[d]
                bord.drawX(e)
        else:
            d=random.randint(0,g-1)
            e=freecorner[d]
            bord.drawX(e)

def playagain(bord):
    bord.surface.fill((255,255,255))
    bord.surface.blit(label3,((width/8),(height/3)))
    bord.surface.blit(label4,(10,2*height/3))
    bord.surface.blit(label5,(2*width/3,2*height/3))
    p=True
    while p== True:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type==pygame.MOUSEBUTTONDOWN:
                x,y=event.pos
                if x<(width/2) and y>(2*height/3):
                    p=False
                    bord.reset()
                    bord.draw()
                elif y>(2*height/3):
                    pygame.quit()
                    sys.exit()
        pygame.display.flip()
        clock.tick(15)

def start(bord):
    begin=random.randint(1,2)
    if begin==1:
        AI(bord)
         
         
speelbord=Bord(height,width)
number=10
speelbord.draw()
start(speelbord)
while number<>0 :
    asking=True
    while asking:
        pygame.display.flip()
        number=speelbord.ask()
        if number in speelbord.posible:
            speelbord.drawO(number)
            asking=False
        win=won(speelbord.bord,2)
        if win:
            speelbord.surface.blit(label1,((1*width/5),(2*height/5)))
        if win or len(speelbord.posible)==0:
            pygame.display.flip()
            time.sleep(1.5)
            playagain(speelbord)
            begin=random.randint(1,2)
            if begin==1:
                asking=True

    AI(speelbord)
    win=won(speelbord.bord,1)
    if win:
        speelbord.surface.blit(label2,((1*width/5),(2*height/5)))
    if win or len(speelbord.posible)==0:
        pygame.display.flip()
        time.sleep(1.5)
        playagain(speelbord)
        start(speelbord)
jelseg
 
Posts: 3
Joined: Mon Jun 17, 2013 11:25 am

Return to Completed Scripts

Who is online

Users browsing this forum: Bing [Bot] and 2 guests