E D R , A S I H C RSS

Mine Finder

1. †Œ๊ฐœ

  • ด๋ฆ„ : Mine Finder
  • ฐธ—ฌ : ๊ฐ•„ฒœ (99, 1002)
  • ๊ธฐ๊ฐ„ : 2002. 2. 10 ~ 2.23 (๋ฌธ„œ™” ž‘—…๊ณผ • ฌ•จ•ด„œ.. 2ฃผ ๊ธ๋ฆด๋“ฏ.)
  • ๋ชฉ‘œ : œˆ๋„šฐ˜ ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ๊ณผ ง ‘ ๋Œ€™”, ง€๋ขฐ๋ฅผ ŠคŠค๋กœ ฐพ•„๋‚ด๋Š” ”„๋กœ๊ทธ๋žจ„ ๋งŒ๋“ ๋‹ค.
  • ๊ฐœ๋ฐœˆด : Visual C++ 6.0, cppunit 1.62, SPY++, ง€๋ขฐฐพ๊ธฐ 2000, 98๋ฒ„ „
  • ๋™๊ธฐ : ‹ฌ‹ฌ•ด„œ. †๋ชฉ €๋ ค„œ. -_-;
  • ๊ฐœ๋ฐœ๋ฐฉ๋ฒ• : XP ˜ ผ๋ถ€๋ถ„ †Œญ šฉ.
  • ‹œŠค…œ : ๋“€๋ก  1G 256RAM WIN 2000

2. ๊ณ„š

2.1. schedule

Šน๋ณ„žˆ žก€๋ฐ” —†Œ. --;
2›” 16ผ๊นŒง€ ”„๋กœ๊ทธ๋ž˜๋ฐ ™„๋ฃŒ. 2›” 23ผ๊นŒง€ ๋ฌธ„œ™” ™„๋ฃŒ.
  • ๋ชฉ‘œˆ˜ • - ๋œป•˜ง€ •Š€ ๋ฌธ œ๋กœ. -_-; 2›” 28ผ. ๋งผ๊นŒง€๋Š” –ด๋–ป๊ฒŒ๋“ ! --;

2.2. ๊ธฐ๋Šฅ spec

  • œˆ98, œˆ2000 ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ ง€› (˜„žฌ 2000 €  œ๋Œ€๋กœ ง€›. 98 ชฝ ˜ธ™˜„ ๋†’ด๊ธฐค‘)
  • ถ”›„ ”„๋กœ๊ทธ๋žจด ปคˆ ๊ฒฝšฐ '๋ˆˆ' ๋ถ€๋ถ„๊ณผ 'ง€๋Šฅ' ๋ถ€๋ถ„„ ๋”ฐ๋กœ ๋นผ๋‚ผ ˆ˜ žˆ๋„๋ก ๊ถ๋ฆฌ.
    • '๋ˆˆ' •ด๋‹น ๋ถ€๋ถ„ - ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจœผ๋กœ๋ถ€„ฐ ๋น„Šธ๋งต„ –ป–ด ๋ฐด„ฐ๋กœ ๋ณ€™˜•˜๋Š” ๋ฃจ‹ด ๊ด€๋ จ๋ถ€. ˜„žฌ bitmap 1:1 matching ๋ถ€๋ถ„ด ๊ฐ€žฅ ๋ถ€•˜๊ฐ€ ๋งŽด ๊ธ๋ฆฌ๋Š” ๋ถ€๋ถ„œผ๋กœ ™•ธ๋จ— ๋”ฐ๋ผ, ๊ฐ€žฅ ๊ฐœ„ •ด•ผ •  ๋ถ€๋ถ„.
    • 'ง€๋Šฅ' •ด๋‹น ๋ถ€๋ถ„ - ๋ณ€™˜๋œ ๋ฐด„ฐ๋ฅผ ๊ทผ๊ฐ๋กœ •ด•ผ •  –‰๋™„ ๊ฒฐ ••˜๋Š” ๋ถ€๋ถ„. ๊ธฐ๋ณธ ธ ˜•ƒœ๋Š” œ •œƒƒœ๋จธ‹ „ ๋ˆ๋‹ค.
      • ถ”›„ DP ๋กœ ™•žฅ๋œ๋‹ค๋ฉด StrategyPattern ๊ณผ StatePattern ๋“ด ดšฉ๋  ๊ฒƒ ๊ฐ™ง€๋งŒ. ด๋Š” ถ”›„ Refactoring •ด ๋‚˜๊ฐ€๋ฉด„œ ƒ๊ฐ•ด๋ณผ ‚ฌ•ญ. ”„๋กœ๊ทธ๋žจด ข€ ๋” ปคง€๊ณ  Refactoring ด ด๋ฃจ–ด„๋‹ค๋ฉด DLL ๋ถ€๋ถ„œผ๋กœ ๋น  ธ๋‚˜˜ฌ ˆ˜ žˆ„๋“ฏ. ('๋น  ธ๋‚˜™€•ผ •  ƒ™ฉด ƒ๊ธธ๋“ฏ' ด ๋”  •™••˜ง€๋งŒ. -_-a)

3. „–‰ ƒ™ฉ

  • 2›” 10ผ
    • ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ˜ œˆ๋„šฐ •ธ๋“ค„ –ป๊ณ  •ด๋‹น ๋ฉ”„ง€๋ฅผ ๋ณด๋‚ด–ด„œ ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ„ ๊ตฌ๋™•˜๋Š” ๋ฃจ‹ด ๊ด€๋ จ SpikeSolution. (•„.. UnitTest ฝ”๋“œ ๋„ฃ๊ธฐ๊ฐ€ • ๋งค•ด„œ •ˆ„—ˆ๋‹ค. ๊ถ๋ฆฌ•ด๋ด•ผ •  ๋ถ€๋ถ„๊ฐ™๋‹ค.)
    • ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ˜ œˆ๋„šฐ •ธ๋“ค„ –ป€๋’ค DC๋ฅผ –ป€›„ ™”๋ฉด บกณ. ๊ทธ๋ฆฌ๊ณ  บกณ•œ ๋น„Šธ๋งต„ ๊ทผ๊ฐ๋กœ •˜—ฌ ๋ฐด„ฐ๋กœ ๋ณ€™˜•˜๋Š” ๋ฃจ‹ด ๊ด€๋ จ SpikeSolution
  • 2›” 11ผ
    • Main Design, Algorithm 1ฐจ ™„„. –ด๋А •๋„ Refactoring˜ ถ”๊ตฌ.
  • 2›” 13ผ
    • •Œ๊ณ ๋ฆฌฆ˜ ตœ ™” ๊ถ๋ฆฌ. 3๊ฐ€ง€ •๋„ ๋Œ€•ˆ ๋ชจƒ‰.
    • 98 ๋ฒ„ „˜ ง€๋ขฐฐพ๊ธฐ™€ 2000 ๋ฒ„ „˜ ง€๋ขฐฐพ๊ธฐ๊ฐ€ ๋น„Šธ๋งต๋ฐด„ฐ๊ฐ€ ๋‹ฌ๋ผ„œ ƒ๊ธฐ๋Š” ๋ฌธ œ –ด๋А •๋„ •ด๊ฒฐ.
    • ˜„žฌ †๋„
      • Begineer mode ตœ๊ณ ๊ธฐ๋ก 1ˆ, ‰๊ท  4-7ˆ.
      • Middle mode ตœ๊ณ ๊ธฐ๋ก 21ˆ, ‰๊ท  30~50ˆ •ˆชฝ.
      • Expert mode ตœ๊ณ ๊ธฐ๋ก 151ˆ. ๋‹จ, ๊นฐ ˆ˜ žˆ๋Š” ™•๋ฅ  ๋‚ฎŒ. -_-; •„. ™•๋ฅ ๋†’€ ฐ๊ธฐ •Œ๊ณ ๋ฆฌฆ˜ด •„š”•˜๋‹ค๋Š”. --;
  • 2›” 26ผ
    • ๋„๋จผŠธ ถ”๊ฐ€ค‘. (ผฃผผ„ ‘ธš ๋†€•˜๋‹ค๋Š”. -_-;)
  • 2›” 27ผ
    • Expert mode 51ˆ, Middle mode 11ˆ ๊ธฐ๋ก. •Œ๊ณ ๋ฆฌฆ˜ ตœ ™”— ๋Œ€•œ ๋‹ค๋ฅธ ๊ด€  žกŒ. (•˜ง€๋งŒ, —ฌ „žˆ ๊นฐ ˆ˜ žˆ๋Š” ™•๋ฅ  ๋‚ฎŒ)
  • 2›” 28ผ, 3›” 1ผ
    • Expert mode ๊นฐ ˆ˜ žˆ๋Š” ™•๋ฅ „ ๋†’ž„. ตœ ™”๋‚ด—„œ •ด๊ฒฐ•  ๋ฐฉ๋ฒ•€ ๋” ž˜๋“ค๋“ฏ. 98๊ณผ˜ ˜ธ™˜„ –ฅƒ๋ฌธ œ •ด๊ฒฐด›„ ข…๋ฃŒ ˜ˆ •.
  • 3›” 1ผ ข…๋ฃŒ.

