Top 37 파이썬 지뢰 찾기 The 188 Latest Answer

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me 파이썬 지뢰 찾기 on Google, you do not find the information you need! Here are the best content compiled and compiled by the toplist.prairiehousefreeman.com team, along with other related topics such as: 파이썬 지뢰 찾기 지뢰찾기 알고리즘, 지뢰찾기 만들기, 파이썬 테트리스, 파이썬 IDLE 게임, 파이썬 게임, 파이썬 오목, 지뢰찾기 인공지능, 유치한 게임


#35 파이썬강의 : 지뢰찾기 게임 처음부터 끝까지 설명
#35 파이썬강의 : 지뢰찾기 게임 처음부터 끝까지 설명


[파이썬 간단한 게임 만들기] 8. 지뢰찾기

  • Article author: ai-creator.tistory.com
  • Reviews from users: 21786 ⭐ Ratings
  • Top rated: 3.4 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [파이썬 간단한 게임 만들기] 8. 지뢰찾기 이번 장에서는 이 지뢰찾기 게임을 구현 해보도록 하겠습니다. 2. 사전 준비. – 게임판 구상. 1. 2. …
  • Most searched keywords: Whether you are looking for [파이썬 간단한 게임 만들기] 8. 지뢰찾기 이번 장에서는 이 지뢰찾기 게임을 구현 해보도록 하겠습니다. 2. 사전 준비. – 게임판 구상. 1. 2. 유치한 게임에 오신 것을 환영합니다. 이번에는 지뢰찾기 게임을 만들어 보겠습니다. 아래와 같은 순서로 배워보겠습니다. 1. 목표 2. 사전 준비 3. 소스 코드 (전체) 4. 사전 지식 5. 구현 순서 6. 정리 1. 목표..
  • Table of Contents:

ai-creator

[파이썬 간단한 게임 만들기] 8 지뢰찾기 본문

1 목표

2 사전 준비

3 소스 코드 (전체)

4 사전 지식

5 구현 순서

6 정리

ㅁ 참고

티스토리툴바

[파이썬 간단한 게임 만들기] 8. 지뢰찾기
[파이썬 간단한 게임 만들기] 8. 지뢰찾기

Read More

Python으로 지뢰찾기 만들기

  • Article author: yunseong.tistory.com
  • Reviews from users: 338 ⭐ Ratings
  • Top rated: 4.4 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about Python으로 지뢰찾기 만들기 Python으로 지뢰찾기 만들기 · 게임판의 토대 만들기 · 텍스트로 그래픽 표현하기 · 랜덤으로 지뢰 위치 정하기 · 선택한 타일을 열기 · 선택한 타일에 깃발 … …
  • Most searched keywords: Whether you are looking for Python으로 지뢰찾기 만들기 Python으로 지뢰찾기 만들기 · 게임판의 토대 만들기 · 텍스트로 그래픽 표현하기 · 랜덤으로 지뢰 위치 정하기 · 선택한 타일을 열기 · 선택한 타일에 깃발 … Python으로 지뢰찾기를 만들게 된 이유는 지뢰찾기 판을 자동으로 만드는 과제를 받았는데 그것을 실제로 게임이 되게 하면 재미있겠다 생각해서 이다. 파이썬으로 그래픽을 만지는 법을 모르기에 오직 텍스트로만..컴공 대학생의 개발 블로그
    Github – https://github.com/YunseongJeong
  • Table of Contents:

Python으로 지뢰찾기 만들기

게임판의 토대 만들기

텍스트로 그래픽 표현하기

랜덤으로 지뢰 위치 정하기

선택한 타일을 열기

선택한 타일에 깃발 꼽기

게임 승리 확인

Main 함수

전체 코드

티스토리툴바

Python으로 지뢰찾기 만들기
Python으로 지뢰찾기 만들기

Read More

지뢰찾기 – 코딩도장

  • Article author: codingdojang.com
  • Reviews from users: 38029 ⭐ Ratings
  • Top rated: 4.8 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 지뢰찾기 – 코딩도장 파이썬입니다. # -*- coding: utf-8 -*- import unittest Square: def … …
  • Most searched keywords: Whether you are looking for 지뢰찾기 – 코딩도장 파이썬입니다. # -*- coding: utf-8 -*- import unittest Square: def … 프로그래밍 문제풀이를 통해서 코딩 실력을 수련
  • Table of Contents:
지뢰찾기 - 코딩도장
지뢰찾기 – 코딩도장

Read More

[python] 지뢰찾기 만들기

  • Article author: velog.io
  • Reviews from users: 4932 ⭐ Ratings
  • Top rated: 4.4 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [python] 지뢰찾기 만들기 심심하면 지뢰찾기를 즐겨하는 전남자친구 한테 우스갯소리로 지뢰찾기를 … 으로 게임만들기 를 이번에 파이썬 공부를 하면서 꺼내보게 되었다. …
  • Most searched keywords: Whether you are looking for [python] 지뢰찾기 만들기 심심하면 지뢰찾기를 즐겨하는 전남자친구 한테 우스갯소리로 지뢰찾기를 … 으로 게임만들기 를 이번에 파이썬 공부를 하면서 꺼내보게 되었다. 나도 드디어 무언가를 하는구나 ..

    그놈의 깃허브도 개설해보고 깃허브 블로그도 개설해놓고 아무것도 커밋하지 않다가 드디어 허접한 무언가라도 만들게 되어 신나서 호다닥 블로그 첫 글을 쓰러왔다!!!😊 글재주 없지만 설명충인데 어떡하지

    작년 10월이었나.. 심심하면

  • Table of Contents:

Python

0 실행화면

1 보드판 생성하기

2 게임 실행하기

3 MAIN 함수

4 전체 코드는

[python] 지뢰찾기 만들기
[python] 지뢰찾기 만들기

Read More

[Python3] 파이썬으로 지뢰찾기(Mine Sweeper) 만들기 :: Leirbag

  • Article author: leirbag.tistory.com
  • Reviews from users: 26942 ⭐ Ratings
  • Top rated: 3.8 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [Python3] 파이썬으로 지뢰찾기(Mine Sweeper) 만들기 :: Leirbag 파이썬으로 만들어 본 지뢰찾기 프로그램입니다. 사용한 모듈 : PyQt5(난이도 선택창), Pygame(게임GUI) setting.py #각종 환경 설정을 위한 “값”을 … …
  • Most searched keywords: Whether you are looking for [Python3] 파이썬으로 지뢰찾기(Mine Sweeper) 만들기 :: Leirbag 파이썬으로 만들어 본 지뢰찾기 프로그램입니다. 사용한 모듈 : PyQt5(난이도 선택창), Pygame(게임GUI) setting.py #각종 환경 설정을 위한 “값”을 … 파이썬으로 만들어 본 지뢰찾기 프로그램입니다. 사용한 모듈 : PyQt5(난이도 선택창), Pygame(게임GUI) setting.py #각종 환경 설정을 위한 “값”을 모아놓는 곳. #다른 파일에서 코드를 읽을 때 숫자가 무슨 의미..
  • Table of Contents:

