class BoardManager(): def __init__(self, nw_tile, nh_tile): self.nw_tile = nw_tile # Set number of tile in x self.nh_tile = nh_tile # Set number of tile in y self.number_body = 3 # Set number of snake's body self.score = 0 # Set score of sanke self.db_save_size = 6 # Column size of data base self.id = 0 # index of database's column self.type = 1 self.x = 2 self.y = 3 self.s = 4 self.t = 5 self.enemy_dict = {} # Enemy snake dictionary self.client_state_dict = { 'OK': 0, 'notNStart': 1, 'notNExit': 2 } # KList state of client self.client_state = self.client_state_dict[ 'notNStart'] # State of cleint self.play_state = False # Playing state self.game_time = 0 # time of game self.tile_mng = TileManager(width, height, self.nw_tile, self.nh_tile) # Set TileManager self.snake = Snake(1, 1, self.tile_mng, green, SNAKE, raw_input("Enter : "), self.number_body) # Set my sanke self.apple = Apple(0, 0, self.tile_mng, red, 0) # Set apple self.hud = HUD() # Set HUD # Update board def update(self): for event in pygame.event.get(): # Check all event if event.type == pygame.QUIT: # Click Quit to quit program pygame.quit() # quit programe quit() if event.type == pygame.KEYDOWN: # If pressed keyboard if event.key == pygame.K_LEFT and not self.snake.get_move_list( 'right'): # Pressed left and not go right self.snake.set_left() # Go left elif event.key == pygame.K_RIGHT and not self.snake.get_move_list( 'left'): # Pressed right and not go left self.snake.set_right() # Go right elif event.key == pygame.K_UP and not self.snake.get_move_list( 'down'): # Pressed up and not go down self.snake.set_up() # Go up elif event.key == pygame.K_DOWN and not self.snake.get_move_list( 'up'): # Pressed down and not go up self.snake.set_down() # Go down elif event.key == pygame.K_x: # Press x self.snake.snake_slide(self.snake.get_move(), self.apple) # Use slide snake skill elif event.key == pygame.K_c: # Press c self.snake.snake_running() # Use running snake skill x_pos_ls = [ int(self.snake.get_x_pos()[i] / self.tile_mng.get_sizew_tile()) for i in range(self.snake.get_number_body()) ] # set x's list y_pos_ls = [ int(self.snake.get_y_pos()[i] / self.tile_mng.get_sizeh_tile()) for i in range(self.snake.get_number_body()) ] # set y's list x_pos_n = self.client.pos_pattern( x_pos_ls) # save in string in postion pattern (x, y) y_pos_n = self.client.pos_pattern(y_pos_ls) pattern = self.client.set_pattern(self.snake.get_id(), [ self.snake.get_type(), x_pos_n, y_pos_n, self.snake.get_score(), 0 ]) # set pattern of all data # id,type,xs,ys,score,time if self.client_state == self.client_state_dict[ 'OK']: # Client state is "OK" self.snake.snake_eat_apple( self.apple) # Check does snake eat apple ? self.snake.update() # Update snake if self.apple.get_eaten(): # Apple is eaten by snake pattern = "eaten" # pattern is "eaten" self.apple.set_eaten(False) # Apple is not eaten self.client.send(pattern) # Send pattern to client data, addr = self.client.recv() # Receive data from server if data == None: # Data is none => exit method return if data == "notNStart": # data is notNStart => set client state self.client_state = self.client_state_dict['notNStart'] elif data == "notNExit": # data is notNExit => set client state self.client_state = self.client_state_dict['notNExit'] else: # otherwise self.client_state = self.client_state_dict[ 'OK'] # Set client state to "OK" split_list = self.client.split(data) # Split data for ls in split_list: self.game_time = int(ls[self.t]) # set time if ls[self.id] == "*": # See id of apple self.apple = Apple(int(ls[self.x]), int(ls[self.y]), self.tile_mng, red, str(ls[self.type])) elif ls[self.id] != self.snake.get_id() and ls[ self.id] != "*": # See enemy snake's id self.enemy_dict[ls[self.id]] = Snake( 0, 0, self.tile_mng, blue, ls[self.type], ls[self.id], 0) # Save in dictionary of enemy snake x_pos = self.client.pos_split(ls[self.x]) y_pos = self.client.pos_split(ls[self.y]) x_list = [ int(x_pos[i] * self.tile_mng.get_sizew_tile()) for i in range(len(x_pos)) ] y_list = [ int(y_pos[i] * self.tile_mng.get_sizeh_tile()) for i in range(len(y_pos)) ] self.enemy_dict[ls[self.id]].set_pos( x_list, y_list) # Set postion enemy snake # Render board def render(self): # Render board game_display.fill(white) # Background if self.client_state == self.client_state_dict[ 'OK']: # Client state is OK if self.snake.state == 'dead': # If dead # Draw dead HUD self.hud.dead_hud(game_display, self.snake.get_dead_ellapse(), self.snake.get_dead_delay(), width / 2, height / 2, width / 3, height / 3) else: self.apple.render(game_display) # Render Apple self.snake.render(game_display, self.snake.get_number_body() - 1) # render snake for key in self.enemy_dict: # Render enemy snake self.enemy_dict[key].render( game_display, self.enemy_dict[key].get_number_body() - 1) # Draw time's hud, score' hud, gauge's hud self.hud.time_hud(game_display, self.game_time, width / 2, height * 0.05) self.hud.score_hud(game_display, self.snake.get_score(), width * 0.8, height * 0.05) self.hud.gauge_hud( game_display, min( self.snake.get_slide_ellapse() / self.snake.get_slide_delay(), 1), 0.6 * width, 0.95 * height, 0.4 * width, 0.02 * height) self.hud.gauge_hud( game_display, min( self.snake.get_run_use_ellapse() / self.snake.get_run_use_delay(), 1), 0.6 * width, 0.97 * height, 0.4 * width, 0.02 * height) pygame.display.update() # Update display def loop(self): # Loop to play always self.ip = raw_input("IP : ") # Get IP self.client = ClientManager(self.ip, 8000) # Set client packet = str( "tile:" + str(width) + "," + str(height) + "," + str(self.nw_tile) + "," + str(self.nh_tile) ) # Set pattern : width, height program and number of tile program self.client.send(packet) # Send data to server self.client.close() # Disconnnet socket while True: try: self.client = ClientManager(self.ip, 8000) # Set client self.update() # Update program self.render() # Render program self.client.close() # Disconnect from socket except KeyboardInterrupt: pygame.quit() # Quit program quit() pygame.quit() # Quit program quit()