4. ข…๋ฃŒ›„ ๊ฐƒ๊ธฐ(?)

  • ๋””žธ ๋ถ€๋ถ„—„œ˜ TFP˜ ค‘š”„„ ๋†“นœ๊ฒƒด ™”๊ทผด ๋˜—ˆ๋‹ค๋Š”. -_-; ถ”›„ •Œ๊ณ ๋ฆฌฆ˜ ๋ถ€๋ถ„œผ๋กœ ๋“ค–ด๊ฐ€๋ฉด„œ TFP๋ฅผ ๊ฒŒ„๋ฆฌ •œ  ๊ณผ ”„๋กœ๊ทธ๋žจ ๋Œ•„๊ฐ„๋‹ค๋Š”  —„œ˜ ฆ๊›€— ‹œ๊ฐ„๋‚ญ๋น„๊ฐ€ ข€ ‹ฌ–ˆ๋‹ค๋Š”..~
  • ๋ฏธ…˜ ฌ๋ฆฌ‹ฐปฌ•œ ๋ฌธ œ˜€๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋„˜–ด๊ฐ€๋ฉด •ˆ๋  ผดง€๋งŒ. -_-; žฅ๋‚œ๊ฐ ๊ฐ€ง€๊ณ  ๋…ธ๋Š” ๊ธฐ๋ถ„œผ๋กœ •œ ผด˜€๋˜ง€๋ผ.~ ๊ทธ๋ฆฌ ๋ฌด๊ฒŒ๊ฐ„ ๊ฐ€ง€๊ณ  •œ ผด •„๋‹Œ ๊ด€๊ณ„๋กœ Šน๋ณ„žˆ ๋‚˜˜„ •Š•˜๋‹ค.
  • ˜„‹ค—„œ ๊ฐ€ƒœผ๋กœ ๋‹ค‹œ ˜„‹ค๋กœ. •”Šผ '1002 ๋ณด๊ธฐ— ข‹•˜๋”๋ผ'. —ฌ „žˆ ๋ฉฒญ•œ ๋„˜ด๊ณ  ฃผ‚ฌœ„ ๋˜ง€๋Š” ๋„˜ดง€๋งŒ (˜ค˜ธ.. Random Open ๋•Œ ฃผ‚ฌœ„ ๋Œ๋ฆฌ๋Š” • ๋‹ˆ๋ฉ”ด…˜„„„๊นŒ. ^^;)
  • ง€๊ธˆฏค ๋‹ค‹œ งœ๋ผ๊ณ  •œ๋‹ค๋ฉด TFP๋ฅผ ข€ ๋”  œ๋Œ€๋กœ ถ”๊ตฌ•  ˆ˜ žˆ„ ๊ฒƒ๋„ ๊ฐ™๋‹ค. (ด  —„œ TFP๋ฅผ • ๋•Œ SpikeSolution — ๋Œ€•œ –ด๋А •๋„˜ ถฉ๋ถ„•œ ‹œ๊ฐ„„ ๋‘๋Š”  ด ข‹„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ƒ๊ฐด ๋“ค—ˆ๋‹ค. ˆ๊ธฐ SpikeSolution œผ๋กœ •ด๋‹น ๋ถ€๋ถ„„ ๊ฐ„๋‹จ•˜๊ฒŒ ๋Œ€๊ฐ• •ด๋ณด๊ณ , Test๋ฅผ •  ˆ˜ žˆ๋Š” ๋ถ€๋ถ„— ๋Œ€•œ ๊ตฌฒด™”•˜๊ธฐ.)
  • CppUnit ๋ฅผ “ธ๋•Œ—๋Š” MFC ๋ผด๋ธŒ๋Ÿฌ๋ฆฌ๋“คด static œผ๋กœ ๋ง‚นด •ˆ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ข€ ๋” ‚ดŽด๋ด•ผ๊ฒ ๋‹ค.

5. ฐธกฐ ๋ฌธ„œ

  • MSDN
----
˜˜„ ˜• ‹ ๊ธฐ•ด~ ใ…Žใ…Žใ…Ž bitmap data๋กœ ˆž๋“ค๊ณผ ๊‹œ๊ธฐ๋“ค„ ๊ตฌ๋ถ„•œ๊ด๊ฐ€..ใ…กใ…กa.. spy ข‹๊ตฌ๋งŒ..

•ด„ ˜ค˜ค.. Artificial Intelligence.. -_- ๊ทผ๋ฐ  € ŠคŽ ๋งด ๋งž๋‚˜..

1002 ๋ญ. –ดฐจ”ผ ๋…ธ๊ฐ€๋‹ค๋ฅผ •ด๋„ ปด„ฐ๊ฐ€ •˜๋Š” ๊ฒƒ„. -_-v ด๋กœ„œ ฆ๊ธฐ๊ฒŒ ๋˜๋Š” ๊ฒŒž„ด •˜๋‚˜ „–ด๋ฒ„๋ฆฌ๋Š”๊ด๊ฐ€. --;; A.I. ๋ผ๊ณ  ๋ถ™ด๊ธฐ—” ๋„ˆ๋ฌด ๋‹จˆœ•ด„œ ข€ ชฝ Œ”๋ฆฌ๋Š”๊ตฐ. --;


6. Opening

Šต๊ด€„œผ๋กœ —ฌ๋Š” ”„๋กœ๊ทธ๋žจ Best: 1. Explorer 2. ”„๋ฆฌ…€ 3. ง€๋ขฐฐพ๊ธฐ. -_-;

NSISIde †ŒŠค๋ฅผ ๋งŒง€ž‘ ๊ฐ๋ฆฌ๋˜ค‘ ”ผ๊ณค•ด„œ ง€๋ขฐฐพ๊ธฐ๋ฅผ •˜๊ฒŒ ๋˜—ˆ๋‹ค. กฐ˜ด ๋ฌด๋ฆฌ๋ฅผ –ˆ๋Š”ง€(?) †๋ชฉด  €๋ ค˜ค๊ธฐ ‹œž‘–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๊ฐ‘ž๊ธฐ 'ฝ' •˜๊ณ  ๋™‹œ ๋‹ค๋ฐœ œผ๋กœ —ฌ๋Ÿฌ๊ฐ€ง€ ƒ๊ฐ„ •˜๊ฒŒ ๋˜—ˆ๋Š”๋ฐ, •˜๋‚˜๋Š” ˜ˆ „— •™๊ต—„œ —ด๋ ธ๋˜ '„ ๋ฐฐ๋‹˜๋“ค๊ณผ˜ ๋งŒ๋‚จ' —„œ †Œ”„Šธบ ”„— žˆ๋Š” ™˜๊ตญ„ ๋ฐฐ๊ฐ€ –ˆ๋˜ ๋งด˜€๋‹ค.

”„๋กœ๊ทธ๋ž˜๋ฐด ๋ญ๋ผ๊ณ  ƒ๊ฐ•˜„š”? —ฌ๋Ÿฌ๊ฐ€ง€ ๋‹ตด ๋‚˜˜ฌˆ˜ žˆ๊ฒ ง€๋งŒ,  €๋Š” ˜„‹ค„ธ๊ณ„— žˆ๋Š” ๊ฒƒ๋“ค„ ๊ฐ€ƒ„ธ๊ณ„๋กœ ๋ชจ๋ธ๋ง•˜๋Š” ๊ฒƒด๋ผ๊ณ  ƒ๊ฐ–ˆ–ดš”.

ž.. ๋…ธ๊ฐ€๋‹ค๋ฅผ •˜๊ณ  žˆ๋Š” ๋‚˜˜  €๋ ค˜ค๋Š” †๋ชฉ„ ๋ชจ๋ธ๋ง•ด๋ณดž. -_-..

7. User Story

  • ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ€ œˆ๋„šฐ— ๊ธฐ๋ณธ œผ๋กœ ๋‚ดžฅ๋œ ”„๋กœ๊ทธ๋žจ„ ดšฉ•œ๋‹ค.
  • ๊ธฐ๋ณธ œผ๋กœ๋Š” Begineer Mode ๋งŒ„ ง€›•œ๋‹ค.
  • ปด“จ„ฐ๋Š” ˜„žฌ˜ ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ ƒ™ฉ„ •Œ•„„œ Œ๋‹จ•˜๊ณ , •ด๋‹น –‰๋™„ ๊ฒฐ ••œ๋‹ค.
  • ปด“จ„ฐ๊ฐ€ ‹คŒจ–ˆ„ ๊ฒฝšฐ ž๋™œผ๋กœ ๋‹ค‹œ ‹œž‘•˜—ฌ, ‚ฌšฉž๊ฐ€ ค‘ง€‹œ‚ค๊ฐ๋‚˜ ง€๋ขฐ๋ฅผ ๋‹ค ฐพ„๋•Œ๊นŒง€ ”„๋กœ๊ทธ๋žจ„ ๊ณ„† „–‰‹œ‚จ๋‹ค.