settingpy

gameLogicpy

gui_intropy

guipy

실제 동작 화면

TAG

관련글 관련글
더보기

인기포스트

티스토리툴바

[Python3] 파이썬으로 지뢰찾기(Mine Sweeper) 만들기 :: Leirbag
[Python3] 파이썬으로 지뢰찾기(Mine Sweeper) 만들기 :: Leirbag

Read More

[Python] 파이썬 지뢰찾기 구현 (2차원 리스트)

  • Article author: hyunki99.tistory.com
  • Reviews from users: 25862 ⭐ Ratings
  • Top rated: 4.2 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [Python] 파이썬 지뢰찾기 구현 (2차원 리스트) 파이썬 코딩도장 23.7 심사문제 지뢰찾기 구현 … 지뢰가 아닌 요소에는 인접한 지뢰의 개수를 출력하는 프로그램을 만드세요(input에서 안내 문자열 … …
  • Most searched keywords: Whether you are looking for [Python] 파이썬 지뢰찾기 구현 (2차원 리스트) 파이썬 코딩도장 23.7 심사문제 지뢰찾기 구현 … 지뢰가 아닌 요소에는 인접한 지뢰의 개수를 출력하는 프로그램을 만드세요(input에서 안내 문자열 … 파이썬 코딩도장 23.7 심사문제 지뢰찾기 구현 * 문제설명 표준 입력으로 2차원 리스트의 가로(col)와 세로(row)가 입력되고 그 다음 줄부터 리스트의 요소로 들어갈 문자가 입력됩니다. 이때 2차원 리스트 안에서..
  • Table of Contents:

태그

‘Python’ Related Articles

[Python] 파이썬 지뢰찾기 구현 (2차원 리스트)
[Python] 파이썬 지뢰찾기 구현 (2차원 리스트)

Read More

[코딩도장] 23.7 심사문제: 지뢰찾기, 제가 푼 방법 by 코딩재개발

  • Article author: bskyvision.com
  • Reviews from users: 6491 ⭐ Ratings
  • Top rated: 4.5 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [코딩도장] 23.7 심사문제: 지뢰찾기, 제가 푼 방법 by 코딩재개발 저는 이 문제를 해결하기 위해서 지뢰가 아닌 위치(.) … 파이썬 공부하시는데 있어서 어떤 학습자료를 이용할 지 고민하고 계시는 분들은 코딩도장을 … …
  • Most searched keywords: Whether you are looking for [코딩도장] 23.7 심사문제: 지뢰찾기, 제가 푼 방법 by 코딩재개발 저는 이 문제를 해결하기 위해서 지뢰가 아닌 위치(.) … 파이썬 공부하시는데 있어서 어떤 학습자료를 이용할 지 고민하고 계시는 분들은 코딩도장을 … 저는 이 문제를 해결하기 위해서 지뢰가 아닌 위치(.)를 먼저 찾은 후, 인접한 8개 점들에 지뢰(*)가 있는지를 확인해서 있으면 하나씩 카운트하는 식으로 코드를 구현했습니다. 이때 조심해야하는 것은 8개 점들..여러분의 코딩을 재개발 시켜드립니다.

    구) 비스카이비전

  • Table of Contents:
[코딩도장] 23.7 심사문제: 지뢰찾기, 제가 푼 방법 by 코딩재개발
[코딩도장] 23.7 심사문제: 지뢰찾기, 제가 푼 방법 by 코딩재개발

Read More

파이썬 Tkinter 프로젝트 – 지뢰찾기(소스공유)

  • Article author: jaraworkshop.tistory.com
  • Reviews from users: 17690 ⭐ Ratings
  • Top rated: 4.4 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 파이썬 Tkinter 프로젝트 – 지뢰찾기(소스공유) 0. 서론 & 다운로드 파이썬의 tkinter를 이용해 만든 지뢰찾기 입니다. tkinter, numpy 라이브러리가 사용되었고, 간단한 클래스 사용까지 포함되어 … …
  • Most searched keywords: Whether you are looking for 파이썬 Tkinter 프로젝트 – 지뢰찾기(소스공유) 0. 서론 & 다운로드 파이썬의 tkinter를 이용해 만든 지뢰찾기 입니다. tkinter, numpy 라이브러리가 사용되었고, 간단한 클래스 사용까지 포함되어 … 0. 서론 & 다운로드 파이썬의 tkinter를 이용해 만든 지뢰찾기 입니다. tkinter, numpy 라이브러리가 사용되었고, 간단한 클래스 사용까지 포함되어 있습니다. 최대한 주석을 달아뒀으니 개인 과제 등에 참고하시..
  • Table of Contents:

파이썬 Tkinter 프로젝트 – 지뢰찾기(소스공유)

티스토리툴바

파이썬 Tkinter 프로젝트 - 지뢰찾기(소스공유)
파이썬 Tkinter 프로젝트 – 지뢰찾기(소스공유)

Read More

코드업 #3500 지뢰 찾기 2 / python

  • Article author: 0equal2.tistory.com
  • Reviews from users: 42702 ⭐ Ratings
  • Top rated: 5.0 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 코드업 #3500 지뢰 찾기 2 / python 코드업 #3500 : 지뢰 찾기 2 문제 링크 : codeup.kr/problem.php?=3500 지뢰 찾기 2 (r, c)를 선택한 경우 맵의 상태를 화면에 출력하시오. …
  • Most searched keywords: Whether you are looking for 코드업 #3500 지뢰 찾기 2 / python 코드업 #3500 : 지뢰 찾기 2 문제 링크 : codeup.kr/problem.php?=3500 지뢰 찾기 2 (r, c)를 선택한 경우 맵의 상태를 화면에 출력하시오. 코드업 #3500 : 지뢰 찾기 2 문제 링크 : codeup.kr/problem.php?id=3500 지뢰 찾기 2 (r, c)를 선택한 경우 맵의 상태를 화면에 출력하시오. 만약 (r, c)가 지뢰이면 그 칸은 -1로 출력한다. codeup.kr *** 최근..
  • Table of Contents:

코드업 #3500 지뢰 찾기 2

관련글

댓글0

공지사항

최근글

인기글

최근댓글

태그

전체 방문자

티스토리툴바

코드업 #3500 지뢰 찾기 2 / python
코드업 #3500 지뢰 찾기 2 / python

Read More


See more articles in the same category here: Top 159 tips update new.

[파이썬 간단한 게임 만들기] 8. 지뢰찾기

반응형

유치한 게임에 오신 것을 환영합니다.

이번에는 지뢰찾기 게임을 만들어 보겠습니다.

아래와 같은 순서로 배워보겠습니다.

1. 목표

2. 사전 준비

3. 소스 코드 (전체)

4. 사전 지식

5. 구현 순서

6. 정리

1. 목표

이번 장에서는 지뢰찾기 게임을 만들어 보도록 하겠습니다.

이번에 만들 게임은 지뢰찾기입니다. 지뢰찾기 게임의 규칙은 다음과 같습니다.

게임판 내부에 각 셀이 존재하며 이 셀은 3가지의 타입으로 되어 있습니다. 셀을 누르게 되면 해당하는 셀에 대한 타입이 보이게 되며 만약, 숫자 셀이나 아무것도 없는 셀을 클릭하게 되면 게임이 계속 진행되지만 지뢰가 있는 셀을 누르게 되면 게임이 끝나게 됩니다.

따라서 지뢰가 없는 모든 셀을 활성화 시켜 모든 지뢰를 찾으면 되는 게임입니다.

숫자가 들어있는 셀은 해당 셀을 반경으로 상하좌우 대각선까지 총 8칸의 셀에 존재하는 지뢰의 갯수를 의미하며 이 숫자 셀을 잘 조합하여 지뢰의 위치를 파악하는 것이 중요합니다.

[그림 8-1] 지뢰찾기 게임

이번 장에서는 이 지뢰찾기 게임을 구현 해보도록 하겠습니다.

2. 사전 준비

– 게임판 구상

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import pygame # 1. pygame 선언 pygame.init() # 2. pygame 초기화 # 3. pygame에 사용되는 전역변수 선언 BLACK = ( 0 , 0 , 0 ) RED = ( 255 , 0 , 0 ) GRAY = ( 128 , 128 , 128 ) WHITE = ( 255 , 255 , 255 ) YELLOW = ( 255 , 255 , 0 ) large_font = pygame.font.SysFont( None , 72 ) small_font = pygame.font.SysFont( None , 36 ) SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) CELL_SIZE = 50 COLUMN_COUNT = SCREEN_WIDTH / / CELL_SIZE ROW_COUNT = SCREEN_HEIGHT / / CELL_SIZE clock = pygame.time.Clock() # 4. pygame 무한루프 def runGame(): global done while not done: clock.tick( 10 ) screen.fill(WHITE) runGame() pygame.quit() Colored by Color Scripter cs

게임을 진행할 화면을 다음과 같이 설정하도록 하겠습니다.

7~11번 라인 : 게임에 사용되는 색상 RGB 값

12,13번 라인(게임 폰트) : 게임 내부에서 점수를 표시할 폰트 설정

14,15번 라인(화면 크기) : 넓이(width) – 800, 높이(height) – 600/ 800×600

18~20번 라인 : 지뢰가 들어갈 각 셀의 사이즈 및 갯수

3. 소스 코드 (전체)

파일명 : minesweeper.py

drive.google.com/drive/folders/1P7-ibtlJKUEet1lbqkSAg7N8RyxOza_o?usp=sharing

4. 사전 지식

1) 지뢰찾기 게임에 필요한 요소 정의

