[따라하기] 인공지능 오목게임 [6] 흑백 바둑알 놓고 위치저장

 

 

안녕하세요 델파이 프로그래머님들!

 

이번  흑백 바둑알 놓기 6번째 세션에서는 다음 과정을 프로그램 하겠습니다.

 

1. 흑백 바둑알을 순차적으로 놓기

2. 흑백 바둑알이 놓여진 좌표를 기억하기 위한 Record 설정하고 저장하기

3. 이미 바둑알이 놓여진 자리에 다시 놓지 못하게 방지하기

4. 그리고 다음 세션을 위한 생각

 

 

1 흑백 바둑알을 순차적으로 놓기

 

1) 먼저  WhiteMoved 란 전역 변수를 boolean 으로 선언해서 백색 바둑알이 놓여졌으면 흑색을 다음에 놓게 합니다.

 

type

  TMainForm = class(TForm)

public

  WhiteMoved : boolean;

, , , ,

2) 그리고 이 변수를 ResetBoard 프로시져에서 초기화 해줍니다.

 

procedure TMainForm.ResetBoard;

begin

  WhiteMoved := True;

, , ,  

 

 

3) 세션5에서 프로그램한 MouseUp 이벤트에 다음 변경을 해서 흑백돌을 순차적 놓을수 있게 WhiteMoved  변수를 사용합니다.

 

procedure TMainForm.TTTBoardMouseUp( , , , X, Y: Integer);

, , , ,

if (((Column > 0) and (Row > 0)) and (( Column < 20) and (Row < 20))) then

begin

if ( WhiteMoved) then

begin

  TTTBoard.Canvas.Draw((Column * 18) - 8, (Row * 18) - 8, img_white.Picture.Graphic);

  WhiteMoved := false;

end

else if (Not WhiteMoved) then

begin

  TTTBoard.Canvas.Draw((Column * 18) - 8, (Row * 18) - 8, img_black.Picture.Graphic);

  WhiteMoved := true;

end;

end;

 

그럼 다음처럼 백 / 흑 이 순차적으로 놓여지게 됩니다.  물론 나중에는 옵션을 메뉴를 사용해서

순서를 흑 / 백으로도 할수있습니다.

 

 

blackWhite.png

 

 

2. 흑백 바둑알이 놓여진 좌표를 기억하기 위한 Record 타입을 설정하고 저장하기

 

오목의 승자를 확인하기 위해선 각각의 흑백 좌표를 알고 있어야 합니다.  그래서 놓여진 좌표를 Record 타입과 Array 배열을 사용해서 저장하고자 합니다.  

 

1) 그래서 우선 다음의 TStoneColor 레코드에 흑인지 백인지 저장할수 있게 선언합니다.

    WhiteOrBlack  저당되는 데이터 값은 3가지 'W', 'B', ' '  입니다.

type

  TStoneColor = record

   WhiteOrBlack : Char;

end;

 

2) 위에서 선언한 TStoneColorStonePiece에 좌표값으로 설정하기 위해 2차원 array 형태로 선언해줍니다.

type

  TMainForm = class(TForm)

public  

   , , ,

  StonePiece : array[0..19, 0..19] of TStoneColor;

 

         즉 [X, Y] 좌표 [ 1, 1]  ,  , [1, 19] ,   , ,  [19, 1], [19, 19] 의 위치의 값이 저장됩니다.

 

3) 이번에는 StonePiece에 값을 MouseUp 이벤트 내에서 저장해 보도록 하겠습니다.

    StonePiece[Column, Row].WhiteOrBlack := ‘W’  의 형태로 데이터를 저장했죠!

 

procedure TMainForm.TTTBoardMouseUp( , , , X, Y: Integer);

  , , , ,

if (((Column > 0) and (Row > 0)) and (( Column < 20) and (Row < 20))) then

begin

     if ( WhiteMoved) then

begin

, , ,

StonePiece[Column, Row].WhiteOrBlack := ‘W’;

WhiteMoved := false;

end

      else if (Not WhiteMoved) then

begin

, , ,

StonePiece[Column, Row].WhiteOrBlack := ‘B’;

WhiteMoved := true;

end;

end;

 

4) 그럼 StonePiece[Column, Row] 에 어떻게 데이터가 저장되었는지 궁금하시죠?

그래서 화면 아래에 임시로 ‘Test’ 버튼을 두어  Onclick 이벤트에서 테스트 해봅니다.

 

procedure TMainForm.testbtnClick(Sender: TObject);

var I, J: integer;

s : string;  

begin

    s := '';

    for J := 1 to 19 do

for I := 1 to 19 do

begin  

     if StonePiece[I, J].WhiteOrBlack <> ' ' then

begin

   // 흑백돌의 저장된 좌표값의 초기화

   s := s + '['+ inttoStr(I) + ','+ inttoStr(J) +','+ StonePiece[I, J].WhiteOrBlack + ' ], ';

end;

end;

    MessageDlg(S, mtInformation, [mbOk], 0);

end;

 

아래의 그림처럼 저장된 레코드값 결과를 보실수 있죠!

 

testXY.png

 

 

3. 이미 바둑알이 놓여진 자리에 다시 놓지 못하게 방지하기

 

현재 상태에서 게임을 실행해보면 바둑알이 놓여진 자리에 또 놓여지는 불상사가 발생합니다. 그럼 안되겠죠!

 