8. ๊ฐ„๋‹จ ž‘—… ค€๋น„

  1. Spy++
  2. Visual C++ (2๊ฐœ —ด–ด๋‘๊ณ  “ด๋‹ค. •˜๋‚˜๋Š” •ด๋‹น ๋ถ€๋ถ„๋ถ€๋ถ„ —ฐŠตšฉ ฝ”๋“œ ๋งŒ๋“ค ๊ณณ. •˜๋‚˜๋Š” ๋ฉ”ธ†ŒŠค ๋งŒ๋“ค ๊ณณ)
  3. ธ๋Šค นด๋“œ & •„๊ธฐ๊ตฌ - CRC ๋ฅผ “ฐ๊UserStory๋ฅผ “ฐ๊ด..~ ๋‹จ,
  4. ง€๋ขฐฐพ๊ธฐ
  5. CppUnit - ด๋ฒˆ ”Œ๋ฐ๋•Œ œˆ๋„šฐ ๋ฉ”„ง€ ๊ด€๋ จ ฒ˜๋ฆฌ— ๋Œ€•ด„œ๋Š” ฝ”๋“œ๋ฅผ ž‘„๋ชป–ˆ๋‹ค. (ด ๋ถ€๋ถ„— ๋Œ€•ด„œ๋Š”  „†ต ธ Manual Test๋ฐฉ๋ฒ•„ “ธ ˆ˜ ๋ฐ–—. GUI Testing ๊ด€๋ จ ๊ธ€„ ๋” ฝ–ด๋ด•ผ ๊ฒ ๋‹ค. •„ง ๋” ง€‹ด •„š”•˜๋‹ค.) ๋‹จ, ๋‚˜ค‘— ๋น„Šธ๋งต ๋ถ„„๋ถ€๋ถ„ & Refactoring ‹œ— TFP ๋ฅผ •  ˆ˜ žˆ๊ฒŒ ๋˜—ˆ๋‹ค.

9. Start. –ด๋””„œ ๋ถ€„žก•„๊ฐˆ๊นŒ.. ๋ฐด„ฐ ๋ชจœผ๊ธฐ

๊ธ€Œ”. ๋ฌด—‡๋ถ€„•ด ๋‚˜๊ฐ€•ผ •  ๊ฒƒธ๊ฐ€. ผ๋‹จ€ ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ„  œ–ด•  ˆ˜ žˆ๋Š” ”„๋กœ๊ทธ๋žจด—ฌ•ผ •˜๊ณ , ง€๋ขฐฐพ๊ธฐ •Œ๊ณ ๋ฆฌฆ˜๋„ •„𔕠…Œ๊ณ .. šฐ–ด.  •‹ —†๋‹ค. ผ๋‹จ€ ƒ๊ฐ๋‚˜๋Š” ๊ฒƒ๋“ค— ๋Œ€•ด •˜๋‚˜•˜๋‚˜ žก•„๋ด•ผ๊ฒ ๋‹ค.

ผ๋‹จ, †Œœ„ ๋ง•˜๋Š” '๊บผ๋ฆฌ' ๋“ค„ ฐพ๊ธฐ œ„•ด Spy++ „ ‹ค–‰‹œผฐ๋‹ค.



ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ˜ œˆ๋„šฐด๋ž˜Šค ด๋ฆ„ด 'ง€๋ขฐ ฐพ๊ธฐ' ˜€๋‹ค. œˆ๋„šฐ OS ˜ Šนง•ƒ •ด๋‹น œˆ๋„šฐ •ธ๋“ค๊ฐ„ ๋ฉ”„ง€˜ ๋ฐœƒ— ๋”ฐ๋ผ •ด๋‹น œˆ๋„šฐ”„๋กœ‹œ €—„œ ฒ˜๋ฆฌ๊ฐ€ ๋œ๋‹ค. •ด๋‹น œˆ๋„šฐ •ธ๋“ค€ œˆ๋„šฐ ด๋ž˜Šค ด๋ฆ„„ •„๋Š” ดƒ FindWindow •จˆ˜๋ฅผ ดšฉ•ด„œ ฐพœผ๋ฉด ๋  ๊ฒƒด๋‹ค.

๊ฐ๊ฐ ๋ฉ”๋‰ด๋“ค— ๋Œ€•ด ฒ˜๋ฆฌ๋ฅผ •˜๊ธฐ œ„•ด Message ๋ฅผ บกณ•ด๋ดค๋‹ค.



