Exemple #1
0
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)
Exemple #2
0
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