지뢰찾기 게임에서 가장 중요한 것은 셀을 배치하고 지뢰가 들어갈 셀을 지정하는 것입니다.

게임 조작 방식은 오로지 마우스를 이용하기 때문에 저희가 가장 중요시 할 부분은 셀을 관리하는 것입니다.

먼저 각 셀을 관리할 grid라는 2차원 리스트를 만들고 지뢰를 배치하는 부분을 먼저 보도록 하겠습니다.

1 2 3 4 5 6 7 8 9 10 grid = [[{ ‘mine’ : False , ‘open’ : False , ‘mine_count_around’ : 0 , ‘flag’ : False } for _ in range (COLUMN_COUNT)] for _ in range (ROW_COUNT)] MINE_COUNT = 15 for _ in range (MINE_COUNT): while True : column_index = random.randint( 0 , COLUMN_COUNT – 1 ) row_index = random.randint( 0 , ROW_COUNT – 1 ) tile = grid[row_index][column_index] if not tile[ ‘mine’ ]: tile[ ‘mine’ ] = True break Colored by Color Scripter cs

1번 라인에서 먼저 각 리스트에 들어갈 하나의 요소는 mine, open, mine_count_around, flag 로 구성되어 있습니다.

mine – 지뢰의 여부

open – 활성화 여부

mine_count_around – 주변의 지뢰 갯수

flag – flag 활성화 여부(지뢰라고 체크)

각 요소들을 각 열과 행에 맞게 반복문을 통해 구성을 해주도록 합니다.

2번 라인은 지뢰의 총 갯수를 의미합니다.

3번 라인부터는 반복문을 돌며 랜덤한 행,열에 지뢰를 설정하도록 하는데, 지뢰가 중복되지 않도록 먼저 지뢰가 있는지 여부를 확인한 후에 지뢰를 배치하도록 하겠습니다.

2) 마우스 클릭을 통한 판정

각 셀을 마우스로 클릭했을 때, 앞서 설명드린 게임 규칙처럼 총 3개의 액션을 취할 수 있습니다.

1. 숫자 셀(주변의 지뢰 갯수)

2. 빈 셀

3. 지뢰 셀

따라서 앞서 배치한 지뢰를 기반으로 지뢰를 선택하게 되면 게임오버, 주변에 지뢰가 있으면 숫자 타일, 만약 주변에 지뢰가 없다면 주변의 연결된 빈 타일들을 활성화 해주도록 합니다.

