Python cho người Việt

Python cho người Việt

Entries tagged “bach phat bach trung”

Kết quả 100 phát 100 trúng

written by Nguyễn Thành Nam, on Dec 21, 2010 11:38:00 AM.

Để tóm gọn và đỡ tốn thời gian, giải thưởng thuộc về Nhâm Xuân Nam (cũng là người thắng giải http://www.vithon.org/2010/06/03/kết-quả-cuộc-thi-giải-toan-bằng-python).

Sau đây là bài fire_in_the_hole.py của Nhâm Xuân Nam:

'''
Created on Dec 15, 2010

@author: namnx
'''
import entity
import random
import inspect


class HolePlayer(entity.Player):
	def name_ship(self, ship):
		n = repr(ship.__class__)
		return n[n.index('.') + 1 : -2]

	def on_hit(self, x, y):
		# dont care
		pass

	def orient_ship(self, ship):
		return entity.HORIZONTAL

	def place_ship(self, ship):
		while True:
			x = random.randint(0, self.ocean.width - 1)
			y = random.randint(0, self.ocean.height - 1)
			if not self.t_ocean:
				self.t_ocean = entity.Ocean(self.ocean.width, self.ocean.height)
			try:
				ship.place(self.t_ocean, x, y)
				return (x, y)
			except ValueError:
				pass

	def lock_missile(self, ship):
		opponent_ships = self.get_opponent_ships()
		if self.step < 4:
			if ship.__class__ == entity.Destroyer:
				for s in opponent_ships:
					if (s.__class__ == ship.__class__) and (s.orientation == ship.orientation):
						break
				self.step += 1
				return (s.x, s.y)
			
			for s in opponent_ships:
				if s.__class__ == ship.__class__:
					break;
			self.step += 1
			return (s.x, s.y)
		else:
			for s in opponent_ships:
				if s.__class__ == entity.MissileCruiser:
					break
			if ship.__class__ == entity.MissileCruiser:
				if s.orientation == entity.HORIZONTAL:
					return (s.x-2, s.y)
				else:
					return (s.x, s.y-2)
			else:
				if s.orientation == entity.HORIZONTAL:
					return (s.x+2, s.y)
				else:
					return (s.x, s.y+2)
			

	def get_opponent_ships(self):
		frames = inspect.stack()
		for frame in frames:
			if frame[3] == '__turn':
				break;

		gameObj = frame[0].f_locals['self']
		for i in range(len(gameObj.players)):
			if gameObj.players[i].__class__ != self.__class__:
				break
		return gameObj.ships[i]


def entry(name):
	p = HolePlayer(name)
	p.t_ocean = None
	p.step = 0
	return p

Xin chúc mừng bạn Xuân Nam.