python 지뢰 제거 게임 의 예

천둥 을 치 는 것 은 지혜 로 운 작은 게임 이다.이 르 면 1992 년 에 마이크로소프트 가 윈도 에서 발행 했다.게임 은 전 연령 대 에 적합 하고 규칙 이 간단 하 다.즉,가장 짧 은 시간 안에 모든 비 천둥 칸 을 찾아내 고 중간 과정 에서 천둥 을 밟 지 못 하면 천둥 을 밟 으 면 실패 하고 다시 시작 해 야 한다.
본 고 는 Python 을 사용 하여 지뢰 제거 게임 을 실현 합 니 다.주로 Python 라 이브 러 리 는 pygame 입 니 다.
이루어지다
게임 구성 이 비교적 간단 한데 주로 작은 격자,타이머,지뢰 등 을 포함한다.
먼저,우 리 는 상수 들 을 초기 화 합 니 다.예 를 들 어 가로 세로 사각형 수,지뢰 수,마우스 클릭 상황 등 은 다음 과 같 습 니 다.

BLOCK_WIDTH = 30
BLOCK_HEIGHT = 16
#    
SIZE = 20
#    
MINE_COUNT = 66
#    
normal = 1
#    
opened = 2
#   
mine = 3
#      
flag = 4
#      
ask = 5
#     
bomb = 6
#       
hint = 7
#          
double = 8
readied = 1,
started = 2,
over = 3,
win = 4
이 어 하나의 지뢰 류 를 정의 하고 클래스 에서 기본 속성(예 를 들 어 좌표,상태 등)과 get,set 방법 을 정의 하 며 코드 는 다음 과 같다.

class Mine:
 def __init__(self, x, y, value=0):
  self._x = x
  self._y = y
  self._value = 0
  self._around_mine_count = -1
  self._status = normal
  self.set_value(value)
 def __repr__(self):
  return str(self._value)
 def get_x(self):
  return self._x
 def set_x(self, x):
  self._x = x
 x = property(fget=get_x, fset=set_x)
 def get_y(self):
  return self._y
 def set_y(self, y):
  self._y = y
 y = property(fget=get_y, fset=set_y)
 def get_value(self):
  return self._value
 def set_value(self, value):
  if value:
   self._value = 1
  else:
   self._value = 0
 value = property(fget=get_value, fset=set_value, doc='0:    1: ')
 def get_around_mine_count(self):
  return self._around_mine_count
 def set_around_mine_count(self, around_mine_count):
  self._around_mine_count = around_mine_count
 around_mine_count = property(fget=get_around_mine_count, fset=set_around_mine_count, doc='      ')
 def get_status(self):
  return self._status
 def set_status(self, value):
  self._status = value
 status = property(fget=get_status, fset=set_status, doc='BlockStatus')
그 다음 에 Mine Block 류 를 정의 하여 지뢰 제거 의 기본 논 리 를 처리 합 니 다.코드 는 다음 과 같 습 니 다.