해당 부분은 각각 함수로 구현하도록 하겠습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 def in_bound(column_index, row_index): if ( 0 < = column_index < COLUMN_COUNT and 0 < = row_index < ROW_COUNT): return True else : return False def open_tile(column_index, row_index): if not in_bound(column_index, row_index): return tile = grid[row_index][column_index] if not tile[ 'open' ]: tile[ 'open' ] = True else : return if tile[ 'mine' ]: return mine_count_around = get_mine_count_around(column_index, row_index) if mine_count_around > 0 : tile[ ‘mine_count_around’ ] = mine_count_around else : for dc, dr in [( 0 , 1 ), ( 0 , – 1 ), ( 1 , 0 ), ( – 1 , 0 ), ( 1 , 1 ), ( 1 , – 1 ), ( – 1 , 1 ), ( – 1 , – 1 )]: column_index_around, row_index_around = (column_index + dc, row_index + dr) open_tile(column_index_around, row_index_around) def get_mine_count_around(column_index, row_index): count = 0 for dc, dr in [( 0 , 1 ), ( 0 , – 1 ), ( 1 , 0 ), ( – 1 , 0 ), ( 1 , 1 ), ( 1 , – 1 ), ( – 1 , 1 ), ( – 1 , – 1 )]: column_index_around, row_index_around = (column_index + dc, row_index + dr) if in_bound(column_index_around, row_index_around) and grid[row_index_around][column_index_around][ ‘mine’ ]: count + = 1 return count Colored by Color Scripter cs

1~5번 라인(in_bound) : 접근 가능한 셀인지 판단

7~26번 라인(open_tile) : 각 타일을 오픈

만약 타일이 열려있지 않으면 타일의 open을 true로 변경(지뢰 여부 상관없이)

다음으로 주변의 지뢰의 갯수를 파악( get_mine_count_around 함수 실행) 후 주변에 빈셀들을 전부 오픈

28~35번 라인(get_mine_count_around) : 주변의 지뢰 갯수를 리턴

([(0, 1), (0, -1), (1, 0), (-1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)])의 모든 값들을 돌며 체크해서 지뢰가 몇개 있는지 카운트 해서 결과를 러턴

이렇게 총 3개의 함수를 이용해서 타일을 판별하고 오픈하도록 합니다.

[그림 8-2] 3가지 셀 타입.png

5. 구현 순서

구현 순서는 다음과 같습니다.

Step1 마우스 이벤트 처리(셀 오픈) Step2 각 타일 출력

지뢰찾기 게임은 게임의 로직을 이해하는 것이 중요합니다. 각 셀에 대한 반응이 얽혀 재귀함수도 이용되고 여러 반응이 생길 수 있기 때문에 하나씩 천천히 배워보도록 하겠습니다.

Step1) 마우스 이벤트 처리(셀 오픈)

먼저 마우스 이벤트 처리를 구현해보도록 하겠습니다. 이전까지는 마우스를 사용하는 게임은 좌클릭만 이용하였지만, 지뢰찾기 게임은 지뢰로 의심되는 타일을 오픈하지 않고 flag로 체크를 해야하기 때문에 2가지 이벤트를 받을 수 있도록 마우스 좌클릭과 우클릭 두가지 이벤트를 처리해보도록 하겠습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 def runGame(): SUCCESS = 1 FAILURE = 2 game_over = 0 while True : clock.tick( 30 ) screen.fill(BLACK) for event in pygame.event.get(): if event.type = = pygame.QUIT: break elif event.type = = pygame.MOUSEBUTTONDOWN: column_index = event.pos[ 0 ] / / CELL_SIZE row_index = event.pos[ 1 ] / / CELL_SIZE if event.button = = 1 : if in_bound(column_index, row_index): tile = grid[row_index][column_index] if tile[ ‘mine’ ]: tile[ ‘open’ ] = True game_over = FAILURE else : open_tile(column_index, row_index) elif event.button = = 3 : if in_bound(column_index, row_index): tile = grid[row_index][column_index] if not tile[ ‘flag’ ]: tile[ ‘flag’ ] = True else : tile[ ‘flag’ ] = False success = True for row_index in range (ROW_COUNT): for column_index in range (COLUMN_COUNT): tile = grid[row_index][column_index] if tile[ ‘mine’ ] and not tile[ ‘flag’ ]: success = False break if success: game_over = SUCCESS cs

2~4번 라인은 이전 장에서 배운 플래그와 동일하게 게임 종료와 게임 클리어에 대한 플래그로 사용하여 마지막에 텍스트를 출력하도록 하는 변수입니다.

13번 라인은 MOUSEBUTTONDOWN으로 마우스 클릭 이벤트를 캐치합니다.

14,15번 라인에서 마우스 클릭이 발생한 위치를 기반으로 셀의 행열 인덱스를 잡도록하겠습니다.

16~23번 라인은 마우스 좌클릭에 대한 이벤트 처리입니다. 마우스 좌클릭을 하게 되면 event.button 값이 1로 설정이 됩니다. 따라서 이를 이용하여 죄클릭 이벤트를 검증하여 만약 지뢰 타일이 open되어 있다면 game_over 플래그를 설정하여 게임을 종료하도록 합니다.

만약 지뢰 타일이 open 되어 있는 것이 아니라면, 이전에 작성한 open_tile 함수를 통해 타일을 열어주도록 하겠습니다.

24~40번 라인은 마우스 우클릭에 대한 이벤트 처리입니다. 마우스 우클릭을 하게 되면 event.button 값이 3으로 설정됩니다.

먼저 플래그는 지뢰의 여부, 빈 셀, 숫자 셀에 상관없이 모두 플래그 처리가 가능함으로 기존 tile[‘flag’]의 값에 따라 새로운 플래그를 설정하주도록 합니다. 쉽게 말해 플래그가 있는 타일이면 플래그를 없애고 플래그가 없는 타일이면 플래그를 활성화 하도록 합니다.

다음은, 모든 셀을 돌면서 지뢰 셀에 플래그가 대응하여 활성화 되어 있다면 game_over 플래그를 성공으로 처리하여 게임 승리 조건으로 끝내도록 설정 해줍니다. 만일 하나라도 대응하지 않는다면 게임 성공 플래그는 활성화 되지 않습니다.

Step2) 각 타일 출력