beginner — •ด๋‹น•˜๋Š” ๋ฉ”๋‰ดด๋ฆญ‹œ ๋ฐœƒ•˜๋Š” ๋ฉ”„ง€๋Š” WM_COMMAND ด๊ณ , ID๋Š” wParam œผ๋กœ 521ด ๋‚ ๋ผ๊ฐ„๋‹ค. ฆ‰, •ด๋‹น ๋ฉ”๋‰ด˜ ID๊ฐ€ 521 ธ ๊ฒƒด๋‹ค. (šฐ๋ฆฌ๋Š” ปจŠธ๋กค •„ด๋””๋ฅผ “ฐง€๋งŒ ด๋Š” resource.h —„œ •Œ ˆ˜ žˆ๋“ฏ  „๋ถ€ #define ๋งคฌ๋กœ  •˜ด๋‹ค.) ๊ฐ๊ฐ ฐพ•„๋ณธ ๊ฒฐ๊ณผ, 521,522,523 ด˜€๋‹ค.

ง€๋ขฐ ๋ฒ„Šผ„ —ด๊ณ  ๊นƒ๋ฐœฒดฌ๋ฅผ œ„•œ ๋งˆšฐŠค ด๋ฆญ‹œ—” WM_LBUTTONDOWN, WM_RBUTTONDOWN ด๊ณ , ๋‹จ ? ฒดฌ๊ด€๋ จ ˜ต…˜ด ๋ฌธ œด๋‹ˆ ด๋Š”   ˆ•˜๊ฒŒ ฒ˜๋ฆฌ•ดฃผ๋ฉด ๋  ๊ฒƒด๋‹ค. ๋งˆšฐŠคด๋ฆญ€ •ด๋‹น Client ๋ถ€๋ถ„ ขŒ‘œ๋ฅผ ž˜ žฌ–ด„œ ด๋ฅผ lParam — ๋„˜๊ฒจฃผ๋ฉด ๋  ๊ฒƒด๋‹ค.

†— ๋Œ€•œ ๋ชจ๋ธ๋งด—ฌ„œ ๊ทธ๋Ÿฐง€ †—๋งŒ ง‘ฐฉ•˜๊ฒŒ ๋˜—ˆ๊ตฐ. -_-; ด ผ„ œ„•ด„œ๋Š” †, ๋ˆˆ, ๋จธ๋ฆฌ๊ฐ€ žˆ–ด•ผ •˜๊ฒ ๋Š”๋ฐ. ๋งˆšฐŠค ๋…ธ๊ฐ€๋‹ค๋ฅผ œ„•œ †, •ด๋‹น ง€๋ขฐฐพ๊ธฐ ƒƒœ๋ฅผ ๋ด•ผ •  ๋ˆˆ, ๊ทธ๋ฆฌ๊ณ  •ด๋‹น ƒ™ฉ— ๋”ฐ๋ฅธ Œ๋‹จ, ง€‹œ๋ฅผ •ด•ผ •  ๋จธ๋ฆฌ˜ ๋ชจ๋ธ๋ง. (๋‹จ, —ฌ๊ธฐ— ๊ฐ๊ฐ— ๋Œ€•ด กฐ๊„ ๋ถ™ธ๋‹ค๋ฉด 'ง€๋ขฐฐพ๊ธฐ”„๋กœ๊ทธ๋žจ„ œ„•œ' ด๋ผ๋Š” ๋งด ๋ถ™๊ฒ ง€๋งŒ.)

ˆˆ— •ด๋‹น•˜๋Š” ๋ถ€๋ถ„€ –ด๋–ป๊ฒŒ • ๊นŒ.. •˜๋‚˜๋Š” ‹ ด ๋˜๋Š” ๋ฐฉ๋ฒ•ด žˆ๊ณ  •˜๋‚˜๋Š” ‚ฌ๋žŒด ๋˜๋Š” ๋ฐฉ๋ฒ•ด žˆ๋‹ค. -_-; ฆ‰, •˜๋‚˜๋Š” ง ‘ ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ˜ ๋ฉ”๋ชจ๋ฆฌ๋ถ€๋ถ„„ –ป–ด๋‚ธ ๋’ค, ๊ทธค‘— ๋ฐฐ—ด— •ด๋‹น๋˜๋Š” ๋ถ€๋ถ„ (–ด๋–ค ๋ฐด„ฐ๊ตฌกฐผง€๋Š” ๋ชจ๋ฅด๊ฒ ง€๋งŒ, ๋ฐฐ—ดผ ๊ฒƒ ๊ฐ™๋‹ค. -_-;)„ –ป–ด๋‚ด„œ ๋ณด๋˜ง€, •„๋‹ˆ๋ฉด ‚ฌ๋žŒฒ˜๋Ÿผ ™”๋ฉด„ ๋ด•ผ •  ๊ฒƒด๋‹ค. • „•˜๊ฒŒ๋„ ๋‚˜๋Š” ง€๋ขฐฐพ๊ธฐ˜ ฐฝกฐž๋„ •„๋‹ˆ๊ณ  œˆ๋„šฐ˜ ฐฝกฐž๋Š” ๋”๋”š •„๋‹ˆ๋ฏ€๋กœ. -_-; ›„ž๋ฅผ „ ƒ•˜๊ฒŒ ๋œ๋‹ค.

›๋ฆฌ๋Š” ๊ฐ„๋‹จ•˜๋‹ค. œˆ๋„šฐ •ธ๋“ค„ –ป„ ˆ˜ žˆ๋‹ค๋ฉด, •ด๋‹น œˆ๋„šฐ— ๋Œ€•œ DC๋ฅผ –ป„ ˆ˜ žˆ„ ๊ฒƒด๋‹ค. DC๋ฅผ –ป„ ˆ˜ žˆ๋‹ค๋ฉด, BitBlt „ ดšฉ, ๋น„Šธ๋งต„ ๋ฉ”๋ชจ๋ฆฌDC ชฝœผ๋กœ ๋ณต‚ฌ•  ˆ˜ žˆ„…Œ๋‹ˆ๊นŒ. (๊ฐ„๋‹จ•œ บกณ ”„๋กœ๊ทธ๋žจ‹œ ดšฉ•  ˆ˜ žˆ๋‹ค.) ๋‹จ, ™”๋ฉด„ ๋ณต‚ฌ•˜๋ ค๋Š” ”„๋กœ๊ทธ๋žจด ๋‹ค๋ฅธ ”„๋กœ๊ทธ๋žจ— ๊ฐ€๋ คง€๋ฉด •ˆ๋˜๊ฒ ๋‹ค.

๋จธ๋ฆฌ๋Š”? ง€๋ขฐฐพ๊ธฐ •Œ๊ณ ๋ฆฌฆ˜— •ด๋‹น๋˜๋Š” ๋ถ€๋ถ„€. œผ~ ๋‚˜ค‘—. -_-; ๋Œ€๊ฐ• ดฏค •ด„œ ๊ฐ ๋ถ€๋ถ„๋ถ€๋ถ„— ๋Œ€•ด ๋งž๋Š”ง€๋ฅผ •Œ•„๋ณด๊ธฐ œ„•œ ”„๋กœ๊ทธ๋žจ„ ๊ฐ„๋‹จ•˜๊ฒŒ งฐ๋‹ค.

  • 1ฐจผ๋ถ€๋ถ„ฝ”๋“œ - †๊ณผ ๋ˆˆ— •ด๋‹น•˜๋Š” ๋ถ€๋ถ„ ฝ”๋“œ๋ฅผ œ„•œ ๊ฐ„๋‹จ•œ ˜ˆ œฝ”๋“œ๋“ค ๋ชจŒ. ๊ทธ๋ฆฌ๊ณ  ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ„  œ–ด•˜๋Š” ๋ถ€๋ถ„๋“ค— ๋Œ€•ด Delegation ‹œ๋„. (CMinerControler ด๋ž˜Šค๋Š” ฒ˜Œ '๋ง‰ ง ' ฝ”๋“œ๋กœ๋ถ€„ง€๋ขฐฐพ๊ธฐ  œ–ด๋ถ€๋ถ„ •จˆ˜๋“ค„ ด๋ž˜Šค™”•œ๊ฒƒž„)

10. User Story & Engineering Task

—ฌ๊ธฐ„œ๋Š” Task Estmiate ๋ฅผ ƒ๋žต–ˆ๋‹ค. (๊ทธ๋ƒฅ ๋ง‰ ๋‚˜๊ฐ„ง€๋ผ. ^^;)
  • ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ€ œˆ๋„šฐ— ๊ธฐ๋ณธ œผ๋กœ ๋‚ดžฅ๋œ ”„๋กœ๊ทธ๋žจ„ ดšฉ•œ๋‹ค.
    • ˜„žฌ —ด๋ คžˆ๋Š” ”„๋กœ๊ทธ๋žจ ค‘—„œ ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ„ œˆ๋„šฐ ด๋ž˜Šค ด๋ฆ„œผ๋กœ ฐพ•„๋‚ธ๋‹ค.
    • ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ„ กฐž‘•œ๋‹ค. (Mode ๋ณ€™˜, žฌ‹œž‘, ง€๋ขฐฒดฌ, ๋นˆนธ —ด๊ธฐ ๋“)
      • ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ—๊ฒŒ •ด๋‹น –‰๋™ Message๋ฅผ ๋ณด๋‚ธ๋‹ค.
    • ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ˜ ™”๋ฉด„ Capture, ๋ถ„„•œ๋’ค ๋ฐด„™”•œ๋‹ค.

  • ๊ธฐ๋ณธ œผ๋กœ๋Š” Begineer Mode ๋งŒ„ ง€›•œ๋‹ค.
  • ปด“จ„ฐ๋Š” ˜„žฌ˜ ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ ƒ™ฉ„ •Œ•„„œ Œ๋‹จ•˜๊ณ , •ด๋‹น –‰๋™„ ๊ฒฐ ••œ๋‹ค.
    • ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ ๋น„Šธ๋งต ๋ฐด„ฐ๋ฅผ ๊ทผ๊ฐ๋กœ ˆ˜น˜๋ฐด„™”•œ๋‹ค.
      • ๊ฒŒž„ ‹œž‘ & ๊ฒŒž„ค‘ธ ƒƒœ ™•ธ
      • ๊ฒŒž„ ‹คŒจธ ƒƒœ ™•ธ
      • ๊ฒŒž„ ด๋ฆฌ–ดธ ƒƒœ ™•ธ
      • ๋นˆนธ, ๊นƒ๋ฐœฒดฌ, ˆž๋“ค ๋“ Cell๋“ค— ๋Œ€•œ ƒƒœ ™•ธ
    • ง€๋ขฐฐพ๊ธฐ Œ๋‹จ •Œ๊ณ ๋ฆฌฆ˜„ ๋งŒ๋“ ๋‹ค.
      • ๊นƒ๋ฐœ ฒดฌ๋ฅผ •ด•ผ •  ๋•Œ
      • ๋นˆนธ„ —ด–ด•ผ •  ๋•Œ
      • ๋นˆนธ ฐ๊ธฐ๋ฅผ •ด•ผ •  ๋•Œ

  • ปด“จ„ฐ๊ฐ€ ‹คŒจ–ˆ„ ๊ฒฝšฐ ž๋™œผ๋กœ ๋‹ค‹œ ‹œž‘•˜—ฌ, ‚ฌšฉž๊ฐ€ ค‘ง€‹œ‚ค๊ฐ๋‚˜ ง€๋ขฐ๋ฅผ ๋‹ค ฐพ„๋•Œ๊นŒง€ ”„๋กœ๊ทธ๋žจ„ ๊ณ„† „–‰‹œ‚จ๋‹ค.
    • ๊ฒŒž„ ‹คŒจธ ƒƒœ— ๋Œ€•œ ™•ธ•˜๊ธฐ.
    • ”„๋กœ๊ทธ๋žจ„ ๋‹ค‹œ ‹œž‘•˜๋„๋ก กฐž‘•˜๊ธฐ.

11. First

  • 1ฐจ œž‘†ŒŠค
    • œ ˜ : ด๋•Œ๋Š” Windows ME, Windows 2000 ดƒ—„œ๋งŒ ‹ค–‰๊ฐ€๋Šฅ•˜๋‹ค. (ง€๋ขฐฐพ๊ธฐ ๋น„Šธ๋งตด 98๊ณผ ๋‹ค๋ฅด๋‹ค)
    • ๊ธฐ๋ก : ˆ๊ธ‰ 8-9ˆ, ค‘๊ธ‰ 90-100ˆ, ๊ณ ๊ธ‰ชฝ€ ๋„ˆ๋ฌด ๋А๋ ค„œ …ŒŠคŠธ ฌ๊ธฐ. -_-;

ฒ˜Œ—๋Š”  „ฒด— ๋Œ€•œ ™˜๊ฒฝ„ •„ •˜๊ฒŒ ๋œ๋‹ค. ๊ธฐ๋ณธ ธ ด๋ž˜Šค๋Š” ๋‹คŒ๊ณผ ๊ฐ™๋‹ค.
CMinerBitmapAnalyzer ๋น„Šธ๋งต„ ๋ถ„„, ๋ฐด„™”•œ๋‹ค.
CMinerController ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ— ๋Œ€•œ ™”๋ฉด บกณ, ๋ชจ๋“œ๋ณ€™˜, ๋ฒ„Šผ ด๋ฆญ ๋“˜  œ–ด๋ฅผ •œ๋‹ค
CMineSweeper ‹คˆ ธ ๋‘๋‡Œ— •ด๋‹น๋˜๋Š” ๋ถ€๋ถ„. CMinerController ™€ CMinerBitampAnalyzer ๋ฅผ ๋ฉค๋ฒ„๋กœ ๊ฐ€ง€๋ฉฐ, ด๋ฅผ ดšฉ•˜—ฌ ๊ฒŒž„ƒ™ฉ๋ถ„„, ง€๋ขฐฐพ๊ธฐ๊ด€๋ จ Œ๋‹จ ๋“„ •œ๋‹ค

ผข…˜ • ๋‹ˆ๋ฉ”ด…˜„ •˜๋Š” บ๋ฆญ„™€ ๊ฐ™๋‹ค. ƒ€ด๋จธ๊ฐ€ Key Frame — ๋Œ€•œ ด๋ฒคŠธ๋ฅผ ฃผ๊ธฐ œผ๋กœ ๊–ดฃผ๊ณ , •ด๋‹น Key Frame —๋Š” ˜„žฌ ƒƒœ— ๋Œ€•œ Œ๋‹จ„ •œ๋’ค ๋™ž‘„ •œ๋‹ค. —ฌ๊ธฐ„œ๋Š” 1ˆ๋งˆ๋‹ค MineSweeper ˜ ๋™ž‘„ ˆ˜–‰•˜๊ฒŒ ๋œ๋‹ค.
~cpp 
void CMinerFinderDlg::OnButtonStart() 
{
	// TODO: Add your control notification handler code here
	m_mineSweeper.Start ();
	SetTimer (1000, 100, NULL);
}

void CMinerFinderDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	int nRet = Excute ();
	if (nRet == MINERMODE_CLEAR) 
		KillTimer (1000);
	
	CDialog::OnTimer(nIDEvent);
}

