https://zetcode.com/gui/pyqt5/tetris/


์œ„ ์‚ฌ์ดํŠธ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์ฐธ์กฐํ•ด์„œ ๋จผ์ € ๋”ฐ๋ผ ๋งŒ๋“ค์–ด๋ณด๊ณ  ๊ทธ ๋‹ค์Œ์— ์•ˆ ๋ณด๊ณ  ๋งŒ๋“ค์–ด๋ณผ ์˜ˆ์ •

๊ฒŒ์ž„์€ ์ฝ”๋”ฉ๋ณด๋‹ค๋Š” ๊ธฐํš์ด ๋” ์ค‘์š”ํ•˜๊ฒ ์ง€๋งŒย 

์šฐ์„  ์ฝ”๋”ฉ์ด ๋˜์–ด์•ผ ๊ธฐํš์„ ํ•˜๋˜ ๋ง๋˜ ํ•  ์ˆ˜ ์žˆ์„ํ…Œ๋‹ˆ ๊ณ ์ „๊ฒŒ์ž„๋ถ€ํ„ฐ ๋ชจ๋ฐฉํ•ด๋ณด๋ ค๊ณ  ํ•ด


์œ„ ์˜ˆ์ œ๊ฐ€ ์•„๋ฌด๋ž˜๋„ pyqt๋ฅผ ์†Œ๊ฐœํ•˜๊ธฐ ์œ„ํ•œ ์˜ˆ์ œ์ด๊ธฐ ๋–„๋ฌธ์—

๋‹ค๋ฅธ ํ…ŒํŠธ๋ฆฌ์Šค ์ฝ”๋“œ์— ๋น„ํ•ด์„œ ์ข€ ๋” ๋ฌด๊ฒ๊ณ  qt๋ฅผ ์ž˜ ์•Œ์•„์•ผ๋งŒ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„ค

์ด๊ฒŒ ๋๋‚˜๋ฉด ์—ญํ–‰ํ•ด์„œ console ๋ฒ„์ „ ํ…ŒํŠธ๋ฆฌ์Šค๋„ ๋งŒ๋“ค์–ด๋ณผ๊นŒ ํ•ด


์ฝ”๋“œ ์ˆ˜ํ–‰ ์‹œ ๋А๋‚€ ์ 

A. ํ…ŒํŠธ๋ฆฌ์Šค ๊ธฐ๋ณธ ๋™์ž‘ ์™ธ์— ๊ตฌํ˜„ ๋˜์–ด ์žˆ๋Š” ์‚ฌํ•ญ

  • ๋ชจ์–‘๋งˆ๋‹ค ์ƒ‰์ด ๋‹ค๋ฆ„
  • ์ ์ˆ˜ ํ‘œ์‹œ
  • ์ผ์‹œ ์ •์ง€

B. ๊ตฌํ˜„ ๋˜๋ฉด ์ข‹์€ ์‚ฌํ•ญ
  • ๋‹ค์Œ์— ๋‚˜์˜ฌ ๋„ํ˜• ์•Œ๋ ค์ฃผ๋Š” ์ฐฝ
  • ์ดํŽ™ํŠธ ๋ถ€์กฑ(ํ•œ์ค„์„ ๋งž์ท„์„ ๋•Œ ์‚ฌ๋ผ์ง€๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋ผ๋˜๊ฐ€.)
  • ์ด ๋ธ”๋Ÿญ์ด ๋–จ์–ด์งˆ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ธฐ๋Šฅ ON/OFF
  • ๊ฒŒ์ž„ ๋‹ค์‹œ ์‹œ์ž‘ ๋ฒ„ํŠผ
  • ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์†๋„๊ฐ€ ๋นจ๋ผ์ง€๋Š” ๋‚œ์ด๋„ ํšจ๊ณผ
  • ๋ฐฐ๊ฒฝ ๋ฐ ๋ฐฐ๊ฒฝ์Œ์•…, ํšจ๊ณผ์Œ ์ถ”๊ฐ€