이번에는 각 타일의 open에 대한 정보를 기반으로 모든 타일을 출력하도록 하겠습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 for column_index in range (COLUMN_COUNT): for row_index in range (ROW_COUNT): tile = grid[row_index][column_index] if tile[ ‘mine_count_around’ ]: mine_count_around_image = small_font.render( ‘{}’ . format (tile[ ‘mine_count_around’ ]), True , YELLOW) screen.blit(mine_count_around_image, mine_count_around_image.get_rect(centerx = column_index * CELL_SIZE + CELL_SIZE / / 2 , centery = row_index * CELL_SIZE + CELL_SIZE / / 2 )) if tile[ ‘mine’ ]: mine_image = small_font.render( ‘x’ , True , RED) screen.blit(mine_image, mine_image.get_rect(centerx = column_index * CELL_SIZE + CELL_SIZE / / 2 , centery = row_index * CELL_SIZE + CELL_SIZE / / 2 )) #지뢰 설치 if not tile[ ‘open’ ]: pygame.draw.rect(screen, GRAY, pygame.Rect(column_index * CELL_SIZE, row_index * CELL_SIZE, CELL_SIZE, CELL_SIZE)) #커버 if tile[ ‘flag’ ]: v_image = small_font.render( ‘v’ , True , WHITE) screen.blit(v_image, (column_index * CELL_SIZE + 10 , row_index * CELL_SIZE + 10 )) pygame.draw.rect(screen, WHITE, pygame.Rect(column_index * CELL_SIZE, row_index * CELL_SIZE, CELL_SIZE, CELL_SIZE), 1 ) if game_over > 0 : if game_over = = SUCCESS: success_image = large_font.render( ‘성공’ , True , RED) screen.blit(success_image, success_image.get_rect(centerx = SCREEN_WIDTH / / 2 , centery = SCREEN_HEIGHT / / 2 )) elif game_over = = FAILURE: failure_image = large_font.render( ‘실패’ , True , RED) screen.blit(failure_image, failure_image.get_rect(centerx = SCREEN_WIDTH / / 2 , centery = SCREEN_HEIGHT / / 2 )) pygame.display.update() Colored by Color Scripter cs

1,2번 라인은 이중 반복문을 통해 모든 타일을 돌며 각각 출력을 하도록 합니다.

다음으로는 grid로 설정한 tile의 모든 요소(mine_count_around, mine, open)을 검증하여 화면에 출력하도록 합니다.

겹치는 조건이 발생할 수도 있기 때문에 우선순위를 바탕으로 숫자 > 지뢰 > 오픈여부 > 플래그 순으로 조건문을 돌도록 합니다.

각 조건에 대해서 검증을 하더라도 tile[‘open’]이 활성화 되지 않았다면 회색 타일로 덮어 해당 타일이 어떤 타일인지 보이지 않도록 합니다.

4~6번 라인은 숫자 타일에 대한 정보입니다. 숫자 타일은 앞서 계산한 값을 기반으로 타일에 숫자를 출력하도록 blit() 함수를 사용하도록 합니다.

7~9번 라인은 지뢰 타일에 대한 정보입니다. 지뢰 타일은 숫자 타일과 동일하게 blit() 함수를 사용하여 x라는 문자를 출력해줍니다.

10,11번 라인은 타일이 오픈되지 않았을 때 즉, 기본 타일에 대해 출력을 하며, rect() 함수를 사용하여 빈 회색 타일을 출력하도록 합니다.

12~14번 라인은 플래그 활성화 여부에 따라, blit() 함수를 이용해 v라는 문자를 출력해줍니다.

17~23번 라인은 이전 장에서 학습한 game_over 플래그에 따른 게임 종료 메세지를 출력하는 코드입니다. 만약 SUCCESS로 활성화 되어 있다면 ‘성공’이라는 메세지를, FAILURE로 활성화 되어 있다면 ‘실패’라는 메세지를 출력하도록 합니다.

[그림 8-3] 게임 완성 화면

6. 정리

이번 장에서는 앞서 배운 pygame의 기본 구조와 게임 루프, 이벤트 처리를 기반으로 지뢰 찾기 게임을 구현 해봤습니다.

먼저, 게임에 필요한 요소 정의를 하고 타일 오픈 상황 처리를 통해 게임을 진행할 수 있도록 사전학습을 한 뒤 진행을 했으며,

Step 1) 마우스 이벤트 처리(셀 오픈) > 마우스 좌, 우클릭 이벤트 처리

Step 2) 각 타일 출력 -> 2차원 리스트를 통한 셀 관리 및 각 요소에 대한 조건 처리

를 배웠습니다.

이번 장에는 pygame과 함께 여러가지 요소를 배치하여 각 요소에 대한 검증 진행을 통해 게임을 구현하는 방법을 배웠습니다. 이를 기반으로 각 기능에 대한 함수를 생성하여 코드를 모듈화 하는법을 꾸준히 배운다면 조금 더 깔끔한 코드를 통해 재밌고 읽기 쉬운(코드) 게임을 만들어 보세요^^

ㅁ 참고

토닥토닥 파이썬

도움이 되셨다면, 좋아요 / 구독 버튼 눌러주세요~

저작물의 저작권은 작성자에게 있습니다.

공유는 자유롭게 하시되 댓글 남겨주세요~

상업적 용도로는 무단 사용을 금지합니다.

끝까지 읽어주셔서 감사합니다^^

반응형

Python으로 지뢰찾기 만들기

728×90

Python으로 지뢰찾기를 만들게 된 이유는

지뢰찾기 판을 자동으로 만드는 과제를 받았는데

그것을 실제로 게임이 되게 하면 재미있겠다 생각해서 이다.

파이썬으로 그래픽을 만지는 법을 모르기에 오직 텍스트로만 만들었다.

게임판의 토대 만들기

지뢰찾기를 만들기 위해서는 게임판을 먼저 만들어야 한다.

플레이어에게 보이는 게임판과 지뢰의 위치가 그려져있는 게임판을 따로 만들어줬다.

1 2 3 4 5 6 7 8 9 gameBoard = [] vGameBoard = [] #visible Game board mode = ‘O’ # O : open mode , F : flag mode for raw in range ( 10 ): gameBoard.append([ ‘.’ ] * 10 ) for raw in range ( 11 ): vGameBoard.append([ ‘.’ ] * 10 ) cs

위와 같은 코드로 2차원 list로 10, 10이 되도록 먼저 만들어줬다.

mode는 좌표로 입력받은 타일을 열지 깃발을 세울지를 결정해주는 변수이다.

텍스트로 그래픽 표현하기

그리고 텍스트 만으로 게임을 만들 것이기 때문에 편하게 게임판을 표기하기 위해서

graphic(list[][])함수를 만들었다.

1 2 3 4 5 6 7 8 9 10 def graphic(table) : global mode print ( ‘Current mode = {}’ . format (mode)) for raw in range ( 10 ) : for line in range ( 10 ) : print (table[raw][line], end = ‘ ‘ ) print ( ” ) cs

이차원 리스트를 parameter로 입력받아서 그것을 밑에 와 같이 출력해준다.

그리고 현제 모드도 함께 보여준다.