void CMinerFinderDlg::OnButtonStop() 
{
	// TODO: Add your control notification handler code here
	KillTimer (1000);
}

int CMinerFinderDlg::Excute ()
{
	return m_mineSweeper.Excute ();
}

MineSweeper ˜ Excute ˜ ๋ฐฉ๋ฒ•€ ผข…˜ œ •œ ƒƒœ ๋จธ‹ ˜ ˜•ƒœด๋‹ค. ๋‹จง€ Switch ~ Case ๋งŒ “ฐง€ •Š•˜„๋ฟดง€๋งŒ. ๊ทธ๋ฆฌ ฐ žฅ ด ๋ณดดง€๋Š” •Š€ ๊ด€๊ณ„๋กœ ผ๋‹จ€ ๊ทธ๋ƒฅ ด๋ ‡๊ฒŒ.


~cpp 
int CMineSweeper::Excute ()
{
	CBitmap* pBitmap = CaptureClient ();

	ConvertBitmapToGameMode (pBitmap);
	ConvertBitmapToData (pBitmap);

	if (m_nCurrentGameMode == MINERMODE_GAMEOVER) {
		Start ();
		return m_nCurrentGameMode;
	}

	// Todo : Matrix ๋ฅผ ๊ทผ๊ฐ๋กœ •˜—ฌ •  ผ˜ „ •.
	// •  ผ : 
	int nRet = 0;

	CMinerFinderDlg* pDlg = (CMinerFinderDlg*)m_pDlg;
	
	//		Flag ˜ ฒดฌ. šŸˆ˜„ธ๊ธฐ.
	nRet = CheckFlag ();
	if (nRet) {
		pDlg->PrintStatus ("Action : CheckFlag - %d rn", nRet);
		return m_nCurrentGameMode;
	}

	//		Open. šŸˆ˜„ธ๊ธฐ.
	nRet = OpenBlocks ();
	if (nRet) {
		pDlg->PrintStatus ("Action : OpenBlocks - %d rn", nRet);
		return m_nCurrentGameMode;
	}

	//		ฐ๊ธฐ. --;
	RandomOpen ();
	pDlg->PrintStatus ("Action : Random Open rn");

	return m_nCurrentGameMode;
}

11.1. Profiling

~cpp 
Profile: Function timing, sorted by time
Date:    Tue Feb 26 19:16:26 2002


Program Statistics
------------------
    Command line at 2002 Feb 26 19:00: "F:WorkingTempMinerFinderDebugMinerFinder" 
    Total time: 223521.679 millisecond
    Time outside of functions: 28.613 millisecond
    Call depth: 23
    Total functions: 660
    Total hits: 37532338
    Function coverage: 52.1%
    Overhead Calculated 5
    Overhead Average 5

Module Statistics for minerfinder.exe
-------------------------------------
    Time in module: 223493.066 millisecond
    Percent of time in module: 100.0%
    Functions in module: 660
    Hits in module: 37532338
    Module function coverage: 52.1%

        Func          Func+Child           Hit
        Time   %         Time      %      Count  Function
---------------------------------------------------------
   86270.513  38.6    86270.513  38.6 18252086 CDC::GetPixel(int,int) (mfc42d.dll)
   53966.631  24.1   223296.921  99.9      855 CWinThread::PumpMessage(void) (mfc42d.dll)
   28819.313  12.9   150892.058  67.5    93243 CMinerBitmapAnalyzer::CompareBitmapBlock(class CDC *,class CDC *,int,int,int,int,class CDC *,int,int) (minerbitmapanalyzer.obj)
   18225.064   8.2    61776.601  27.6  9126043 CMinerBitmapAnalyzer::CompareBitmapPixel(class CDC *,class CDC *,int,int,unsigned long) (minerbitmapanalyzer.obj)
   17577.168   7.9    17577.168   7.9  9126043 CDC::SetPixel(int,int,unsigned long) (mfc42d.dll)
    5146.101   2.3    53721.330  24.0      104 CMineSweeper::CheckFlag(void) (minesweeper.obj)
    4748.690   2.1     4974.806   2.2       74 CMineSweeper::OpenBlocks(void) (minesweeper.obj)
    2496.582   1.1     2506.333   1.1       27 CMineSweeper::RandomOpen(void) (minesweeper.obj)
    1504.775   0.7     1504.775   0.7    85245 CDC::DeleteDC(void) (mfc42d.dll)
     944.596   0.4      944.596   0.4    85245 CDC::CreateCompatibleDC(class CDC *) (mfc42d.dll)
     492.930   0.2   111257.841  49.8    32492 CMinerBitmapAnalyzer::ConvertBitmapToBlock(int,int) (minerbitmapanalyzer.obj)
     383.392   0.2      383.392   0.2    85245 CDC::SelectObject(class CBitmap *) (mfc42d.dll)
     348.243   0.2      348.243   0.2    42702 CWnd::ReleaseDC(class CDC *) (mfc42d.dll)
     326.552   0.1      326.552   0.1      221 CWnd::SetWindowTextA(char const *) (mfc42d.dll)
     294.378   0.1      295.578   0.1     2619 CWnd::DefWindowProcA(unsigned int,unsigned int,long) (mfc42d.dll)
     251.949   0.1      251.949   0.1    42702 CWnd::GetDC(void) (mfc42d.dll)
     201.741   0.1      225.112   0.1      221 CEdit::LineScroll(int,int) (mfc42d.dll)
     184.900   0.1      184.900   0.1   208404 CMineSweeper::GetData(int,int) (minesweeper.obj)
     155.178   0.1    42649.225  19.1     9944 CMinerBitmapAnalyzer::ConvertBitmapToNumber(int,int) (minerbitmapanalyzer.obj)
     134.201   0.1   154139.803  69.0      157 CMineSweeper::ConvertBitmapToData(class CBitmap *) (minesweeper.obj)