C. ๋‚ด๊ฐ€ ๊ตฌํ˜„ ํ•˜๊ณ  ์‹ถ์€ ์ตœ์†Œํ•œ์˜ ์‚ฌํ•ญ
  • ํ…ŒํŠธ๋ฆฌ์Šค ๊ธฐ๋ณธ ์‚ฌํ•ญ
  • ๋ชจ๋“  ๋ธ”๋Ÿญ์€ ๊ฒ€์€ ์ƒ‰์œผ๋กœ ๋‹จ์ˆœํ™”
  • ์œ„ ๋ฐฉํ–ฅํ‚ค ํšŒ์ „
  • ์•„๋ž˜ ๋ฐฉํ–ฅํ‚ค ์•„๋ž˜๋กœ ํ•œ ์นธ ์ด๋™
  • ์ŠคํŽ˜์ด์Šค ์งํ•˜๊ฐ•
  • ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ ์ด๋™
  • ์ผ์‹œ ์ •์ง€

๊ฐ„๋‹จํ•œ ์ฝ”๋“œ ๋ถ„์„
3๊ฐœ์˜ ํด๋ž˜์Šค๋กœ ๊ตฌ์„ฑ
Tetris, Board, Shape

Tetris : QMainWindow
๊ฐ€์žฅ ๋ฉ”์ธ์ด ๋˜๋Š” window. ์ ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์ƒํƒœ๋ฐ”์™€ ๊ฒŒ์ž„ ํ™”๋ฉด์ด ๊ทธ๋ ค์งˆ Board ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ง„๋‹ค.

Board : QFrame
ํ‚ค๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ  ์‹ค์งˆ์ ์œผ๋กœ ๊ฒŒ์ž„ ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ํด๋ž˜์Šค

์™œ QFrame์„ ์ƒ์†๋ฐ›์•˜๋Š”์ง€๋Š” ์กฐ์‚ฌ ํ•„์š”
์ •ํ•ด์ง„ ์‹œ๊ฐ„ ๋˜๋Š” ํ‚ค๋ณด๋“œ ์ž…๋ ฅ์— ๋”ฐ๋ผ ๋ธ”๋Ÿญ์ด ์›€์ง์ด๊ณ  ์›€์ง์ž„์— ๋”ฐ๋ผ ํ™”๋ฉด์„ ๊ทธ๋ฆฐ๋‹ค.

์ •ํ•ด์ง„ ์‹œ๊ฐ„:
๋‚ด๋ถ€์—์„œ timer๋ฅผ ์ด์šฉํ•ด ์ •ํ•ด์ง„ ์‹œ๊ฐ„๋งˆ๋‹ค ๊ตฌํ˜„ํ•ด๋‘” timerEventํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ
timerEvent์—์„œ newPieceํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ tryMove๋กœ ์ดˆ๊ธฐ ์œ„์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ

ํ‚ค๋ณด๋“œ ์ž…๋ ฅ:
tryMove๋กœ ๋‹ค์Œ ์œ„์น˜๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธ

ํ™”๋ฉด์„ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์€ updateํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ

Update๋ฅผย ํ˜ธ์ถœํ•˜๋Š”ย ์ด์œ 


updateํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด paintEvent๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋จ

paintEvent์—์„œ ๋‘ ๋‹จ๊ณ„์— ๊ฑธ์ณ ํ™”๋ฉด์„ ๊ทธ๋ฆผ

ย ์Œ“์—ฌ์žˆ๋Š” ๋ธ”๋Ÿญ

  • board๋ผ๋Š” 1์ฐจ์› ๋ฐฐ์—ด์— ์ˆซ์ž๊ฐ€ ์ž…๋ ฅ๋˜์–ด ์žˆ์œผ๋ฉฐ ๊ฐ ์›์†Œ๋Š” ๊ฒŒ์ž„ํŒ์˜ ๋„ํ˜•์„ ์˜๋ฏธ

  • 2์ฐจ์›์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋งˆ์Œ์ด ํŽธํ•  ๊ฒƒ์œผ๋กœ ๋ณด์ž„