지뢰찾기에서는 제일 먼저 고른 타일에는 지뢰가 설치되지 않기에 먼저 첫 번째 타일 위치를 입력받아야 한다.

1 2 3 4 5 6 7 8 graphic(vGameBoard) print(‘First selection is limited inward.’) com = input(‘x, y : select (x, y) tile

‘) x, y = com.split(“, “) x, y = int(x), int(y) Colored by Color Scripter cs

그래서 지뢰의 위치를 정하기 전에 위와 같이 좌표를 입력받는다.

설명 또한 출력해준다.

랜덤으로 지뢰 위치 정하기

첫번째 타일 위치를 입력받았기 때문에 이제 보이지 않는 게임판에 지뢰의 위치와 지뢰가 없는 타일에는 근처에 있는 지뢰의 개수를 숫자를 정해야 한다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 from random import randint def makeBoard(x, y) : global gameBoard global vGameBoard for raw in range ( 10 ) : for line in range ( 10 ) : if randint( 1 , 100 ) < 20 : #randint를 이용해서 20%확률로 지뢰(#)를 설치한다. gameBoard[raw][line] = '#' for raw in range (y - 2 , y + 1 ): #처음 고른 타일의 좌표와 그 주변 8칸을 지뢰를 지운다. for line in range (x - 2 , x + 1 ): gameBoard[raw][line] = '.' for raw in range ( 10 ) : for line in range ( 10 ) : mineNumber = 0 if gameBoard[raw][line] = = '.' : #지뢰가 없는 타일(.)이라면 그 근처 8칸에서 #의 수를 mineNumber에 저장한다. if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw - 1 ][line - 1 ] = = '#' : mineNumber + = 1 if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line) and (line) < = 9 : if gameBoard[raw - 1 ][line] = = '#' : mineNumber + = 1 if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw - 1 ][line + 1 ] = = '#' : mineNumber + = 1 if 0 < = (raw) and (raw) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw][line - 1 ] = = '#' : mineNumber + = 1 if 0 < = (raw) and (raw) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw][line + 1 ] = = '#' : mineNumber + = 1 if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw + 1 ][line - 1 ] = = '#' : mineNumber + = 1 if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line) and (line) < = 9 : if gameBoard[raw + 1 ][line] = = '#' : mineNumber + = 1 if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw + 1 ][line + 1 ] = = '#' : mineNumber + = 1 gameBoard[raw][line] = str (mineNumber) #mineNumber을 그 칸에 string의 형태로 저장한다. cs 이 함수는 처음 고른 타일의 좌표(x, y)를 parameter로 받아서 20%확률로 지뢰(#)위치를 무작위로 정하고 (8~11) x, y의 타일과 그 주변 8칸의 타일을 (.)로 만들면서 지뢰(#)를 없앤다. (13~15) 그리고 모든 지뢰가 없는 타일에 그 주변에 지뢰가 있는 타일의 수를 세서 저장한다. (17~47) 그렇게 하면 위와 같은 게임판을 랜덤으로 만들 수 있을 것이다. 그리고 이것은 플레이어에게 보이면 안 되기에 안 보이는 게임판에 저장해야한다. 선택한 타일을 열기 그 다음에는 선택한 타일을 여는 open(x, y) 함수를 만들었다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 def open (x, y) : global vGameBoard global gameBoard if gameBoard[y - 1 ][x - 1 ] = = '#' : vGameBoard[y - 1 ][x - 1 ] = gameBoard[y - 1 ][x - 1 ] graphic(vGameBoard) print ( '게임에 패배했습니다.' ) exit() # If player select mine, then player defeat else : openlemma(x, y) # open selected tile cs 만약 선택한 타일이 지뢰(#)라면 게임이 패배하고 프로그램이 종료되도록 했다. (5~10) 선택한 타일이 지뢰가 아니라면 연쇄적으로 타일이 열리는 것을 표현하기 위해서 재귀 함수를 사용하기 위해 openlemma(x, y) 함수를 따로 만들었다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 def openlemma(x, y) : # for making function simpl global vGameBoard global gameBoard vGameBoard[y - 1 ][x - 1 ] = gameBoard[y - 1 ][x - 1 ] raw = y - 1 line = x - 1 if gameBoard[raw][line] = = '0' : if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw - 1 ][line - 1 ] = = '0' and vGameBoard[raw - 1 ][line - 1 ] = = '.' : openlemma(x - 1 , y - 1 ) if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line) and (line) < = 9 : if gameBoard[raw - 1 ][line] = = '0' and vGameBoard[raw - 1 ][line] = = '.' : openlemma(x, y - 1 ) if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw - 1 ][line + 1 ] = = '0' and vGameBoard[raw - 1 ][line + 1 ] = = '.' : openlemma(x + 1 , y - 1 ) if 0 < = (raw) and (raw) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw][line - 1 ] = = '0' and vGameBoard[raw][line - 1 ] = = '.' : openlemma(x - 1 , y) if 0 < = (raw) and (raw) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw][line + 1 ] = = '0' and vGameBoard[raw][line + 1 ] = = '.' : openlemma(x + 1 , y) if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw + 1 ][line - 1 ] = = '0' and vGameBoard[raw + 1 ][line - 1 ] = = '.' : openlemma(x - 1 , y + 1 ) if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line) and (line) < = 9 : if gameBoard[raw + 1 ][line] = = '0' and vGameBoard[raw + 1 ][line] = = '.' : openlemma(x, y + 1 ) if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw + 1 ][line + 1 ] = = '0' and vGameBoard[raw + 1 ][line + 1 ] = = '.' : openlemma(x + 1 , y + 1 ) # 주의의 0인 타일에 다시 openlemma를 적용 if gameBoard[raw][line] = = '0' : if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : vGameBoard[raw - 1 ][line - 1 ] = gameBoard[raw - 1 ][line - 1 ] if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line) and (line) < = 9 : vGameBoard[raw - 1 ][line] = gameBoard[raw - 1 ][line] if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : vGameBoard[raw - 1 ][line + 1 ] = gameBoard[raw - 1 ][line + 1 ] if 0 < = (raw) and (raw) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : vGameBoard[raw][line - 1 ] = gameBoard[raw][line - 1 ] if 0 < = (raw) and (raw) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : vGameBoard[raw][line + 1 ] = gameBoard[raw][line + 1 ] if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : vGameBoard[raw + 1 ][line - 1 ] = gameBoard[raw + 1 ][line - 1 ] if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line) and (line) < = 9 : vGameBoard[raw + 1 ][line] = gameBoard[raw + 1 ][line] if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : vGameBoard[raw + 1 ][line + 1 ] = gameBoard[raw + 1 ][line + 1 ] #0인 타일의 주변의 타일을 연다 Colored by Color Scripter cs 일단 선택한 타일을 열어준다. (4) 그리고 선택한 타일의 주변에 주변의 지뢰 갯수가 0인 곳이 있다면 다시 openlemma(x, y)를 불러서 그 타일 또한 연쇄적으로 열리도록 했다. (8~40) 그리고 0 주변에 있는 0이 아닌 타일들 또한 열려야 하기 때문에 열어줬다. (43~66) (보이는 게임판에 안 보이는 게임판에 저장되있는 정보를 가져오는 것을 연다고 표현했다.) 선택한 타일에 깃발 꼽기 1 2 3 4 5 6 7 8 9 10 def flag(x, y) : global vGameBoard if vGameBoard[y - 1 ][x - 1 ] = = '.' : vGameBoard[y - 1 ][x - 1 ] = 'P' elif vGameBoard[y - 1 ][x - 1 ] = = 'P' : vGameBoard[y - 1 ][x - 1 ] = '.' else : print ( 'error_2' ) exit() # P(flag) -> not flag / not flag -> flag cs