œ„˜ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด, ๊ฐ€žฅ ๋งŽด ˜ธถœ๋˜–ด ‹œ๊ฐ„„  œ •˜๋Š” ๊ฒƒ€ GetPixel™€ PumpMessageด๋‹ค. mfc˜ •จˆ˜™€ œˆ๋„šฐ ๋ฉ”„ง€๋“œ๋ฆฌ๋ธ ๋ฐฉ‹— ๋Œ€•ด„œ๋Š” ˆ˜ ••  ˆ˜ —†๋‹ค •˜๋”๋ผ๋„, •ด๋‹น •จˆ˜— ๋Œ€•ด„œ ˜ธถœ šŸˆ˜๋ฅผ „ด๋Š” ๋ฐฉ๋ฒ•€ ๊ฐ•๊ตฌ•ด•ผ •  ๊ฒƒด๋‹ค.

GetPixel € –ด๋””„œ ˜ธถœ๋ ๊นŒ? Edit->Find in Files ๋ฅผ •˜๋ฉด •ด๋‹น ”„๋กœ Šธ๋‚ด—„œ GetPixelด “ฐธ ๋ถ€๋ถ„๋“ค— ๋Œ€•ด •Œ ˆ˜ žˆ๋‹ค.
~cpp 
Searching for 'GetPixel'...
F:WorkingTempMinerFinderMinerBitmapAnalyzer.cpp(65):	if (bmpdc->GetPixel (bmpStartX,bmpStartY) != rgbColor)
F:WorkingTempMinerFinderMinerBitmapAnalyzer.cpp(135):			rgb = screendc->GetPixel (nX+nBi,nY+nBj);
2 occurrence(s) have been found.

GetPixel€ ๋‹คŒ๊ณผ ๊ฐ™€ ™”๋ฉด บกณ๋กœ –ป€ ๋น„Šธ๋งต— ๋Œ€•ด ๋น„๊ต•˜—ฌ ๊ฐ™€ ๋ฐด„ž„„ Œ๋…•˜๋Š” ๋ถ€๋ถ„— “ฐ˜€๋‹ค.
~cpp 
BOOL CMinerBitmapAnalyzer::CompareBitmapPixel (CDC* pDC, CDC* bmpdc, int bmpStartX, int bmpStartY, COLORREF rgbColor) 
{
	if (bmpdc->GetPixel (bmpStartX,bmpStartY) != rgbColor)
		return FALSE;
	else
		return TRUE;
}

BOOL CMinerBitmapAnalyzer::CompareBitmapBlock (CDC* pDC, CDC* screendc, int nX, int nY, int nWidth, int nHeight, CDC* bmpdc, int nSrcX, int nSrcY)
{
	int nBi, nBj;
	COLORREF rgb;

	for (nBi=0;nBi<nWidth;nBi++) {
		for (nBj=0;nBj<nHeight;nBj++) {
			rgb = screendc->GetPixel (nX+nBi,nY+nBj);
			pDC->SetPixel (nX+nBi,nY+nBj,rgb);
			
			if (!CompareBitmapPixel (pDC, bmpdc, nSrcX + nBi, nSrcY + nBj, rgb)) return FALSE;
		}
	}

	return TRUE;
}
ฆ‰,  € •จˆ˜๋“ค„ ตœ ™” ‹œ‚ค๋˜ง€, •„๋‹ˆ๋ฉด  € •จˆ˜๋“คด ˜ธถœ๋˜๋Š” šŸˆ˜๋ฅผ „—ฌ•ผ •˜๋Š” ๊ฒƒด๋‹ค.

12. Second - ตœ ™”˜ ‹œ๋„

  • 2ฐจ œž‘†ŒŠค
    • œ ˜ : —ฌ „žˆ Windows ME, Windows 2000 ดƒ—„œ๋งŒ ‹ค–‰๊ฐ€๋Šฅ•˜๋‹ค. (ง€๋ขฐฐพ๊ธฐ ๋น„Šธ๋งตด 98๊ณผ ๋‹ค๋ฅด๋‹ค)
    • ๊ธฐ๋ก : ˆ๊ธ‰ 2-3ˆ, ค‘๊ธ‰ 21~40ˆ, ๊ณ ๊ธ‰ชฝ€ ๋„ˆ๋ฌด ๋А๋ ค„œ …ŒŠคŠธ ฌ๊ธฐ. -_-;
    • ๋ฐ˜„ : ฐจ๋ผ๋ฆฌ ˆœˆ˜ TFP ๋กœ •ด ๋‚˜๊ฐˆธ ๊ทธ๋žฌ๋‹ค๋Š” ƒ๊ฐด ๋“ ๋‹ค. …ŒŠคŠธ ฝ”๋“œ— ๋Œ€•œ •„ด๋””–ด๋ฅผ  œ๋Œ€๋กœ ๋ชป๋‚ด—ˆ๋‹ค. (•„.. ƒ€„—  –œผ๋ฉด •ˆ๋˜๊ด๋งŒ. --; TFPค‘ ๋ง‰ž๋•Œ ˜ˆ „๋ฐฉ‹œผ๋กœ ”Œ๋ฐ•˜๋ ค๊ณ  •˜๋Š”๊ฒŒ ๋ฌธ œด๋‹ค. -_-;)

12.1. ตœ ™” ๋ฐฉ•ˆ˜ ๊ถ๋ฆฌ

๋ชฉ‘œ๋Š” Func time ด ๋งŽด ๊ธ๋ฆฌ๋Š” •จˆ˜๋“ค— ๋Œ€•ด„œ ๊ทธ šŸˆ˜๋ฅผ „ด๋Š” ๋ฐฉ๋ฒ•.
  • ๋น„Šธ๋งต˜ ข…๋ฅ˜๊ฐ€ •œ • ด๋ผ๋Š”  —„œ ฐฉ•ˆ, Block  „ฒด— ๋Œ€•œ ๋น„๊ต๋Œ€‹  •œ„— ๋Œ€•œ ๋น„๊ต๋กœ ๋ฐ”๊ฟจ๋‹ค. (๋ธ”๋Ÿญ๋งˆ๋‹ค ˆž๋“ค˜ ƒ‰ด ๋‹ค๋ฅด๋ฏ€๋กœ, ด๋ฅผ ดšฉ•˜๋ฉด †๋„ –ฅƒ„ ด๋Œ–ด ๋‚ผ ˆ˜ žˆ๊ฒ ๋‹ค.)

~cpp 
BOOL CMinerBitmapAnalyzer::CompareBitmapCenterLine (CDC* screendc, int nX, int nY, int nWidth, int nHeight, CDC* bmpdc, int nSrcX, int nSrcY)
{
	int nBi, nBj;
	COLORREF rgb;
	nBj = int(nHeight / 2);

	// for optimizing...
	for (nBi=int(nWidth / 4);nBi<nWidth-int(nWidth / 4);nBi++) {
		rgb = screendc->GetPixel (nX+nBi,nY+nBj);
	
		if (!CompareBitmapPixel (bmpdc, nSrcX + nBi, nSrcY + nBj, rgb)) return FALSE;
	}

	return TRUE;
}
  • Flag ฒดฌ๋ถ€๋ถ„ šจœจ™” - ๊ธฐกด˜ ๋ฐฉ‹€ Flag „ •˜๋‚˜”ฉ ฒดฌ•˜๊ณ  ๋‚œ ๋’ค, ๋‹ค‹œ  „ฒด ๋น„Šธ๋งต„ ฝ–ด˜ค๋Š” ๋ฐฉ‹ด˜€๋‹ค. ด— ๋Œ€•ด Flag ๋ฅผ ฒดฌ•  ˆ˜ žˆ๋Š” ๋ถ€๋ถ„— ๋Œ€•ด •œ๊บผ๋ฒˆ— ฒดฌ•˜๋„๋ก •Œ๊ณ ๋ฆฌฆ˜„ ˆ˜ •–ˆ๋‹ค. ด๋Š”  „ฒด ๋น„Šธ๋งต„ ฝ–ด˜ค๋Š” šŸˆ˜๋ฅผ „—ฌฃผ๋ฏ€๋กœ, šจœจ„ด ๋†’•„„๋‹ค.

~cpp 
int CMineSweeper::CheckFlag ()
{
	int nCount = 0;
	int nCheckCount = 0;

	CMinerFinderDlg* pDlg = (CMinerFinderDlg*)m_pDlg;

	for (int i=0;i<m_nArrMaxY;i++) {
		for (int j=0;j<m_nArrMaxX;j++) {
			if (IsNumber (GetData (j,i))) {
				// ˆžธ ๊ฒฝšฐ. 
				nCount = GetAroundClosedCount (j,i) + GetAroundFlagCount (j,i);

				if (nCount == GetData(j,i) && GetAroundClosedCount (j,i)) {
					SetFlagsAround (j,i);
					
					// CBitmap* pBitmap = CaptureClient ();
					// ConvertBitmapToData (pBitmap);

					nCheckCount ++;
				}
			}
		}
	}

	return nCheckCount;
}

