, , , , ,

[SOLVED] Csed101. programming & problem solving programming assignment 4

$25

File Name: Csed101._programming_&_problem_solving_programming_assignment_4.zip
File Size: 593.46 KB

5/5 - (1 vote)

β—Ό 개발 ν™˜κ²½: Python 3.x
β—Ό 제좜물
β€’ .py μ†ŒμŠ€ μ½”λ“œ (assn4_model.py, assn4_app.py)
➒ ν”„λ‘œκ·Έλž¨μ˜ μ†ŒμŠ€ μ½”λ“œμ— μ±„μ μžμ˜ 이해λ₯Ό 돕기 μœ„ν•œ 주석을 λ°˜λ“œμ‹œ λΆ™μ—¬μ£Όμ„Έμš”.
β€’ λ³΄κ³ μ„œ 파일 (.docx, .hwp λ˜λŠ” .pdf; assn4.docx, assn4.hwp λ˜λŠ” assn4.pdf)
β€’ λ³΄κ³ μ„œλŠ” AssnReadMe.pdfλ₯Ό μ°Έμ‘°ν•˜μ—¬ μž‘μ„±ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.
β€’ λͺ…μ˜ˆ μ„œμ•½ (Honor code): ν‘œμ§€μ— λ‹€μŒμ˜ μ„œμ•½μ„ κΈ°μž…ν•˜μ—¬ μ œμΆœν•΄ μ£Όμ„Έμš”: β€œλ‚˜λŠ” 이 ν”„λ‘œ
그래밍 과제λ₯Ό λ‹€λ₯Έ μ‚¬λžŒμ˜ λΆ€μ μ ˆν•œ 도움 없이 μ™„μˆ˜ν•˜μ˜€μŠ΅λ‹ˆλ‹€.” λ³΄κ³ μ„œ ν‘œμ§€μ— λͺ…μ˜ˆ
μ„œμ•½μ΄ κΈ°μž…λ˜μ–΄ μžˆμ§€ μ•Šμ€ κ³Όμ œλŠ” μ œμΆœλ˜μ§€ μ•Šμ€ κ²ƒμœΌλ‘œ μ²˜λ¦¬λ©λ‹ˆλ‹€.
β€’ μž‘μ„±ν•œ μ†ŒμŠ€ μ½”λ“œμ™€ λ³΄κ³ μ„œ νŒŒμΌμ€ PLMSλ₯Ό 톡해 μ œμΆœν•΄ μ£Όμ„Έμš”.
β—Ό 주의 사항
β€’ ꡬ문 였λ₯˜(Syntax Error)κ°€ λ°œμƒν•˜κ±°λ‚˜ 싀행이 λ˜μ§€ μ•ŠλŠ” κ³Όμ œλŠ” 0점으둜 μ±„μ λ©λ‹ˆλ‹€.
β€’ 제좜 κΈ°ν•œλ³΄λ‹€ ν•˜λ£¨ 늦게 제좜된 κ³Όμ œλŠ” μ΅œμ’… 20%, 이틀 늦게 제좜된 κ³Όμ œλŠ” μ΅œμ’… 40%
κ°μ λ©λ‹ˆλ‹€. 제좜 κΈ°ν•œλ³΄λ‹€ μ‚¬ν˜ 이상 늦으면 제좜 받지 μ•ŠμŠ΅λ‹ˆλ‹€ (0점 처리). λŠ¦μ€ 제
μΆœμ‹œ PLMS에 기둝된 μ΅œμ’… μˆ˜μ •μΌμ‹œλ₯Ό κΈ°μ€€μœΌλ‘œ κ°μ ν•©λ‹ˆλ‹€.
β€’ 각 문제의 μ œν•œ 쑰건과 μš”κ΅¬ 사항을 λ°˜λ“œμ‹œ μ§€μΌœ μ£Όμ‹œκΈ° λ°”λžλ‹ˆλ‹€.
β€’ 이번 κ³Όμ œλŠ” μΆ”κ°€ κΈ°λŠ₯ κ΅¬ν˜„κ³Ό κ΄€λ ¨λœ μΆ”κ°€ μ μˆ˜κ°€ λ”°λ‘œ μ—†μŠ΅λ‹ˆλ‹€.
β€’ λ³΄κ³ μ„œ μž‘μ„± μ‹œ, μ°Έκ³  링크도 ν¬ν•¨ν•΄μ£Όμ„Έμš”. λΆ€μ • ν–‰μœ„ 적발 μ‹œ 0점 μ²˜λ¦¬λ©λ‹ˆλ‹€.
β€’ λΆ€μ •ν–‰μœ„μ— κ΄€ν•œ κ·œμ •μ€ POSTECH μ „μžμ»΄ν“¨ν„°κ³΅ν•™λΆ€ ν•™λΆ€μœ„μ›νšŒμ˜ β€œPOSTECH μ „μžμ»΄ν“¨ν„°κ³΅
ν•™λΆ€ λΆ€μ •ν–‰μœ„ μ •μ˜β€λ₯Ό λ”°λ¦…λ‹ˆλ‹€ (PLMS의 λ³Έ κ³Όλͺ© 곡지사항에 λ“±λ‘λœ κΈ€ 쀑, 제λͺ©μ΄
[document about cheating]인 글에 μ²¨λΆ€λ˜μ–΄ μžˆλŠ” disciplinary.pdfλ₯Ό μ°Έμ‘°ν•  것.)
2
β—Ό Problem: 지뒰찾기
(λͺ©μ )
(1) Python tkinter 라이브러리λ₯Ό μ΄μš©ν•˜μ—¬ GUI ν”„λ‘œκ·Έλž˜λ°μ„ μ΅νž™λ‹ˆλ‹€.
(2) 클래슀 μ •μ˜ 및 μΈμŠ€ν„΄μŠ€ 생성을 μ΅νž™λ‹ˆλ‹€.
(3) 클래슀 상속 및 λ©”μ„œλ“œ μ˜€λ²„ 라이딩을 μ΅νž™λ‹ˆλ‹€.
(μ„€λͺ…)
지뒰 μ°ΎκΈ°λŠ” κΈ°μ–΅λ ₯κ³Ό 좔리λ ₯을 μš”ν•˜λŠ” κ°„λ‹¨ν•œ κ²Œμž„μœΌλ‘œ, 지뒰λ₯Ό ν”Όν•΄ λͺ¨λ“  빈 칸을 μ°ΎλŠ” 것이
이 κ²Œμž„μ˜ λͺ©ν‘œμž…λ‹ˆλ‹€. λ³΄λ“œμ˜ 각 μΉΈμ—λŠ” 지뒰가 μžˆλŠ” μΉΈκ³Ό μ—†λŠ” 칸으둜 이루어지며, ν”Œλ ˆμ΄μ–΄λŠ”
마우슀 클릭을 ν†΅ν•΄μ„œ λ³΄λ“œμ™€ μƒν˜Έμž‘μš©ν•˜λ©° 지뒰가 μ—†λŠ” κ΅¬μ—­λ§Œ λ°ν˜€μ•Ό ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ λ§Œμ•½
지뒰가 μ—†λŠ” 칸을 클릭할 κ²½μš°μ—λŠ” μΈμ ‘ν•œ 8μΉΈ(μžμ‹ μ„ μ€‘μ‹¬μœΌλ‘œ ν•œ 3Γ—3 ꡬ역)에 λŒ€ν•˜μ—¬ μ§€λ’°μ˜
개수λ₯Ό 숫자λ₯Ό ν†΅ν•΄μ„œ 힌트λ₯Ό μ€λ‹ˆλ‹€. 이λ₯Ό κΈ°λ°˜ν•œ 좔리λ₯Ό ν†΅ν•΄μ„œ 지뒰가 μ—†λŠ” λͺ¨λ“  칸을 λ°ν˜€μ•Ό
ν•©λ‹ˆλ‹€. μ•„λž˜ κ·Έλ¦Όμ—μ„œ λ³Ό 수 μžˆλ“―μ΄ νŒŒλž€ λ„€λͺ¨ μ•ˆμ— 3은 μžμ‹ κ³Ό μΈμ ‘ν•œ 8μΉΈ(λΉ¨κ°„ λ„€λͺ¨ μ•ˆμ˜
μ˜μ—­)에 3개의 지뒰가 μžˆλŠ” 것을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
[κ²Œμž„ κ·œμΉ™]
(1) ν”Œλ ˆμ΄μ–΄λŠ” 두 가지 λ™μž‘(마우슀 우 클릭, 쒌 클릭)을 ν†΅ν•΄μ„œ λ³΄λ“œμ™€ μƒν˜Έ μž‘μš©ν•  수
μžˆμŠ΅λ‹ˆλ‹€.
(2) ν”Œλ ˆμ΄μ–΄κ°€ 마우슀 우 클릭을 μˆ˜ν–‰ν–ˆμ„ λ•Œ κΈ°λŒ€ν•  수 μžˆλŠ” κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
A. 이미 λ°ν˜€μ§„ 칸인 경우, 아무 일도 μΌμ–΄λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
B. 아직 λ°ν˜€μ§€μ§€ μ•Šμ€ 칸인 경우
⁻아직 κΉƒλ°œμ΄ μ—†λŠ” 경우, κΉƒλ°œμ„ ν†΅ν•΄μ„œ λ§ˆν‚Ήμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κΉƒλ°œμ˜ 경우 ν”Œλ ˆμ΄μ˜
λΆ€μˆ˜μ μΈ λ„κ΅¬λ‘œ λͺ¨λ“  지뒰가 μžˆλŠ” μœ„μΉ˜λ₯Ό κΈ°μ–΅ν•˜λŠ” 것은 ν”Œλ ˆμ΄μ— 뢀담을 쀄 수 있기
λ•Œλ¬Έμ— ν”Œλ ˆμ΄ μ‹œμ— 지뒰λ₯Ό ν‘œμ‹œν•˜λŠ” λ„κ΅¬λ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (ν‘œμ‹œν•  수 μžˆλŠ”
κΉƒλ°œμ˜ 개수의 μ œν•œμ€ μ—†μŠ΅λ‹ˆλ‹€.)
β»κΉƒλ°œμ΄ μžˆλŠ” 경우, ν•΄λ‹Ή κΉƒλ°œμ„ μ§€μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.
(3) ν”Œλ ˆμ΄μ–΄κ°€ 마우슀 쒌 클릭을 μˆ˜ν–‰ν–ˆμ„ λ•Œ κΈ°λŒ€ν•  수 μžˆλŠ” κ²°κ³ΌλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
A. κΉƒλ°œλ‘œ ν‘œμ‹œλœ 칸인 경우, 아무 일도 μΌμ–΄λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
B. 이미 λ°ν˜€μ§„ 칸인 경우, 아무 일도 μΌμ–΄λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
C. 아직 λ°ν˜€μ§€μ§€ μ•Šμ€ 칸인 경우
⁻해당 μœ„μΉ˜κ°€ 지뒰라면 κ²Œμž„μ€ μ’…λ£Œλ˜κ³  ν”Œλ ˆμ΄μ–΄λŠ” νŒ¨λ°°ν•©λ‹ˆλ‹€.
⁻해당 μœ„μΉ˜κ°€ 빈 칸이라면 μΈμ ‘ν•œ 8칸의 μ§€λ’°μ˜ 수λ₯Ό ν‘œμ‹œν•©λ‹ˆλ‹€. λ§Œμ•½, μΈμ ‘ν•œ 8칸의
μ§€λ’°μ˜ μˆ˜κ°€ 0인 경우, ν•΄λ‹Ή 과정을 각 8 μΉΈμ—μ„œ λ‹€μ‹œ λ°˜λ³΅ν•©λ‹ˆλ‹€.
(4) ν”Œλ ˆμ΄μ–΄κ°€ 지뒰λ₯Ό μ œμ™Έν•œ λͺ¨λ“  빈 칸을 λ°ν˜”λ‹€λ©΄, ν”Œλ ˆμ΄μ–΄λŠ” μŠΉλ¦¬ν•©λ‹ˆλ‹€.
3
(κ΅¬ν˜„ λͺ©ν‘œ)
(1) 총 4개의 클래슀λ₯Ό ν†΅ν•΄μ„œ 지뒰 μ°ΎκΈ°λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€. 클래슀λ₯Ό κ΅¬ν˜„ν•  λ•Œμ—λŠ” μ•„λž˜μ—μ„œ
μ œμ‹œν•œ λ³€μˆ˜ 및 λ©”μ„œλ“œλ“€μ„ λ°˜λ“œμ‹œ μ‚¬μš©ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ„ κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€. μ•„λž˜ λͺ…μ‹œλœ λ³€μˆ˜
이름, λ©”μ„œλ“œ 이름 및 λ©”μ„œλ“œμ˜ λ§€κ°œλ³€μˆ˜ 및 리턴 값은 λ³€κ²½ λΆˆκ°€λŠ₯ ν•©λ‹ˆλ‹€. 이외에 ν•„μš”ν•œ
λ³€μˆ˜ 및 λ©”μ„œλ“œλŠ” μΆ”κ°€λ‘œ μ •μ˜ν•΄μ„œ μ‚¬μš©ν•  수 있으며, μΆ”κ°€ν•œ λ‚΄μš©μ— λŒ€ν•΄μ„œλŠ” μ†ŒμŠ€μ½”λ“œμ™€
λ³΄κ³ μ„œμ— μ„€λͺ…을 ν¬ν•¨ν•˜μ—¬ μž‘μ„±ν•΄μ•Ό ν•©λ‹ˆλ‹€.
A. Panel
지뒰 μ°ΎκΈ° κ²Œμž„μ˜ 각 칸에 ν•΄λ‹Ήν•˜λŠ” classμž…λ‹ˆλ‹€. μ•„λž˜μ— 주어진 λͺ¨λ“  λ³€μˆ˜, ν•¨μˆ˜λ₯Ό
κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
β‘  [λ³€μˆ˜] isRevealed : ν•΄λ‹Ή panel이 λ°ν˜€μ§„ μƒνƒœμΈμ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” bool type λ³€μˆ˜λ‘œ,
instanceλ₯Ό 생성 μ‹œ λ°˜λ“œμ‹œ False둜 μ΄ˆκΈ°ν™” ν•©λ‹ˆλ‹€.
β‘‘ [λ³€μˆ˜] hasFlag : ν•΄λ‹Ή panel이 flagλ₯Ό λ³΄μœ ν•˜κ³  μžˆλŠ”μ§€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” bool type
λ³€μˆ˜λ‘œ, instanceλ₯Ό 생성 μ‹œ λ°˜λ“œμ‹œ False둜 μ΄ˆκΈ°ν™” ν•©λ‹ˆλ‹€.
β‘’ [ν•¨μˆ˜] toggleFlag(self) : ν•΄λ‹Ή panel의 hasFlagλ₯Ό toggleν•©λ‹ˆλ‹€. 즉, ν˜„μž¬
hasFlagκ°€ True라면 μ‹€ν–‰ ν›„ Falseκ°€ 되고, False라면 μ‹€ν–‰ ν›„ Trueκ°€ λ©λ‹ˆλ‹€.
β‘£ [ν•¨μˆ˜] unveil(self) : ν•΄λ‹Ή panel을 λ°ν˜€μ§„ μƒνƒœλ‘œ λ³€κ²½λ©λ‹ˆλ‹€.
* Hint: isRevealed의 값이 Trueκ°€ λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.
B. EmptyPanel
지뒰가 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 칸을 μ˜λ―Έν•˜λŠ” class둜 Panel을 상속해야 ν•©λ‹ˆλ‹€. μ•„λž˜μ— 주어진
λͺ¨λ“  ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
β‘  [λ³€μˆ˜] numOfNearMines: ν•΄λ‹Ή panelκ³Ό μΈμ ‘ν•œ mine의 수λ₯Ό μ €μž₯ν•˜λŠ” num type
λ³€μˆ˜λ‘œ, instanceλ₯Ό 생성 μ‹œ λ°˜λ“œμ‹œ 0으둜 μ΄ˆκΈ°ν™” ν•©λ‹ˆλ‹€.
4
β‘‘ [ν•¨μˆ˜] addNumOfNearMines(self): ν•΄λ‹Ή panel의 numOfNearMines의 값을 1 증가
μ‹œν‚΅λ‹ˆλ‹€.
β‘’ [ν•¨μˆ˜] unveil(self): λΆ€λͺ¨μΈ Panel의 unveil을 μˆ˜ν–‰ν•˜κ³ , μ΄λ•Œ μΈμ ‘ν•œ mine의 수λ₯Ό
returnν•©λ‹ˆλ‹€.
C. MinePanel
지뒰가 μ‘΄μž¬ν•˜λŠ” 칸을 μ˜λ―Έν•˜λŠ” class둜 Panel을 상속해야 ν•©λ‹ˆλ‹€. μ•„λž˜μ— 주어진 λͺ¨λ“ 
ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
β‘  [ν•¨μˆ˜] unveil(self): λΆ€λͺ¨μΈ Panel의 unveil을 μˆ˜ν–‰ν•˜κ³ , -1을 returnν•©λ‹ˆλ‹€.
D. Board
지뒰 μ°ΎκΈ° κ²Œμž„μ— μ‚¬μš©λ˜λŠ” λͺ¨λ“  κΈ°λŠ₯을 ν¬ν•¨ν•˜λŠ” classμž…λ‹ˆλ‹€. μ—¬κΈ°μ„œλŠ” μ•žμ„œ λ§Œλ“ 
Panel class듀을 ν™œμš©ν•˜μ—¬ μ•„λž˜μ— 주어진 λͺ¨λ“  ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•΄μ•Ό ν•©λ‹ˆλ‹€.
β‘  [λ³€μˆ˜] panels : 2차원 리슀트둜 Panel instanceλ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. μ΄λŠ” reset ν•¨μˆ˜κ°€
호좜될 λ•Œλ§ˆλ‹€ μ΄ˆκΈ°ν™”λ©λ‹ˆλ‹€. (λ”°λΌμ„œ, instance 생성 μ‹œμ— λ°˜λ“œμ‹œ νŠΉμ • κ°’μœΌλ‘œ
μ΄ˆκΈ°ν™”ν•  ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€.)
β‘‘ [ν•¨μˆ˜] reset(self, numMine, height, width): Boardλ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œ
panels에 height크기만큼의 ν–‰κ³Ό width만큼의 열을 κ°€μ§€λŠ” 2차원 리슀트λ₯Ό
μƒμ„±ν•©λ‹ˆλ‹€. λ˜ν•œ, numMine으둜 주어진 숫자만큼 mine을 randomν•œ μœ„μΉ˜μ—
λΆ„ν¬μ‹œν‚΅λ‹ˆλ‹€. Mine이 μœ„μΉ˜ν•œ κ³³μ—λŠ” MinePanel이 λ“€μ–΄κ°€κ³ , Mine이 μ—†λŠ” μœ„μΉ˜μ—λŠ”
EmptyPanel이 듀어가도둝 ν•©λ‹ˆλ‹€. λ§ˆμ§€λ§‰μœΌλ‘œ, 각 EmptyPanelμ—λŠ” μΈμ ‘ν•œ Panel에
μœ„μΉ˜ν•œ Mine의 수만큼 numOfNearMinesκ°€ 듀어가도둝 ν•©λ‹ˆλ‹€. μ΄λ•Œ, EmptyPanel 의
λ³€μˆ˜μΈ numOfNearMines λ³€μˆ˜μ— 직접 μ ‘κ·Όν•˜μ—¬ 값을 λ³€κ²½ν•΄μ„œλŠ” μ•ˆλ˜κ³ ,
addNumOfNearMines ν•¨μˆ˜λ§Œμ„ μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
(ν•΄λ‹Ή 지뒰 μ°ΎκΈ° κ²Œμž„μ—μ„œλŠ” Board의 μ‚¬μ΄μ¦ˆμ™€ μ§€λ’°μ˜ κ°œμˆ˜κ°€ λ‚œμ΄λ„μ— λ”°λΌμ„œ
μœ λ™μ μœΌλ‘œ λ³€ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 ν•¨μˆ˜λŠ” κ·Έ μƒν™©λ§ˆλ‹€ Boardλ₯Ό Randomν•˜κ²Œ μ΄ˆκΈ°ν• 
λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.)
β‘’ [ν•¨μˆ˜] getNumOfRevealedPanels(self): ν˜„μž¬ board에 λ°ν˜€μ Έ μžˆλŠ” Panel의 개수λ₯Ό
returnν•©λ‹ˆλ‹€.
β‘£ [ν•¨μˆ˜] unveil(self, y, x): panels의 yν–‰ x열에 μœ„μΉ˜ν•œ Panel을 λ°νž™λ‹ˆλ‹€. λ§Œμ•½,
λ°ν˜€λ‚Έ Panel이 지뒰라면, -1을 returnν•©λ‹ˆλ‹€. 그렇지 μ•Šλ‹€λ©΄, 아무것도 returnν•˜μ§€
μ•ŠμŠ΅λ‹ˆλ‹€. λ˜ν•œ, λ§Œμ•½ λ°ν˜€λ‚Έ Panel의 numOfNearMines의 값이 0이라면, μΈμ ‘ν•œ 8μΉΈ
쀑에 지뒰가 μ—†λŠ” 칸에 λŒ€ν•΄μ„œ 이 과정을 λ°˜λ³΅ν•©λ‹ˆλ‹€. λ§Œμ•½ κΉƒλ°œμ΄ μ‘΄μž¬ν•˜λŠ” 칸에도
λ°˜λ³΅λ˜μ—ˆκ³ , ν•΄λ‹Ή 칸이 지뒰가 μ•„λ‹Œ 경우 ν•΄λ‹Ή 칸의 κΉƒλ°œμ„ μ œκ±°ν•˜κ³ , λ°ν˜€ λƒ…λ‹ˆλ‹€.
그렇지 μ•Šκ³  지뒰가 μžˆλŠ” 경우 κΉƒλ°œμ„ μœ μ§€ν•©λ‹ˆλ‹€.
* Hint: μ•„λž˜ κ·Έλ¦Όμ—μ„œ μ•Œ 수 μžˆλ“―μ΄ ν•œ 번의 yν–‰ xμ—΄μ˜ Panel을 λ°νžˆλŠ” ν–‰μœ„κ°€
μ–Όλ§ˆλ‚˜ λ§Žμ€ Panel을 밝히게 λ μ§€λŠ” μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, λ³„λ„μ˜ 자료
5
ꡬ쑰(stack λ“±)을 μ΄μš©ν•˜μ—¬ μ°¨λ‘€λŒ€λ‘œ λ°ν˜€λ‚΄κ±°λ‚˜ μž¬κ·€ ν•¨μˆ˜λ₯Ό ν™œμš©ν•˜μ—¬ 이 문제λ₯Ό
ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
(ν•΄λ‹Ή ν•¨μˆ˜λŠ” Board의 νŠΉμ • ꡬ역(yν–‰ xμ—΄)을 μ„ νƒν•˜μ˜€μ„ λ•Œμ˜ κ²°κ³Όλ₯Ό panels에
λ°˜μ˜ν•˜λŠ” κΈ°λŠ₯을 ν•©λ‹ˆλ‹€. λ”°λΌμ„œ, GUIμ—μ„œλŠ” ν•΄λ‹Ή κ΅¬μ—­μ˜ 선택 μ‹œ 이 ν•¨μˆ˜λ₯Ό
ν˜ΈμΆœν•˜κ³ , panels의 μ΅œμ’… κ²°κ³Όλ₯Ό κ·ΈλŒ€λ‘œ 화면에 λ³΄μ—¬μ£ΌκΈ°λ§Œ ν•˜λ©΄ λ©λ‹ˆλ‹€.)
β‘€ [ν•¨μˆ˜] toggleFlag(self, y, x): panels의 yν–‰ x열에 μœ„μΉ˜ν•œ Panel의 flagλ₯Ό
toggleν•©λ‹ˆλ‹€. 즉, ν˜„μž¬ flagκ°€ μ‘΄μž¬ν•œλ‹€λ©΄ μ‹€ν–‰ ν›„ 없어지고, μ—†λ‹€λ©΄ μ‹€ν–‰ ν›„
μ‘΄μž¬ν•˜κ²Œ λ©λ‹ˆλ‹€.
β‘₯ [ν•¨μˆ˜] checkReveal(self, y, x): panels의 yν–‰ x열에 μœ„μΉ˜ν•œ Panel이 λ°ν˜€μ Έ μžˆλŠ”μ§€
ν™•μΈν•©λ‹ˆλ‹€. λ°ν˜€μ Έ μžˆλ‹€λ©΄ Trueλ₯Ό returnν•˜κ³ , 그렇지 μ•Šλ‹€λ©΄ Falseλ₯Ό
returnν•©λ‹ˆλ‹€.
⑦ [ν•¨μˆ˜] checkFlag(self, y, x): panels의 yν–‰ x열에 μœ„μΉ˜ν•œ Panel에 flagκ°€ μžˆλŠ”μ§€
ν™•μΈν•©λ‹ˆλ‹€. flagκ°€ μžˆλ‹€λ©΄, Trueλ₯Ό returnν•˜κ³ , 그렇지 μ•Šλ‹€λ©΄ Falseλ₯Ό
returnν•©λ‹ˆλ‹€.
⑧ [ν•¨μˆ˜] checkMine(self, y, x): panels의 yν–‰ x열에 μœ„μΉ˜ν•œ Panel에 mine이 μžˆλŠ”μ§€
ν™•μΈν•©λ‹ˆλ‹€. mine이 μžˆλ‹€λ©΄, Trueλ₯Ό returnν•˜κ³ , 그렇지 μ•Šλ‹€λ©΄ Falseλ₯Ό
returnν•©λ‹ˆλ‹€.
⑨ [ν•¨μˆ˜] getNumOfNearMines(self, y, x): panels의 yν–‰ x열에 μœ„μΉ˜ν•œ Panel에 μΈμ ‘ν•œ
mine의 수λ₯Ό returnν•©λ‹ˆλ‹€. μ΄λŠ” ν•΄λ‹Ή Panel이 EmptyPanelμž„μ„ κ°€μ •μœΌλ‘œ ν•©λ‹ˆλ‹€.
E. App
GUI κ΅¬ν˜„ μ½”λ“œλ₯Ό λ‹΄λ‹Ήν•©λ‹ˆλ‹€. 전체 GUIλ₯Ό κ°μ‹ΈλŠ” Frameλ₯Ό μƒμ†ν•˜κ³ , 각 widget에
Board에 μ‘΄μž¬ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ μ ˆν•˜κ²Œ μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•©λ‹ˆλ‹€. μ‰½κ²Œ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ”
boardκ°€ 변경될 λ•Œλ§ˆλ‹€ 전체 νŒμ„ λ‹€μ‹œ κ·Έλ¦¬λŠ” 것도 쒋은 방법이 될 수 μžˆμŠ΅λ‹ˆλ‹€.
λ³„λ„λ‘œ μ œμ‹œν•˜λŠ” methodλŠ” μ—†κ³ , 자율적으둜 ν•΄λ‹Ή classλ₯Ό 적절히 μ±„μ›Œ μ•„λž˜ (2)μ—μ„œ
μ œμ‹œν•˜λŠ” GUI μš”κ΅¬ 사항을 λ§Œμ‘±μ‹œμΌœμ•Ό ν•©λ‹ˆλ‹€. (μΆ”κ°€ν•œ λ³€μˆ˜ 및 λ©”μ„œλ“œμ— λŒ€ν•œ μ„€λͺ…을
6
λ°˜λ“œμ‹œ 주석 및 λ³΄κ³ μ„œμ— μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆλ‹€.)
(2) ν•΄λ‹Ή μ‹œμŠ€ν…œμ—μ„œ μš”κ΅¬ν•˜λŠ” GUIλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.
A. μ „μ²΄λŠ” Header λΆ€λΆ„κ³Ό Body λΆ€λΆ„μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€.
B. Header λΆ€λΆ„μ—λŠ” μ΄ˆκΈ°ν™” λ²„νŠΌμ΄ μ‘΄μž¬ν•˜λ©°, κ°€λ‘œ λ°©ν–₯μ—μ„œ 쀑앙에 μœ„μΉ˜ν•©λ‹ˆλ‹€.
β‘  쒌 클릭 μ‹œμ— Body λΆ€λΆ„μ˜ λͺ¨λ“  λ‚΄μš©μ΄ μ΄ˆκΈ°ν™” ν•©λ‹ˆλ‹€.
β‘‘ 평상 μ‹œμ—λŠ” μ›ƒλŠ” λͺ¨μ–‘이 ν‘œκΈ°λ˜κ³ , 패배 μ‹œμ—λŠ” 해골, 성곡 μ‹œμ—λŠ” μ„ κΈ€λΌμŠ€λ₯Ό λ‚€
캐릭터가 λ…ΈμΆœλ©λ‹ˆλ‹€.
C. Body λΆ€λΆ„μ—λŠ” λ²„νŠΌμœΌλ‘œ 이루어진 지뒰 μ°ΎκΈ° λ³΄λ“œκ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€. (처음 ν¬κΈ°λŠ”
10Γ—10으둜 κ³ μ •ν•©λ‹ˆλ‹€.)
β‘  각 λ²„νŠΌμ€ 클릭이 κ°€λŠ₯ν•΄μ•Ό ν•˜κ³ , 이미 λ“œλŸ¬λ‚œ 뢀뢄은 μ‹œκ°μ μœΌλ‘œ λͺ…ν™•ν•˜κ²Œ ꡬ뢄이
κ°€μ•Ό ν•©λ‹ˆλ‹€.
β‘‘ λ°ν˜€μ§„ 빈 μΉΈ μ€‘μ—μ„œ 인근 μ§€λ’°μ˜ μˆ˜κ°€ 0인 칸은 0을 ν‘œκΈ°ν•˜μ§€ μ•Šκ³ , λΉ„μ›Œ λ‘‘λ‹ˆλ‹€.
β‘’ 쒌 클릭 μ‹œμ— ν•΄λ‹Ή μœ„μΉ˜μ— ν•΄λ‹Ήν•˜λŠ” 값이 λ°ν˜€μ§‘λ‹ˆλ‹€(숫자, 빈칸, 폭탄 쀑 ν•˜λ‚˜).
이미 λ°ν˜€μ‘Œκ±°λ‚˜ κΉƒλ°œμ΄ μ‘΄μž¬ν•˜λŠ” 경우 아무 일도 μΌμ–΄λ‚˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
β‘£ 우 클릭 μ‹œμ— ν•΄λ‹Ή μœ„μΉ˜μ— κΉƒλ°œμ„ κ½‚κ±°λ‚˜ μ œκ±°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이미 μžˆλ‹€λ©΄
μ œκ±°ν•˜κ³ , μ—†λ‹€λ©΄ 꽂을 수 μžˆλ‹€. 이미 λ°ν˜€μ§„ 칸의 경우 아무 일도 μΌμ–΄λ‚˜μ§€
μ•ŠμŠ΅λ‹ˆλ‹€.
β‘€ νŒ¨λ°°ν•œ 경우 μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  칸을 λ°νž™λ‹ˆλ‹€. μ•„λž˜μ˜ 두 번째 κ·Έλ¦Όκ³Ό 같이 λͺ¨λ“  칸이
λ°ν˜€μ Έμ•Ό ν•©λ‹ˆλ‹€.
β‘₯ κ΅¬ν˜„μ— ν•„μš”ν•œ 이미지 파일(μ›ƒλŠ” μ‚¬λžŒ, 해골, μ„ κΈ€λΌμŠ€, 폭탄, κΉƒλ°œ)은 imgs 폴더
μ•ˆμ— λͺ¨λ‘ μ‘΄μž¬ν•˜λ‹ˆ 이λ₯Ό μ‚¬μš©ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.
⑦ μ΄μ™Έμ˜ λ””ν…ŒμΌν•œ λ””μžμΈμ€ 평가 ν•­λͺ©μ— 듀어가지 μ•ŠμŠ΅λ‹ˆλ‹€.
Ex) μ™Όμͺ½λΆ€ν„° ν”Œλ ˆμ΄ 쀑, 패배 μ‹œ, 성곡 μ‹œμ˜ κ²°κ³Ό
7
D. 상단 λ‚œμ΄λ„ 메뉴λ₯Ό ν†΅ν•΄μ„œ Easy, Normal, Hard둜 λ°”κΏ€ 수 μžˆλ„λ‘ κ΅¬ν˜„ν•©λ‹ˆλ‹€.
λ‚œμ΄λ„λ§ˆλ‹€ μ§€λ’°μ˜ κ°œμˆ˜μ™€ λ³΄λ“œμ˜ 크기가 λ³€ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
β‘  Easy : 10개의 지뒰, 10Γ—10 board
β‘‘ Normal : 30개의 지뒰, 15Γ—15 board
β‘’ Hard : 50개의 지뒰, 20Γ—20 board
Ex) 상단에 λ‚œμ΄λ„λΌλŠ” 메뉴가 μ‘΄μž¬ν•˜κ³ , μ™Όμͺ½λΆ€ν„° ν•΄λ‹Ή λ‚œμ΄λ„μ— λ”°λ₯Έ λ³΄λ“œμ˜ 크기
λ³€ν™”λ₯Ό λ³΄μž…λ‹ˆλ‹€. (Easy, Normal, Hard 순)(주의 사항)
(1) λ‹€μ‹œ ν•œ 번 κ°•μ‘°ν•˜μ§€λ§Œ, λ””μžμΈμ€ μ μˆ˜μ— λ°˜μ˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. κ³Όλ„ν•œ μ‹œκ°„μ„ νˆ¬μžν•˜μ§€
λ§ˆμ‹œκΈ° λ°”λžλ‹ˆλ‹€.
(2) ν•΄λ‹Ή κ³Όμ œμ—μ„œλŠ” 두 개의 파일(model.py, app.py)이 μ‘΄μž¬ν•˜λ©°, 두 개 λͺ¨λ‘ μ œμΆœμ„ ν•΄μ•Ό
ν•©λ‹ˆλ‹€. κ·Έ 쀑 app.pyμ—μ„œλŠ” GUIκ°€ λ™μž‘ν•˜μ§€ μ•Šλ”λΌλ„, model.py의 Board, Panel, EmptyPanel,
MinePanel의 κ΅¬ν˜„λ§ŒμœΌλ‘œλ„ 점수λ₯Ό λΆ€μ—¬ν•©λ‹ˆλ‹€.
[μ°Έκ³ ]
(1) Demo λ™μ˜μƒ
https://drive.google.com/file/d/1cqOAmF7E-QWR1bSH3zkReoaXHUbBKH5R/view?usp=sharing
(2) GUI μ°Έκ³  μ½”λ“œ
κ΅¬ν˜„μ— 도움이 될 수 μžˆλŠ” GUI codeμž…λ‹ˆλ‹€. ν•˜μ§€λ§Œ, 정닡이 μ•„λ‹ˆλ‹ˆ νŽΈν•œλŒ€λ‘œ κ΅¬ν˜„ν•˜μ‹œλ©΄
λ©λ‹ˆλ‹€.
https://github.com/euidong/minesweeper/blob/v0.0.1/gui_test.py

Reviews

There are no reviews yet.

Only logged in customers who have purchased this product may leave a review.

Shopping Cart
[SOLVED] Csed101. programming & problem solving programming assignment 4
$25