def mainloop (): global items, gameover, clock, digplace global blocked, playerheads digit = 1 clock = pygame.time.Clock() blocked = set(board.obstacles) # playerbodies = [] for player in players: player.start () # TODO: Trow more items on the board! digplace = place(str(digit)) gameover = False playerheads = [] while 1: clock.tick(10) # Render the screen renderer.render() for event in pygame.event.get(): if event.type == pygame.QUIT: return if event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: return for player in players: player.usekey (event.key) if gameover: continue for player in players: if player.dev == "ai" and player.playing: player.aimove() elif player.dev == "net": if player.playing: network.getkey (player) network.sendinfo (player, players, items) for player in players: if player.playing and player.dead == 0: blocked.add(player.gethead()) playerheads = [] dead = set() for player in players: if not player.playing: continue head = player.go() if head != None: playerheads.append(head) # Use this to detect head-to-head # Check if hit the wall or ther players if head in blocked: dead.add(player) if nlpr: for other in players: if other != player: if head in other.body: other.grow (len(player.body)) other.score += len(player.body) # Check if hit any items elif items.has_key(head) : # TODO: Assumed items are only numbers del items[head] player.score += 10 * digit #player.grow(digit * 4) player.grow(digit * 10) digit += 1 if digit < 10 or not numbersend: if digit == 10: digit = random.randint(1,6) digplace = place (str(digit)) else: gameover = True # Detect head-to-head for player1 in players: if player1.playing and playerheads.count(player1.gethead()) > 1: dead.add(player1) # Now see who is dead for player in list(dead): if player.die(): if not cont: gameover = True if remplayers == 0: gameover = True if dead: if digit > 5: digit -= 4 else: digit = 1 items[digplace]["type"] = str(digit) # keep track of player bodies as obstacles as well #playerbodies = reduce(operator.add, (player.body[:] for player in players)) # Check for timer exppirations for loc in items.keys() : item = items[loc] item["timer"] -= 1 if item["timer"] == 0 : type = item["type"] del items[loc] if type in otheritemtypes : place (random.choice(otheritemtypes)) else: # It is number, put the same number somewhere else on the board digplace = place (type)
def init(gametype): global players, items, remplayers global ucolors, udevs, devs, colors global numbersend, lives, netgame global blue, pink, green, red, orange,cyan global nlpr, cont blue = (0,0,255) pink = (255,20,147) green =(0,128,0) red = (255,0,0) orange = (255,165,0) cyan= (0,255,255) if gametype != "join" : list = os.listdir("maps") list.sort() mapname = menu.choose ("Select the map:",\ [{ "label" : file, "value" : file} for file in list]) if mapname == None : return False board.init ("maps/"+ mapname) items = {} # Get Game options boolean = [ { "label" : "On", "value": True }, { "label" : "Off", "value": False } ] multioptions = [ \ { "description" : "NLPR: ", \ "name" : "nlpr", \ "options" : boolean, \ "default" : False, \ }, \ { "description" : "Continue: ", \ "name" : "cont", \ "options" : boolean, \ "default" : False, \ }, \ { "description" : "End with numbers: ", \ "name" : "numbersend", \ "options" : boolean, \ "default" : True, \ }, \ { "description" : "Players: ", \ "name" : "nplayers", \ "default" : 2, \ "options" : [ { "label" : str(x), "value" : x} \ for x in range(1,5) \ ] \ }] if gametype == "1p": multioptions = [] options = menu.select ("Select Game Options", \ multioptions + \ [{ "description" : "Lives: ", \ "name" : "lives", \ "default" : 5, \ "options" : [ { "label" : str(x), "value" : x } \ for x in [1, 2, 3, 4, 5, 10, 20, 50, 64, 100, 256]]} \ ]) if options == None: return False if gametype == "1p": nlpr = False cont = False nplayers = 1 numbersend = True else: nlpr = options["nlpr"]["value"] cont = options["cont"]["value"] nplayers = options["nplayers"]["value"] numbersend = options["numbersend"]["value"] lives = options["lives"]["value"] # Get Players ucolors = set() udevs = set() colors = [blue, pink, green, red, orange, cyan] devs = [("Keypad", "keypad"), \ ("Computer", "ai"), \ ("Keyboard (wasd)", "keyboard"), \ ("Vim Keys (hjkl)", "vim"), \ ("Netwrok", "net") \ ] players = [] netgame = False for i in range(nplayers): player = getplayer(str(i+1)) if player == None: return None players.append(player) if netgame: # network.startserver() for player in players: if player.dev == "net": if network.waitfor(player) == None: network.sendinfo (player, board.dim, board.obstacles) return None renderer.updateboard() remplayers = nplayers return True