class MineBlock:
 def __init__(self):
  self._block = [[Mine(i, j) for i in range(BLOCK_WIDTH)] for j in range(BLOCK_HEIGHT)]
  #   
  for i in random.sample(range(BLOCK_WIDTH * BLOCK_HEIGHT), MINE_COUNT):
   self._block[i // BLOCK_WIDTH][i % BLOCK_WIDTH].value = 1
 def get_block(self):
  return self._block
 block = property(fget=get_block)
 def getmine(self, x, y):
  return self._block[y][x]
 def open_mine(self, x, y):
  #     
  if self._block[y][x].value:
   self._block[y][x].status = bomb
   return False
  #        opened
  self._block[y][x].status = opened
  around = _get_around(x, y)
  _sum = 0
  for i, j in around:
   if self._block[j][i].value:
    _sum += 1
  self._block[y][x].around_mine_count = _sum
  #        ,      8             
  if _sum == 0:
   for i, j in around:
    if self._block[j][i].around_mine_count == -1:
     self.open_mine(i, j)
  return True
 def double_mouse_button_down(self, x, y):
  if self._block[y][x].around_mine_count == 0:
   return True
  self._block[y][x].status = double
  around = _get_around(x, y)
  #          
  sumflag = 0
  for i, j in _get_around(x, y):
   if self._block[j][i].status == flag:
    sumflag += 1
  #            
  result = True
  if sumflag == self._block[y][x].around_mine_count:
   for i, j in around:
    if self._block[j][i].status == normal:
     if not self.open_mine(i, j):
      result = False
  else:
   for i, j in around:
    if self._block[j][i].status == normal:
     self._block[j][i].status = hint
  return result
 def double_mouse_button_up(self, x, y):
  self._block[y][x].status = opened
  for i, j in _get_around(x, y):
   if self._block[j][i].status == hint:
    self._block[j][i].status = normal
우 리 는 다음 에 인터페이스 를 초기 화하 고 먼저 작은 격자 로 구 성 된 패 널 을 생 성 합 니 다.주요 코드 는 다음 과 같 습 니 다.

for row in block.block:
	for mine in row:
		pos = (mine.x * SIZE, (mine.y + 2) * SIZE)
		if mine.status == opened:
			screen.blit(img_dict[mine.around_mine_count], pos)
			opened_count += 1
		elif mine.status == double:
			screen.blit(img_dict[mine.around_mine_count], pos)
		elif mine.status == bomb:
			screen.blit(img_blood, pos)
		elif mine.status == flag:
			screen.blit(img_flag, pos)
			flag_count += 1
		elif mine.status == ask:
			screen.blit(img_ask, pos)
		elif mine.status == hint:
			screen.blit(img0, pos)
		elif game_status == over and mine.value:
			screen.blit(img_mine, pos)
		elif mine.value == 0 and mine.status == flag:
			screen.blit(img_error, pos)
		elif mine.status == normal:
			screen.blit(img_blank, pos)
효과 보기:

그 다음 에 패 널 의 head 부분 을 추가 합 니 다.예 를 들 어 뇌 수 표시,재 시작 버튼(웃 는 얼굴),표시 시간,주요 코드 는 다음 과 같 습 니 다.

print_text(screen, font1, 30, (SIZE * 2 - fheight) // 2 - 2, '%02d' % (MINE_COUNT - flag_count), red)
if game_status == started:
	elapsed_time = int(time.time() - start_time)
print_text(screen, font1, SCREEN_WIDTH - fwidth - 30, (SIZE * 2 - fheight) // 2 - 2, '%03d' % elapsed_time, red)
if flag_count + opened_count == BLOCK_WIDTH * BLOCK_HEIGHT:
	game_status = win
if game_status == over:
	screen.blit(img_face_fail, (face_pos_x, face_pos_y))
elif game_status == win:
	screen.blit(img_face_success, (face_pos_x, face_pos_y))
else:
	screen.blit(img_face_normal, (face_pos_x, face_pos_y))
효과 보기:

그리고 각종 클릭 이 벤트 를 추가 합 니 다.코드 는 다음 과 같 습 니 다.

for event in pygame.event.get():
	if event.type == QUIT:
		sys.exit()
	elif event.type == MOUSEBUTTONDOWN:
		mouse_x, mouse_y = event.pos
		x = mouse_x // SIZE
		y = mouse_y // SIZE - 2
		b1, b2, b3 = pygame.mouse.get_pressed()
		if game_status == started:
			#          ,          ,       ;          ,                
			if b1 and b3:
				mine = block.getmine(x, y)
				if mine.status == opened:
					if not block.double_mouse_button_down(x, y):
						game_status = over
	elif event.type == MOUSEBUTTONUP:
		if y < 0:
			if face_pos_x <= mouse_x <= face_pos_x + face_size \
					and face_pos_y <= mouse_y <= face_pos_y + face_size:
				game_status = readied
				block = MineBlock()
				start_time = time.time()
				elapsed_time = 0
				continue
		if game_status == readied:
			game_status = started
			start_time = time.time()
			elapsed_time = 0
		if game_status == started:
			mine = block.getmine(x, y)
			#      
			if b1 and not b3:
				if mine.status == normal:
					if not block.open_mine(x, y):
						game_status = over
			#      
			elif not b1 and b3:
				if mine.status == normal:
					mine.status = flag
				elif mine.status == flag:
					mine.status = ask
				elif mine.status == ask:
					mine.status = normal
			elif b1 and b3:
				if mine.status == double:
					block.double_mouse_button_up(x, y)
최종 실현 효 과 를 살 펴 보 자.

총결산
본 고 는 Python 을 통 해 지뢰 제거 게임 을 간단하게 실 현 했 습 니 다.여러분 이 관심 이 있다 면 실제 적 으로 조작 해서 자신 이 모든 지뢰 를 제거 할 수 있 는 지 확인 할 수 있 습 니 다.
전체 코드
항목 주소
이상 은 python 이 지뢰 제거 게임 을 실현 하 는 예제 의 상세 한 내용 입 니 다.python 지뢰 제거 에 관 한 자 료 는 우리 의 다른 관련 글 에 관심 을 가 져 주 십시오!

좋은 웹페이지 즐겨찾기