1) 그래서 놓으려는 좌표에 이미 바둑알이 놓여져있나를  (StonePiece[Column, Row].WhiteOrBlack = ' ' 를

   사용해서  아무것도 없는경우에만 놓게합니다.

 

procedure TMainForm.TTTBoardMouseUp( , , , X, Y: Integer);

, , ,

if (StonePiece[Column, Row].WhiteOrBlack = ' ') and WhiteMoved then

begin

, , ,

end

else if (StonePiece[Column, Row].WhiteOrBlack = ' ') and (Not WhiteMoved)then

begin

, , ,

end;

 

 

2) 그리고 ResetBoard에서 StonePiece[Column, Row] 좌표값을 다음처럼 초기화 해줍니다.

   새게임이 클릭될때에도 마찬가지로 초기화 합니다.

 

procedure TMainForm.ResetBoard;

begin

    for I := 0 to 19 do

for J := 0 to 19 do

begin

   // 흑백돌의 저장된 좌표값의 초기화

   StonePiece[I, J].WhiteOrBlack := ' '; 

 

 

4. 다음 세션을 위한 생각!

다음 세션에서는  연속 5개의 바둑알이 있는지 확인하는 기능을 해보고자 합니다.

그러기 위해선 총 4 방향으로 연속5개가 있나를 확인하는 프로그램을 하면됩니다.

 

4ways.png

 

       위의  4가지 경우의 수를 프로그램으로 구현하기위해선 다음의 좌표를 이해하시면 도움이 됩니다.      

  

 

 xy_Cal.png

 

그럼 다음 세션에선 5개의 연속이 있는지를 아래의 function 에서 프로그램 해보도록 하겠습니다!


    function  TMainForm.IsThereFiveToStopGame(ForWho : char): boolean;

begin
  //
end;
 

 

 그럼 다음에 뵙겠습니다. 좋은 연휴되십시요

 

 첨부파일 첨부합니다.

 

 

번호 제목 글쓴이 날짜 조회 수
공지 [DelphiCon 요약] 코드사이트 로깅 실전 활용 기법 (Real-world CodeSite Logging Techniques) 관리자 2021.01.19 15414
공지 [UX Summit 요약] 오른쪽 클릭은 옳다 (Right Click is Right) 관리자 2020.11.16 13960
공지 [10.4 시드니] What's NEW! 신기능 자세히 보기 관리자 2020.05.27 16496
공지 RAD스튜디오(델파이,C++빌더) - 고객 사례 목록 관리자 2018.10.23 22048
공지 [데브기어 컨설팅] 모바일 앱 & 업그레이드 마이그레이션 [1] 관리자 2017.02.06 23267
공지 [전체 목록] 이 달의 기술자료 & 기술레터 관리자 2017.02.06 18921
공지 RAD스튜디오(델파이, C++빌더) - 시작하기 [1] 관리자 2015.06.30 39245
공지 RAD스튜디오(델파이,C++빌더) - 모바일 앱 개발 사례 (2020년 11월 업데이트 됨) 험프리 2014.01.16 174696
1303 [UX Summit 요약] 레거시 데스크탑 앱 UI/UX 현대화 – 이론부터 실제까지 (Legacy desktop apps UI & UX modernization. From theory to practice) 관리자 2020.11.04 406
1302 델파이에서 파이썬 표현식 활용하기 (PYTHON4DELPHI 샘플 앱) 관리자 2020.11.03 876
1301 개발자가 지원해야 하는 핵심 플랫폼들 관리자 2020.11.02 299
1300 이 달의 기술자료 - 2020년 11월 file 험프리 2020.10.27 334
1299 DELPHICON 2020, 곧 시작됩니다! file 관리자 2020.10.27 287
1298 [UX Summit 요약] 윈도우10에 멋진 플루언트UI 룩앤필을 델파이로 구현하기 (Giving your Apps the Fluent UI Look and Feel with Delphi)을 요약했습니다. - (델파이 개발자 뿐만 아니라) 윈도우 애플리케이션 개발자가 알아야할 기본이되고 중요한 마이크로소프트 UI 디자인의 핵심을 정리하고 보여줍니다. 관리자 2020.10.26 392
1297 RAD스튜디오와 델파이 – 원조 로우코드! 관리자 2020.10.23 297
1296 [UX Summit 요약 / 사례연구] 모바일은 두 번째: 어떨 때 데스크톱에 우선 집중하는가? 관리자 2020.10.22 272
1295 XML MAPPER 업데이트 관리자 2020.10.21 280
1294 [UX Summit 요약] 데스크탑용 UX 구축/최적화 전략(Strategies for building and optimizing the desktop UX) 관리자 2020.10.21 254
1293 [UX Summit 요약] 훌륭한 UI에 적용되는 과학적 원리 (Science of Great UI) 관리자 2020.10.19 250
1292 [개발팁] 오래된 레거시 델파이, C++ 애플리케이션을 최신 스타일의 초고속 앱으로 마이그레이션하기 관리자 2020.10.15 337
1291 C++ 업데이트 소식: 10.4와 10.4.1에서 집중한 C++ 품질과 관련하여 관리자 2020.10.12 309
1290 [10.4 시드니][업데이트 1] 새로운 IDE 기능들 관리자 2020.10.08 335
1289 [엠바카데로 UX SUMMIT] 눈여겨 봐야할 컨텐츠들! 관리자 2020.10.06 290
1288 델파이용 볼드(BOLD FOR DELPHI) 오픈 소스 공개! 관리자 2020.09.25 484
1287 [업데이트 서브스크립션 고객 - 무상제공] C++ 컴파일 스피드를 확 높여줄 TwineCompile 관리자 2020.09.25 542
1286 이 달의 기술자료 - 2020년 10월 file 험프리 2020.09.24 357
1285 델파이 개발자를 위한 파이썬 file 관리자 2020.09.23 569
1284 [팁] VLC 플레이어(ActiveX Import 해) 사용하기 file 험프리 2020.09.22 992