13. Third - ตœ ™” ‹œ๋„ 2

  • 3ฐจ œž‘†ŒŠค
  • ง€—ญ šฐ„  ๊ฒ€ƒ‰๋ฒ• - ด๋ฒคŠธ๋ฅผ ๋นจ๋ฆฌ ๋ฐœƒ•˜๊ธฐ œ„•œ ๋ฐฉ๋ฒ•. ด „— ง€๋ขฐฒดฌ๋ฅผ •˜๊ฐ๋‚˜ ๋นˆนธ„ —ฐ ๊ณณ„ ๊ธฐค€œผ๋กœ ๊ฒ€ƒ‰๋ฒ”œ„๋ฅผ    ๋„“˜€๊ฐ€๋Š” ๋ฐฉ๋ฒ•
  • ๋ฌธ œ ˜ ๋ฐœƒ - windows 98 ด•˜๋ฒ„ „˜ ง€๋ขฐฐพ๊ธฐ ๋น„Šธ๋งต๋ถ€๋ถ„
  • 4ฐจ œž‘†ŒŠค
  • windows 98 ด•˜ ๋ฒ„ „ ง€๋ขฐฐพ๊ธฐ ง€›. (™„๋ฒฝ•˜„ •ŠŒ)

14. Fourth - ตœ ™” ‹œ๋„ 3

  • 5ฐจ œž‘†ŒŠค
  • ˆ๋ฐ˜ ๋ฌดฐจ๋ณ„ ฐ๊ธฐ ๊ธฐ๋Šฅ ถ”๊ฐ€•˜๊ธฐ
  • Status ‘œ‹œฐฝ ฃผ๊ธฐ œผ๋กœ ง€›Œฃผ๊ธฐ - „–‰ƒ™ฉด ๊ธธ–ดง€๋ฉด ๊ธธ–ดˆˆ˜๋ก ๋ถ€•˜๊ฐ€ ๋งŽด ๊ธ๋ฆฐ๋‹ค.
  • Open Block — ๋Œ€•ด„œ •œ๊บผ๋ฒˆ— ผ๊ด„ฒ˜๋ฆฌ - ˜™ธ๋กœ šจ๊ณผ๊ฐ€ ๋†’€ ๋ฐฉ๋ฒ• (๊ถ๊ทน œผ๋กœ๋Š” Excute ˆ˜–‰ šŸˆ˜๋ฅผ „—ฌฃผ๋ฏ€๋กœ)
  • ถ”›„ •Œ๊ณ ๋ฆฌฆ˜ ตœ ™”— ๋Œ€•œ ๊ถ๋ฆฌ
    • ง€—ญ šฐ„  ๋น„Šธ๋งต ๋ถ„„ & ๋ฐด„™” - ๋ฌดกฐ๊ „ฒด ๋น„Šธ๋งต„ ๋ฐด„™” •˜๋Š”๋Œ€‹ , ƒƒ‰•˜๋ ค๋Š” ๊ธฐ „ žก๊ณ  ๊ทธ ๊ธฐ „ ค‘‹ฌœผ๋กœ ๋ฐด„™”•˜๋ ค๋Š” ๋ฒ”œ„๋ฅผ ๋„“˜€๊ฐ€๋Š” ๋ฐฉ๋ฒ•
    • Random Open — ๋Œ€•œ ™•๋ฅ  ๋†’ด๊ธฐ ๋ฐฉ๋ฒ• ๊ถ๋ฆฌ
      • •ด๋‹น ๋นˆนธ๋“ค— ๋Œ€•ด„œ ฃผœ„˜ ˆž๋“ค˜ •ฉด ๊ฐ€žฅ ๋‚ฎ€ ๋นˆนธ„ —ฌ๋Š” ๊ฒƒ.
    • Smart Random Open - ˜„žฌ —ด ˆ˜ žˆ๋Š” Cell ˆ˜๋ฅผ ๊ธฐค€œผ๋กœ Random Open šŸˆ˜๋ฅผ กฐ ˆ•˜๋Š” ๋ฐฉ‹

15. Fifth - ตœ ™” ‹œ๋„ 4

  • 6ฐจ œž‘†ŒŠค
  • Random Open — ๋Œ€•œ ™•๋ฅ  ๋†’ด๊ธฐ ‹œ๋„ - •ด๋‹น ๋นˆนธ๋“ค— ๋Œ€•ด„œ ฃผœ„˜ ˆž๋“ค˜ •ฉด ๊ฐ€žฅ ๋‚ฎ€ ๋นˆนธ„ 50%˜ ™•๋ฅ ๋กœ —ด๊ธฐ ‹œ๋„. ๋น„๊ต  ๋นˆนธ„ —ฌ๋Š” ™•๋ฅ ด ๋†’•„ง€๊ธด –ˆ๋‹ค. (๋‹จ, ˜๋ฏธ—†๋Š” ๊ณณด —ด๋ฆฌ๋Š” ๊ฒฝšฐ๊ฐ€ ๋งŽ๋‹ค๋Š” —„œ ๊ฐœ„ ˜ —ฌง€•„š”)
  • Smart Random Open - ˜„žฌ —ด ˆ˜ žˆ๋Š” Cell ˆ˜๋ฅผ ๊ธฐค€œผ๋กœ Random Open šŸˆ˜๋ฅผ กฐ ˆ•จ.  „ฒด Cell ˆ˜˜ 1/8 ๋น„œจ.
  • 98˜ธ™˜๋ฒ„๊ทธˆ˜ •†ŒŠค

16. Thread

•ˆ๋…••˜„š”, ๊ฐ•„ฒœ๋‹˜. —ฌ๊ธฐ ด๋ ‡๊ฒŒ ๊ธ€ “ฐ๋Š”๊ฒŒ ๋งž๋Š”ง€ ๋ชจ๋ฅด๊ฒ ๋„š”.
๊ฒ€ƒ‰„ •˜๋‹ค๊ฐ€ šฐ—ฐžˆ MineFinder Ž˜ดง€๋ฅผ ๋ฐœ๊ฒฌ–ˆŠต๋‹ˆ๋‹ค. ƒ๋‹นžˆ žฌ๋ฏธžˆ๋”๊ตฐš”, †ŒŠค๋ฅผ ๋ฌดฒ™ ๊น”๋”•˜๊ฒŒ ด•ด•˜๊ธฐ ‰ฝ๋„๋ก ๋งŒ๋“œ…”„œ ๋ฌดฒ™ ธƒ๊นŠ๊ฒŒ ๋ดคŠต๋‹ˆ๋‹ค. ๋‹ค๋ฆ„ด •„๋‹ˆ˜ค๋ผ ˆ๋ฌธด žˆ–ด„œ ด๋ ‡๊ฒŒ ๊ธ€„ ๋‚จ๊น๋‹ˆ๋‹ค. ง€๋ขฐฐพ๊ธฐ •Œ๊ณ ๋ฆฌฆ˜—„œ ๊ฐ ๋ธ”๋Ÿญ˜ ƒƒœ๋ฅผ ๋น„Šธ๋งตœผ๋กœ ๋น„๊ต๋ฅผ •˜๊ณ  žˆ๋Š”๋ฐ ง€๋ขฐฐพ๊ธฐ œˆ๋„šฐ˜ ๋น„Šธ๋งต ๋ฐดƒ€๋ฅผ –ด๋–ป๊ฒŒ ถ”ถœ•˜…จ๋Š”ง€ ๊ถ๊ธˆ•ฉ๋‹ˆ๋‹ค.  œ๊ฐ€ œˆ๋„šฐ ˆ๋ณด๋ผ„œ ๊ทธ๋Ÿฐง€ ๋ชฐ๋ผ๋„ ๋ฌดฒ™ ๊ถ๊ธˆ•˜๋„š”. ๊ทธ ๋ฐฉ๋ฒ•„ ๋‹ค๋ฅธ ‘šฉ –ด”Œ๋ฆฌผ€ด…˜—„œ –ผ๋งˆ๋“  ‘šฉ•  ˆ˜ žˆ„ ๊ฒƒ ๊ฐ™•„„œš”. ๋‹ต๋ณ€ ๋ถ€ƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. --๋™šฐ