์กฐ์ž‘๊ฐ€๋Šฅํ•œ ๋ธ”๋Ÿญ

  • ๋ธ”๋Ÿญ์˜ ํŠน์ • ์œ„์น˜๋ฅผ ์•Œ๊ณ  ์žˆ๊ณ  ๋ชจ๋“  ๋ธ”๋Ÿญ์€ 4๊ฐœ์˜ ๋„ค๋ชจ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— 4๋ฒˆ ๋ฃจํ”„๋กœ ๋„ํ˜• ๊ทธ๋ฆผ

Shape
ํ…ŒํŠธ๋ฆฌ์Šค ๋ธ”๋Ÿญ์„ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ํด๋ž˜์Šค
์ขŒํ‘œ ๊ฐ’ (x, y)๋ฅผ ํŠœํ”Œ๋กœ ํ•˜๊ณ  ์ด๋ฅผ 4๊ฐœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„
90๋„ ํšŒ์ „์€ ์•„๋ž˜ ๊ธ€์„ ์ฐธ์กฐ



๋”ฐ๋ผํ•˜๊ธฐ ๊ณผ์ •
  1. ์ดˆ๊ธฐ ํ™”๋ฉด ๋„์šฐ๊ธฐ
  2. ํ‚ค ์ž…๋ ฅ ํ™•์ธ
  3. ํƒ€์ด๋จธ ์ด๋ฒคํŠธ ๋™์ž‘ ํ™•์ธ
  4. 7๊ฐœ ๋ธ”๋Ÿญ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚ด๊ธฐ
  5. ๋ธ”๋Ÿญ์— ํ‚ค ์ž…๋ ฅ ์ ์šฉ
    1. ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ
    2. ์ŠคํŽ˜์ด์Šค๋ฐ”
    3. ํšŒ์ „
  6. ๋ธ”๋Ÿญ์ด ๋–จ์–ด์ ธ ์Œ“์ด๋Š” ๋™์ž‘
  7. ํ•œ ์ค„์„ ์™„์„ฑ ํ–ˆ์„ ๋•Œ์˜ ๋™์ž‘ ๊ตฌํ˜„


ํ…ŒํŠธ๋ฆฌ์Šค๋Š” ์ง„์งœ์ง„์งœ ์˜ˆ์ œ ์ฝ”๋“œ๊ฐ€ ์–ด๋งˆ๋ฌด์‹œํ•˜๊ฒŒ ๋งŽ๋”๋ผ๊ณ 
๋„ˆ๋ฌด ๋ง๋„ ์•ˆ๋˜๊ฒŒ ๋งŽ์•„์„œ ์ด๊ฒƒ์ €๊ฒƒ ๋ณด๋‹ค๊ฐ€ ์—๋ผ์ด ๊ทธ๋ƒฅ ์ œ์ผ ์ต์ˆ™ํ•œ pyqt๋กœ ์™”์–ด
๊ทผ๋ฐ ๋ง‰์ƒ ํ•ด๋ณด๋ ค๋‹ˆ ์ต์ˆ™ํ•˜์ง€ ์•Š๋„ค ใ…‹ใ…‹
์–ผ์ถ” ์ฝ”๋“œ๋ฅผ ํ›‘์–ด๋ณด๋ฉฐ ์ดํ•ดํ–ˆ๋Š”๋ฐ pyqt ์ž์ฒด์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋งŽ์ด ํ•„์š”ํ•˜๋„ค
์ด๊ฑฐ ์™„์„ฑํ•˜๋ฉด console ๋ฒ„์ „์„ ๊ผญ ๋งŒ๋“ค์–ด ๋ด์•ผ ๊ฒ ์–ด

๋‹ค๋ฅธ ๋ถ„๋“ค ๋งŒ๋“  ๊ฑฐ ๋ณด๋ฉด ์‚ด์ง ๊ธฐ๊ฐ€ ์ฃฝ์ง€๋งŒ ์ฒœ๋ฆฌ๊ธธ๋„ ํ•œ ๊ฑธ์Œ๋ถ€ํ„ฐ ์‹œ์ž‘์ด์ง€
๋‚ด์ผ๋ถ€ํ„ฐ ๊ตฌํ˜„์— ๋“ค์–ด๊ฐ„๋‹ค