Python cho người Việt

Python cho người Việt

Entries tagged “battleship”

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.

Tranh tài Bắn Suồng

written by vithon, on Nov 26, 2010 10:23:00 AM.

Cập nhật: Phiên bản battleship.zip cũ có lỗi. Các bạn tải về bản mới hoặc sửa dòng player2_mod = __import__(opts.player_1) thành player2_mod = __import__(opts.player_2). Xin cáo lỗi vì sự phiền toái này.

Nhóm PCNV hân hạnh tổ chức một cuộc thi mới: Tranh tài Bắn Suồng!

Bắn Suồng (xin lỗi vì sai chính tả, nhưng để giữ chữ viết tắt BS nên tôi đành phải đặt tên trò chơi là vậy) không phải là một trò chơi thông thường. Để chơi trò chơi này, các bạn phải viết mã bằng ngôn ngữ… (cho xin 500 đồng trống và kèn cho hào hứng tí nào) Python để điều khiển các đối tượng trong trò chơi.

Các bạn có thể tải trò chơi về tại địa chỉ http://www.vithon.org/static/battleship.zip.

Cuộc thi Bắn Suồng được tổ chức với thể lệ như sau:

  1. Mô-đun (các tập tin .py) tham gia phải gửi về cho admin+thư-rác@vithon.org (bỏ phần + thư rác) trước ngày 12 tháng 12 năm 2010.
  2. Các bài thi này sẽ được kiểm tra trước khi được chấp nhận cho thi.
  3. Các bài tham dự sẽ đấu vòng tròn tính điểm. Thắng sẽ được 3 điểm, hòa được 1, và thua được 0 điểm.
  4. Các trận đấu sẽ được truyền hình (qua web) trực tiếp vào ngày 12 tháng 12.
  5. Vùng biển sẽ có kích thước ngẫu nhiên với độ rộng và dài tối thiểu là 10, và tối đa là 15.
  6. Một giải nhất sẽ nhận được 01 chiếc áo Vithon miễn phí, và có thể mua thêm 01 chiếc áo khác với giá ưu đãi 100.000!
  7. Quyết định của ban tổ chức là cuối cùng. Xin được phép không nhận khiếu nại.

Để trao đổi về cuộc thi này, cũng như các vấn đề liên quan đến lập trình Python, các bạn có thể sử dụng diễn đàn của nhóm hoặc liên hệ qua IRC.

Nhóm PCNV rất mong nhận được sự tham gia nhiệt tình của các bạn.