Ejemplo n.º 1
0
class Player(object):
 
    difficulty = {"Easy": 7.5,
                  "Medium": 15,
                  "Hard": 20}   
    
    def __init__(self, canvas, name="CPU", difficulty="Medium", pos=[70,70], width = 10, height=100, color="#fb0"):
        
        self.canvas = canvas        
        self.name = name
        self.pos = pos
        self.width = width
        self.height = height
        self.turn = True
        self.color =color
        
        self.player_steps={"Up": self.difficulty[difficulty],
                           "Down": -self.difficulty[difficulty]}
        
        self.paddle = Paddle(self.canvas, 1, self.pos, self.width, self.height, self.color)
       

    def check_collision(self, ball_xy):
        return self.paddle.check_collision(ball_xy)


    def update(self, ball):
        pos = self.paddle.get_position()
        if (pos[1]>ball.get_center()[1]):
            self.paddle.update_position(self.player_steps["Up"])
        else:
            self.paddle.update_position(self.player_steps["Down"])
Ejemplo n.º 2
0
class PongGUI(Frame):
  
    player_1 = {'Up'  :-5, 
                'Down': 5}  
    player_2 = {'w':-5, 
                's': 5}  
                 
    cpu_level = {'Easy'  : {'Up'  :  -3,
                            'Down':   3},
                 'Medium': {'Up'  :  -9,
                            'Down':   9},
                 'Hard'  : {'Up'  : -15,
                            'Down':  15} }
    score = [0,0]
    plays =1

    cpu_enable = False
    cpu_turn = True
    buffsize = 1024

    
    #List to check all balls
    balls = []
    obs = []
 
    def __init__(self, parent,screen=[600,400]):
        Frame.__init__(self, parent)   
        self.parent = parent     
        self.bg_status = 0
        self.initUI()
        self.key_pressed = set()
        self.obstacles = set()
        
        self.bind_all('<KeyPress>', lambda event: self.key_pressed.add(event.keysym)) 
        self.bind_all('<KeyRelease>', lambda event: self.key_pressed.discard(event.keysym)) 
        
        self.bind_all('<Escape>',self.end)
        self.connect_server() 
        
    def end(self, event):
        self.master.destroy()
        
        
    def connect_server(self):
        self.setup = True
        host = 'localhost'
        port = 9000
        addr = (host, port)
        try: 
            self.tcpclisock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            self.tcpclisock.connect(addr)
            print 'Connected to: ', addr
            self.tcpclisock.setblocking(0)
            self.parent.title("Pong Client "+'Connected to: '+ str(addr))
        except:
            print 'not able to connect to server.'
            self.create_server()

    def create_server(self):
        
        host = ''
        port = 9000
        addr = (host, port)
        self.setup = True
        
        print "makeServer():"
        
        self.tcpsersock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.tcpsersock.bind(addr)
        self.tcpsersock.listen(5)
        self.tcpclisock, addr = self.tcpsersock.accept()
        self.tcpclisock.setblocking(0)
        print 'Connected from: ', addr
        self.parent.title("Pong Server: " + 'Connected from: ' + str(addr))        


    def initUI(self):
      
        self.parent.title("Pong")        
        self.pack(fill=BOTH, expand=1)
        
        self.canvas = Canvas(self, bg="#"+str(self.bg_status)+str(self.bg_status)+str(self.bg_status))
        
        self.left = Paddle(self.canvas, 1, [30, 10], 10, 100,"#fb0")
        self.right = Paddle(self.canvas, 1, [570, 40], 10, 100,"#05f")        
        
        self.balls.append(Ball(self.canvas,1,[70,70],10,[-2,-2]))
        #self.balls.append(Ball(self.canvas,1,[100,100],10,[2,2]))
        #self.balls.append(Ball(self.canvas,1,[200,100],10,[2,-2]))
        #self.balls.append(Ball(self.canvas,1,[100,200],10,[-2,2]))
        
        self.obs.append(Obstacle(self.canvas,[200,200],"Pin",6))
        self.obs.append(Obstacle(self.canvas,[400,300],"Paddle",7))
        self.obs.append(Obstacle(self.canvas,[350,350],"Pin",4))
        self.obs.append(Obstacle(self.canvas,[210,250],"Paddle",8))
        self.obs.append(Obstacle(self.canvas,[250,250],"Size",8))
        self.obs.append(Obstacle(self.canvas,[300,350],"Switch",8))
        self.obs.append(Obstacle(self.canvas,[400,350],"Switch",8))
        self.obs.append(Obstacle(self.canvas,[420,320],"Teleport",6))
        self.obs.append(Obstacle(self.canvas,[250,200],"Gravity",8))
        self.obs.append(Obstacle(self.canvas,[300,50],"Reset",4,[0,1]))
        
        self.canvas.pack(fill=BOTH, expand=1)
        
        self.score_msg = '  Home  0 - 0  Visitor  '
        self.label_score = Label(self, text=self.score_msg, width=len(self.score_msg), bg='yellow')
        
        self.choices = ['Easy', 'Medium', 'Hard']
        self.dificulty = StringVar()
        self.dificulty.set('Medium')
        self.option = OptionMenu(self, self.dificulty, *self.choices)
        self.option.pack(side=LEFT, fill=BOTH)
        self.label_score.pack(side= LEFT, fill=BOTH)
        
        self.text = ""
        self.text_canvas = self.canvas.create_text(300,10, text=self.text, fill="white")
        
        self.after(200, self.update)
    

    def check_keys(self):
        for i in self.key_pressed:
            if i == 'w' or i == 's':
                border = self.left.get_border()
                if 270 >= (self.player_2[i] + border[1]) >=0:
                    self.left.update_position(self.player_2[i])
                
            if i == 'Up' or i == 'Down':
                border = self.right.get_border()
                if 270 >= (self.player_1[i] + border[1]) >=0:
                    self.right.update_position(self.player_1[i])            
    

    def reset(self):
        self.bg_status = 0
        self.plays = 1
        self.__dx = 2
        self.__dy = -2
        self.canvas.configure(bg="#"+str(self.bg_status)+str(self.bg_status)+str(self.bg_status))
        
        
    def check_collision(self):        
       
        #Check obstacle contacts
        for i in self.obs :
            for j in self.balls:
                
                if i.alive and i.vel is not None:
                    i.move()
                
                if i.update(j.get_position()) and j.get_inside():
                    #We have a collision!
                    
                    ball_pos = j.get_center()
                    obs_pos = i.get_position()
                    
                    if i.get_type() == 'Pin':
                        #If pin just ounce back
                        if abs(ball_pos[0] - obs_pos[0]) < abs(ball_pos[1] - obs_pos[1]):
                            j.set_velocity([ j.vel[0], -j.vel[1] ])
                        else:
                            j.set_velocity([ -j.vel[0], j.vel[1] ])
                    
                        j.set_inside(False)
                    
                        if j.get_velocity()[0]<0:
                            self.cpu_turn = True
                        else:
                            self.cpu_turn = False
                    
                    if i.get_type() == 'Size' and 'Size' not in self.obstacles:
                            self.obstacles.add('Size')
                            #Increase size of ball                        
                            self.text += "Size "
                            self.update_text()
                            i.affected = True
                            j.set_radious(20)
                            j.re_draw()
                        
                    if i.get_type() == 'Paddle':
                        #Increase size paddle
                        i.affected = True
                        if j.get_velocity()[0] < 0 and 'Paddle2' not in self.obstacles:
                            self.obstacles.add('Paddle2')
                            self.text += "Paddle2 "                            
                            self.update_text()
                            self.right.length = 150
                            self.right.re_draw()
                        elif j.get_velocity()[0] > 0 and 'Paddle1' not in self.obstacles:
                            self.obstacles.add('Paddle1')
                            self.text += "Paddle1 "                            
                            self.update_text()
                            self.left.length = 150
                            self.left.re_draw()
                    
                    if i.get_type() == 'Switch':
                        #Change controller configuration
                        i.affected = True
                        if j.get_velocity()[0] < 0 and 'Switch2' not in self.obstacles:
                            self.obstacles.add('Switch2')
                            self.text += "Switch2 "                            
                            self.update_text()
                            self.player_2['w'] = -1*self.player_2['w']
                            self.player_2['s'] = -1*self.player_2['s']
                        elif j.get_velocity()[0] > 0 and 'Switch1' not in self.obstacles:
                            self.obstacles.add('Switch1')
                            self.text += "Switch1 "                            
                            self.update_text()
                            self.player_1['Up'] = -1*self.player_1['Up']
                            self.player_1['Down'] = -1*self.player_1['Down']
                    
                    if i.get_type() == 'Teleport':
                        i.affected = True
                        j.set_position([200+int(200*random.random()), 100+int(100*random.random())])
                        j.set_velocity([j.vel[0],j.vel[1]*2*random.random()])
                        j.re_draw()
                        
                    if i.get_type() == "Reset":
                        i.affected = "True"
                        self.obstacle_reset(j)
                    
                elif not i.update(j.get_position()):
                    j.set_inside(True)
                    
                #TODO CHANGE DIRECTION OF GRAVITY RANDOMLY
                if i.get_type() == "Gravity":
                    if i.alive and 'Gravity' not in self.obstacles:
                        self.obstacles.add('Gravity')
                        self.text += "Gravity "
                        self.update_text()
                        j.set_gravity(j.pos[1])
                    elif not i.alive:
                        self.obstacles.discard('Gravity')
                        self.text = self.text.replace('Gravity ',"")
                        self.update_text()
                        if j.gravity:                        
                            j.set_gravity()
                    
    def update_text(self):
        self.canvas.delete(self.text_canvas)
        self.text_canvas = self.canvas.create_text(300,10, text=self.text, fill="white")

    def obstacle_reset(self, ball):
        self.text = ""
        self.update_text()
        
        ball.set_radious(10)
        ball.re_draw()
        self.right.length = 100
        self.right.re_draw()
        self.left.length = 100
        self.left.re_draw()
        self.player_2['w'] = -5
        self.player_2['s'] = 5
        self.player_1['Up'] = -5
        self.player_1['Down'] = 5
        
        if ball.gravity:
            ball.set_gravity()
            #ball.vel[1] = ball.vel[1]+0.1
            
        self.obstacles.clear()
                    

    def check_disable(self):
        for i in self.obs :
            for j in self.balls:
                if not i.affected:
                    if i.type_obstacle == 'Size':
                        j.set_radious(10)
                        j.re_draw()
                    if i.type_obstacle == 'Switch':
                        self.player_2['w'] = -5
                        self.player_2['s'] = 5
                        self.player_1['Up'] = -5
                        self.player_1['Down'] = 5
                    if i.type_obstacle == 'Paddle':
                        self.right.length = 100
                        self.left.length = 100
                        self.right.re_draw()
                        self.left.re_draw()
    


    def restart(self, ball, player):
        ball.set_position([300,250])
        ball.set_velocity([(-4*player)+2,(-4*player)+2])

        ball.set_radious(10)
        self.left.length = 100
        self.right.length = 100
                
        self.left.set_position(self.left.pos)
        self.right.set_position(self.right.pos)

        self.player_2['w'] = -5
        self.player_2['s'] = 5
        self.player_1['Up'] = -5
        self.player_1['Down'] = 5
                        
        if player == 1: 
            self.cpu_turn = True
        
        self.score[player] += 1
        self.update_score()
        self.reset()    

    def check_paddle_collision(self, paddle, ball):
        if paddle.check_collision(ball.get_position()):
            delta_y = ball.get_center()[1] - paddle.get_center()[1]
            ball.set_velocity([-ball.vel[0],ball.vel[1]+0.05*delta_y])
            self.plays +=1
            self.cpu_turn = not self.cpu_turn

            

    def update(self):
     
        self.check_keys()     

        self.check_collision()
        
        #self.check_disable()
        #Update new value fo the ball
        for i in self.balls:
            i.update()
            
            if not (self.plays % 5):
                print "Increasing speed"
                i.set_velocity([1.1*i.vel[0],1.1*i.vel[1]])
                self.plays = 1
                self.bg_status += 1
 
                if self.bg_status ==9:
                    self.bg_status = 0

                self.canvas.configure(bg="#"+str(self.bg_status)+str(self.bg_status)+str(self.bg_status))
                
            if i.get_position()[1] <= 0 or i.get_position()[1] >= 350:
                i.set_velocity([i.vel[0],-i.vel[1]])
       
       
            if i.get_position()[2] >= 580:
                self.obstacle_reset(i)                
                self.restart(i,0)
            elif i.get_position()[0] <= 0:
                self.obstacle_reset(i)                
                self.restart(i,1)                
                
             
            self.check_paddle_collision(self.left,i)
            
            self.check_paddle_collision(self.right,i)
 
            
        if self.cpu_turn and self.cpu_enable:
            for i in self.balls:
                pos = self.left.get_center()
                if (pos[1]>i.get_center()[1]):
                    border = self.left.get_border()
                    if border[1]>0:
                        self.left.update_position(self.cpu_level[self.dificulty.get()]['Up'])#   self.player_1["Up"])
                else:
                    border = self.left.get_border()
                    if border[3]<365:
                        self.left.update_position(self.cpu_level[self.dificulty.get()]['Down'])#self.player_1["Down"])
            
        self.after(10, self.update)
 
    def update_score(self):
        self.label_score['text']=self.score_msg[:8]+str(self.score[0])+self.score_msg[9:12]+str(self.score[1])+self.score_msg[13:]
        self.label_score.update()