๊ด€‹ฌžˆ๊ฒŒ ๋ด ฃผ…”„œ ๊ฐ‚ฌ•ฉ๋‹ˆ๋‹ค. ^^  œ๊ฐ€ •œ ๋น„Šธ๋งต ๋ฐด„ถ”ถœ ๋ฐฉ๋ฒ•€ ผ๋ฐ˜ ธ œˆ๋„šฐ บกฒ˜ ”„๋กœ๊ทธ๋žจ˜ ›๋ฆฌ™€ ๋น„Šท•ฉ๋‹ˆ๋‹ค. FindWindow ๋ฅผ ดšฉ, ง€๋ขฐฐพ๊ธฐ ”„๋กœ๊ทธ๋žจ˜ œˆ๋„šฐ •ธ๋“ค„ –ป€๋’ค, ด๋ฅผ ๊ฐ€ง€๊ณ  •ด๋‹น œˆ๋„šฐ˜ ๋น„Šธ๋งต„ –ป–ด๋‚ด๋Š” ๊ฒƒดง€š”. ๊ธฐƒ€  œž‘ ๊ณผ •๊ณผ •„ด๋””–ด๋Š” MineFinder Ž˜ดง€— „œˆ •ด๋†“•˜Šต๋‹ˆ๋‹ค. --1002

๋‹ต๋ณ€ ๊ฐ‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.  œ๊ฐ€ ˆ๋ฌธ๋“œ๋ฆฌ๊ณ ž –ˆ๋˜ ฌธŠธ๋Š” GetClientRect API๋ฅผ †ต•ด œˆ๋„šฐ˜ ด๋ผด–ธŠธ ˜—ญ„ ๊ฐ€ ธ™€„œ ‹ค œ ๋น„๊ต•˜๋Š” IDB_BITMAP_MINES ๋น„Šธƒญ ๋ฆฌ†ŒŠค๋ฅผ ๋ง”€๋“œ๋ฆฐ ๊ฒƒด˜€Šต๋‹ˆ๋‹ค. IDB_BITMAP_MINES ๋น„Šธ๋งต ๋ฆฌ†ŒŠค๋„ GetClientRect ๋ฅผ †ต•ด ถ”ถœ•˜‹ ๊ด๊ฐ€š”? ๋งŒ•ฝ ๊ทธ API๋กœ ถ”ถœ•˜…จ๋‹ค๊ณ  •ด๋„ ด๋ผด–ธŠธ ˜—ญ  „ฒด๊ฐ€ บกณ๊ฐ€ ๋˜—ˆ„ …๋ฐ ˆž™€ ๋ฒ„Šผ๋“„ ”ฝ…€ ๋‹จœ„๋กœ –ด๋–ป๊ฒŒ ถ”ถœ•ด„œ IDB_BITMAP_MINES ๋ฆฌ†ŒŠค๋กœ ๋งŒ๋“œ…จ๋Š”ง€ ๊ถ๊ธˆ•ฉ๋‹ˆ๋‹ค. MineFinder Ž˜ดง€—๋Š” IDB_BITMAP_MINES ๋ฆฌ†ŒŠค๋ฅผ ๋งŒ๋“œ๋Š” ด•ผ๊ธฐ๋Š” —†–ด„œš”. --๋™šฐ

๋ฆฌ†ŒŠค ™”ผ€ ๊ทธ๋ƒฅ ™”๋ฉดบกณ•œ ๋’ค ฌ† ƒต—„œ ž˜๋žŠต๋‹ˆ๋‹ค. ;) (ข€ ๋…ธ๊ฐ€๋‹ค ‹•˜ง€๋งŒ ๊ฐ€žฅ ๊ฐ„๋‹จ•œ •ด๊ฒฐ…ด •„๋‹๊นŒ •˜๋Š” ƒ๊ฐ. 2๋…„ „ ผด—ฌ„œ  •™•žˆ ๊ธฐ–ต •ˆ๋‚˜ง€๋งŒ 95šฉ ง€๋ขฐฐพ๊ธฐ™€ 2000šฉ ง€๋ขฐฐพ๊ธฐ 2๋ฒˆ ž‘—…–ˆ—ˆ„๊ฒ๋‹ˆ๋‹ค. •ฝ๊ฐ„ ๊ทธ๋ฆผด ๋‹ค๋ฅด๊ณ  ด๋ฏธง€ขŒ‘œ๋„ กฐ๊ธˆ€ ๋‹ฌ๋ผ„œ. ^^)--1002

๊ฐ•„ฒœ๋‹˜. MineFinder๋ฅผ win32 API๋กœ ปจ๋ฒ„ „ •ด„œ  œ ™ˆŽ˜ดง€— ฝ”๋“œ ๋ถ„„ ๊ฐ•ขŒ Ž˜ดง€๋ฅผ ๋งŒ๋“ค๊นŒ •ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  › €ž™€ ›ž‘ Ž˜ดง€˜ ๋งฌ๋ฅผ ๋ถ„๋ช…žˆ ‘œ‹œ•  ๊ฒƒž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ win32 API ๋ฒ„ „œผ๋กœ ˆ˜ ••ด„œ  œ ™ˆŽ˜ดง€— ๊ฒŒ‹œ๋ฅผ •  ˆ˜ žˆ„ง€š”. „ฒœ๋‹˜˜ —ˆ๊ฐ€๋ฅผ ๋ถ€ƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. --๋™šฐ

ถœฒ˜(๋งฌ)๋งŒ ‘œ๊ธฐ•˜‹œ๋ฉด žœ ๋กญ๊ฒŒ ดšฉ•˜…”๋„ ๋ฉ๋‹ˆ๋‹ค. ™ˆŽ˜ดง€ ๋งฌฃผ„š”. ^^ (˜น‹œ  „— ง€๋ขฐฐพ๊ธฐ –ด…ˆ๋ ˆ๋ฒจ—„œ ๋ถ„„•˜—ฌ MineFinder ๋งŒ๋“œ‹  ๋ถ„ด‹ ๊ฐ€š”?  €๋Š” ธ๊ฐ„๊นŒง€๋งŒ ๋ชจ๋ธ๋ง –ˆง€๋งŒ, ‹ „ ๋ชจ๋ธ๋ง•œ. ^^;) --1002

 €˜ ™ˆŽ˜ดง€๋Š” http://ssrnet.snu.ac.kr/~leedw ž…๋‹ˆ๋‹ค. MineFInder๋Š” ž˜ ๋ชจ๋ฅด๊ฒ ๊ตฌš”, ง€๋ขฐฐพ๊ธฐ๋ฅผ ๋””Šค–ด…ˆ๋ธ”๋ง•ด„œ ”„๋กœ„Šค ๋ฉ”๋ชจ๋ฆฌ ๋งต •ˆ˜ 0x1005700 ๋ฒˆง€๊ฐ€ ง€๋ขฐฐพ๊ธฐ˜  „ฒด ƒƒœ ๋งต ๋ฐฐ—ดด๋ž€๊•Œ๊ณ  žˆŠต๋‹ˆ๋‹ค. ด๊ณณ ๋งต ƒƒœ ๋ฐฐ—ด—„œ 7๋ฒˆงธ ๋น„Šธ๊ฐ€ 1๋กœ …‹Œ…๋˜–ด žˆœผ๋ฉด ๊ทธ๊ฒƒ— •ด๋‹น๋˜๋Š” x, yขŒ‘œ๊ฐ€ ง€๋ขฐ๊ฐ€ žˆ๋Š” ๊ณณดง€š”. ๊ทธ๋ž˜„œ ง€๋ขฐฐพ๊ธฐ ๋งต•ต„ ๋งŒ๋“ค—ˆ๋”๋žฌŠต๋‹ˆ๋‹ค.  €๋Š” '•ด๋ถ€•™ž'๋ฅผ ๋ชจ๋ธ๋ง –ˆ๋‹ค๊ณ •˜๋ฉด ๋˜๊ฒ ๋„š”. –ดจŒ๋“  —ˆ๋ฝ•ด ฃผ…”„œ ๊ฐ‚ฌ•ฉ๋‹ˆ๋‹ค. :) --๋™šฐ

กฐ๋™˜ด๊ฐ€ ค‘๊ธ‰œผ๋กœ 19ˆ๋„ •ด๋ƒˆŠต๋‹ˆ๋‹ค;; –ด๋””„œ 05•™๋ฒˆค‘— ๊น€†Œ˜„ด๋ผ๋Š” นœ๊ตฌ๊ฐ€ †œผ๋กœ ˆ๊ธ‰ 10ˆ •ˆŒด ๋‚˜˜จ๋‹ค๊ณ  ๋“ค—ˆŠต๋‹ˆ๋‹ค. - †•„๋ณด๋‹ค
ˆ๊ธ‰€ ๋‚˜๋„ 9ˆ๊นŒ„ •ด๋ดคŒ. ๊ทธ๋ž˜๋„ ๋‚ด๊ฐ€ ๋ณธ ตœ๊ณ ๋Š” 97˜ ฌ„ˆ„๋‹˜.; (๊ณ ๊ธ‰ 50-60ˆ๋Œ€) --1002

----
”„๋กœ Šธ๋ถ„๋ฅ˜
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:23:45
Processing time 0.1058 sec