flag(x, y)함수도 좌표를 parameter로 받아와서

선택한 타일에 깃발이 있다면 없애고

없다면 만들었다.

(깃발은 비슷하게 생긴 ‘P’로 했다.)

게임 승리 확인

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def check() : #게임의 승리를 확인 global vGameBoard gameEnded = 0 for raw in range ( 10 ) : for line in range ( 10 ) : if gameBoard[raw][line] ! = ‘#’ : if vGameBoard[raw][line] = = gameBoard[raw][line] : gameEnded = 1 else : gameEnded = 0 return 0 if gameEnded = = 1 : print ( ‘게임에 승리하였습니다.’ ) return 1 Colored by Color Scripter cs

지뢰 없는 타일들이 모두 열렸다면 게임에서 승리한 것이기 때문에

이중 if문을 이용해서 만약 모두 열렸다면 1(true)이 반환되고 아니라면 0(false)이 반환되게 했다. (6~18)

Main 함수

위에서 만든 함수들을 종합해서 실제 실행될 부분을 만들 것이다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 def main() : global mode global vGameBoard global gameBoard graphic(vGameBoard) print ( ‘First selection is limited inward.’ ) com = input( ‘x, y : select (x, y) tile

‘ ) x, y = com.split( “, ” ) x, y = int (x), int (y) makeBoard(x, y) open (x, y) while 1 : print ( ‘———————————————————–‘ ) graphic(vGameBoard) com = input( ‘F : Flag mode

O : Open mode

x, y : select (x, y) tile

‘ ) if com = = ‘F’ : mode = ‘F’ continue elif com = = ‘O’ : mode = ‘O’ continue else : x, y = com.split( “, ” ) x, y = int (x), int (y) if mode = = ‘F’ : flag(x, y) elif mode = = ‘O’ : open (x, y) else : print ( ‘Error_1’ ) exit() if check() = = 1 : exit() Colored by Color Scripter cs

사실 첫 17열 윗부분은 앞에서 먼저 나왔던 부분이다. 특수한 처음 선택을 제외하고는 17열 아래에서 실행된다.

graphic 함수를 이용해서 현재 상황을 보여주고 (18~19)

입력을 받는다. 만약 F나 O를 입력 받는다면 각각 Flag모드와 Open모드로 mode를 변환한다. (21~26)

그 이외에는 좌표일 것이기에 모드에 따라서 flag 함수나 open 함수를 호출해서 선택한 타일에

알맞은 실행을 한다. (27~33)

그래서 check 함수를 이용해서 1이 반환된다면 승리한 것이기 때문에 프로그램을 멈춘다. (38~39)

전체 코드

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 #——————————————————————————- # Name: Minesweeper By python # Purpose: # # Author: 정윤성 # # Created: 06-05-2021 # Copyright: (c) jys09 2021 # Licence: #——————————————————————————- from random import randint gameBoard = [] vGameBoard = [] #visible Game board mode = ‘O’ # O : open mode , F : flag mode for raw in range ( 10 ): gameBoard.append([ ‘.’ ] * 10 ) for raw in range ( 11 ): vGameBoard.append([ ‘.’ ] * 10 ) # make foundation for game board #——————————————————————————- def main() : global mode global vGameBoard global gameBoard graphic(vGameBoard) print ( ‘First selection is limited inward.’ ) com = input( ‘x, y : select (x, y) tile

