python 지뢰 제거 게임 의 예
8331 단어 python지뢰 를 제거 하 다게임.
본 고 는 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 지뢰 제거 에 관 한 자 료 는 우리 의 다른 관련 글 에 관심 을 가 져 주 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.