‘ ) x, y = com.split( “, ” ) x, y = int (x), int (y) makeBoard(x, y) open (x, y) while 1 : print ( ‘———————————————————–‘ ) graphic(vGameBoard) com = input( ‘F : Flag mode

O : Open mode

x, y : select (x, y) tile

‘ ) if com = = ‘F’ : mode = ‘F’ continue elif com = = ‘O’ : mode = ‘O’ continue else : x, y = com.split( “, ” ) x, y = int (x), int (y) if mode = = ‘F’ : flag(x, y) elif mode = = ‘O’ : open (x, y) else : print ( ‘Error_1’ ) exit() if check() = = 1 : exit() #——————————————————————————- def makeBoard(x, y) : global gameBoard global vGameBoard for raw in range ( 10 ) : for line in range ( 10 ) : if randint( 1 , 100 ) < 20 : gameBoard[raw][line] = '#' for raw in range (y - 2 , y + 1 ): for line in range (x - 2 , x + 1 ): gameBoard[raw][line] = '.' for raw in range ( 10 ) : for line in range ( 10 ) : mineNumber = 0 if gameBoard[raw][line] = = '.' : if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw - 1 ][line - 1 ] = = '#' : mineNumber + = 1 if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line) and (line) < = 9 : if gameBoard[raw - 1 ][line] = = '#' : mineNumber + = 1 if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw - 1 ][line + 1 ] = = '#' : mineNumber + = 1 if 0 < = (raw) and (raw) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw][line - 1 ] = = '#' : mineNumber + = 1 if 0 < = (raw) and (raw) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw][line + 1 ] = = '#' : mineNumber + = 1 if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw + 1 ][line - 1 ] = = '#' : mineNumber + = 1 if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line) and (line) < = 9 : if gameBoard[raw + 1 ][line] = = '#' : mineNumber + = 1 if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw + 1 ][line + 1 ] = = '#' : mineNumber + = 1 gameBoard[raw][line] = str (mineNumber) #------------------------------------------------------------------------------- def flag(x, y) : global vGameBoard if vGameBoard[y - 1 ][x - 1 ] = = '.' : vGameBoard[y - 1 ][x - 1 ] = 'P' elif vGameBoard[y - 1 ][x - 1 ] = = 'P' : vGameBoard[y - 1 ][x - 1 ] = '.' else : print ( 'error_2' ) exit() # P(flag) -> not flag / not flag -> flag #——————————————————————————- def graphic(table) : global mode print ( ‘Current mode = {}’ . format (mode)) for raw in range ( 10 ) : for line in range ( 10 ) : print (table[raw][line], end = ‘ ‘ ) print ( ” ) # make gameBoard visible by texts #——————————————————————————- def open (x, y) : global vGameBoard global gameBoard if gameBoard[y – 1 ][x – 1 ] = = ‘#’ : vGameBoard[y – 1 ][x – 1 ] = gameBoard[y – 1 ][x – 1 ] graphic(vGameBoard) print ( ‘게임에 패배했습니다.’ ) exit() # If player select mine, then player defeat else : openlemma(x, y) # open selected mine #——————————————————————————- def openlemma(x, y) : # for making function simpl global vGameBoard global gameBoard vGameBoard[y – 1 ][x – 1 ] = gameBoard[y – 1 ][x – 1 ] raw = y – 1 line = x – 1 if gameBoard[raw][line] = = ‘0’ : if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw - 1 ][line - 1 ] = = '0' and vGameBoard[raw - 1 ][line - 1 ] = = '.' : openlemma(x - 1 , y - 1 ) if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line) and (line) < = 9 : if gameBoard[raw - 1 ][line] = = '0' and vGameBoard[raw - 1 ][line] = = '.' : openlemma(x, y - 1 ) if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw - 1 ][line + 1 ] = = '0' and vGameBoard[raw - 1 ][line + 1 ] = = '.' : openlemma(x + 1 , y - 1 ) if 0 < = (raw) and (raw) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw][line - 1 ] = = '0' and vGameBoard[raw][line - 1 ] = = '.' : openlemma(x - 1 , y) if 0 < = (raw) and (raw) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw][line + 1 ] = = '0' and vGameBoard[raw][line + 1 ] = = '.' : openlemma(x + 1 , y) if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : if gameBoard[raw + 1 ][line - 1 ] = = '0' and vGameBoard[raw + 1 ][line - 1 ] = = '.' : openlemma(x - 1 , y + 1 ) if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line) and (line) < = 9 : if gameBoard[raw + 1 ][line] = = '0' and vGameBoard[raw + 1 ][line] = = '.' : openlemma(x, y + 1 ) if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : if gameBoard[raw + 1 ][line + 1 ] = = '0' and vGameBoard[raw + 1 ][line + 1 ] = = '.' : openlemma(x + 1 , y + 1 ) # 주의의 0인 타일에 다시 openlemma를 적용 if gameBoard[raw][line] = = '0' : if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : vGameBoard[raw - 1 ][line - 1 ] = gameBoard[raw - 1 ][line - 1 ] if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line) and (line) < = 9 : vGameBoard[raw - 1 ][line] = gameBoard[raw - 1 ][line] if 0 < = (raw - 1 ) and (raw - 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : vGameBoard[raw - 1 ][line + 1 ] = gameBoard[raw - 1 ][line + 1 ] if 0 < = (raw) and (raw) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : vGameBoard[raw][line - 1 ] = gameBoard[raw][line - 1 ] if 0 < = (raw) and (raw) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : vGameBoard[raw][line + 1 ] = gameBoard[raw][line + 1 ] if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line - 1 ) and (line - 1 ) < = 9 : vGameBoard[raw + 1 ][line - 1 ] = gameBoard[raw + 1 ][line - 1 ] if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line) and (line) < = 9 : vGameBoard[raw + 1 ][line] = gameBoard[raw + 1 ][line] if 0 < = (raw + 1 ) and (raw + 1 ) < = 9 and 0 < = (line + 1 ) and (line + 1 ) < = 9 : vGameBoard[raw + 1 ][line + 1 ] = gameBoard[raw + 1 ][line + 1 ] #0인 타일의 주변의 타일을 연다 #------------------------------------------------------------------------------- def check() : #게임의 승리를 확인 global vGameBoard gameEnded = 0 for raw in range ( 10 ) : for line in range ( 10 ) : if gameBoard[raw][line] ! = '#' : if vGameBoard[raw][line] = = gameBoard[raw][line] : gameEnded = 1 else : gameEnded = 0 return 0 if gameEnded = = 1 : print ( '게임에 승리하였습니다.' ) return 1 #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- main() Colored by Color Scripter cs 728x90

출처 : www.programming-challenges.com

지뢰찾기 게임은 M x N 매트릭스에 위치해 있는 지뢰를 찾는 게임이다.

M x N 매트릭스 상의 격자(square)는 지뢰이거나 지뢰가 아니다.

지뢰 격자는 * 로 표시한다. 지뢰가 아닌 격자(square)는 숫자로 표시하며 그 숫자는 인접해 있는 지뢰의 수를 의미한다. (격자(sqaure)는 최대 8개의 인접한 지뢰를 가질 수 있다.)

다음은 4×4 매트릭스에서 2개의 지뢰(*)를 표시하는 방법이다.

*… …. .*.. ….

이 게임의 목표는 지뢰의 위치(*)를 제외한 나머지 격자들의 숫자를 맞추는 것이다.

위 경우의 답은 아래와 같다.

*100 2210 1*10 1110

입력

첫번째 줄은 M x N 의 M(행)과 N(열)에 해당되는 숫자이다. N과 M은 0보다 크고 100 이하이다. (0< N, M <=100) 그 다음 M개의 줄이 차례로 입력되고 각 줄은 정확하게 N개의 문자가 입력된다. 지뢰 격자는 * 로 표시하며 지뢰가 아닌 격자는 . (dot)로 표시한다. 출력 지뢰(*)를 제외한 나머지 격자의 숫자값을 찾아서 M x N 매트릭스를 출력한다. 예1) 입력 4 4 *... .... .*.. .... 출력 *100 2210 1*10 1110 예2) 입력 3 5 **... ..... .*... 출력

So you have finished reading the 파이썬 지뢰 찾기 topic article, if you find this article useful, please share it. Thank you very much. See more: 지뢰찾기 알고리즘, 지뢰찾기 만들기, 파이썬 테트리스, 파이썬 IDLE 게임, 파이썬 게임, 파이썬 오목, 지뢰찾기 인공지능, 유치한 게임

Leave a Comment