메뉴 바로가기

서브메뉴 바로가기

본문 바로가기

logo

묻고 답하기
조회 수 7,628 추천 수 0 댓글 11
?

단축키

Prev이전 문서

Next다음 문서

위로 아래로 댓글로 가기 인쇄 쓰기 목록
?

단축키

Prev이전 문서

Next다음 문서

위로 아래로 댓글로 가기 인쇄 쓰기 목록
?
  • WhiteAT 2011.05.15 21:47

    테트리스 자료를 올린지 꽤 되어서 정확한 함수명은 기억나지 않지만,

    벽돌 생성하는 함수가 있을 겁니다. 아마도 NewBlock() 인듯한데, 거기에 x =1, y=5 정도의 값으로 셋팅되어 있습니다.

    그것을 원하시는 값으로 변경하시면 됩니다.~

     

    위로 쌓이게 하려면,

    타이머 증가할때마다 x 값을 감소하면 됩니다.~

  • C++왕초보 2011.05.15 23:22 글쓴이

    WhiteAT 님에게 달린 댓글

    답변 감사합니다.

     

    제가 벽돌을 위로 가게 하는 거랑, 두번째 벽돌생성 위치를 변경하는데는 성공했습니다.

     

    (On timer함수에 숫자 조정)

     

    그런데, 제일 처음에 생기는 벽돌 위치 조정하는 거랑. 보드판 만들때 구현되는 함수 잘 이해가 안가서

     

    질문 드립니다

     

    지금과 같은 경우라면, 보드판을 뒤집어서 생성해야 되는데, 보드판 함수를 아무리바도 이해가 잘 안갑니다.

  • WhiteAT 2011.05.16 07:46

    void CBoard::NewGame()

    void CBoard::NewGame()

    {

        int tempY;

        int tempX;

     

        for(tempY = 0;tempY<BOARD_Y_SIZE+1;tempY++){

            for(tempX=0; tempX<BOARD_X_SIZE+2; tempX++)

            {

                m_iBoard[tempY][tempX].m_iValue = 0;

            }

        }

     

     

        // 보드의 좌측 벽

        for(int i=0;i<BOARD_Y_SIZE;i++){

            m_iBoard[i][0].m_iValue=50;

        }

     

        // 보드의 우측 벽

        for( i=0;i<BOARD_Y_SIZE;i++){

            m_iBoard[i][BOARD_X_SIZE+1].m_iValue=50;

        }

     

        // 보드의 하단 벽

        for( i=0;i<BOARD_X_SIZE+2;i++){

                m_iBoard[BOARD_Y_SIZE][i].m_iValue=50;

        }

     

     

        NewShape();

     

    }

     

     
     
     
     

     

    http://whiteat.com/zbxe/43113  의 NewGame() 함수가 새로운 게임 생성하는 함수 입니다.^^

  • C++왕초보 2011.05.17 23:54 글쓴이

    WhiteAT 님에게 달린 댓글

    아 답변은 감사한데, 제 질문과는 조금 다르네요..

     

    전 2007년도 버전을 보고 있는데...

     

    일단 제가 이해가 안되는 것은

      for(tempY = 0;tempY<BOARD_Y_SIZE+1;tempY++)
     {
       for(int tempX=0; tempX<BOARD_X_SIZE+2; tempX++)
      {
       if(0 != g_BoardInfo[tempY][tempX])
       {
         DrawOneBlock((BOARD_Y_POS+tempY),BOARD_X_POS+tempX,m_iOneBlockSize,&pDC,RGB(200,200,200));
     
        }
      }
      }

    이 함수에서 보면,

     

    y값을 0부터 BOARD_Y_SIZE까지 증가시키면서, 회색판을 그리는 건데,...

     

    그러면 제일 마지막에 한줄이 그려지는데

     

    지금 제가 궁금한것은

     

    제일 마지막줄이 제일 위에 그려지고, 밑에가 뚫려있는 그 보드를 그리는 함수가 필요합니다.

     

    그리고 난 뒤에, 벽을 그리는 함수(실제로 게임상에서 벽돌을 못들어가게 하는 함수)를 보려고 합니다.

     

    언제나 빠른 답변 감사합니다.

     

    아 추가적으로,

     

    void CWATTetrisView::OnPaint()
    {
     CPaintDC dc(this); // device context for painting
     
     CClientDC pDC(this); // 현재 화면의 정보를 얻음
     CPen penLine; // 사용할 pen 의 셋팅
     CPen *OldPen; // 기존에 사용하던 설정으로 복구할 변수
     penLine.CreatePen(0,3,RGB(0,0,0));
     OldPen = pDC.SelectObject((&penLine));
     
     //////////////////////////////////////////////////////////////////////////
     // 실제 출력될 내용

     for(int tempY=0;tempY<4;tempY++)
     {
      for(int tempX=0; tempX<4; tempX++)
      {
       if (0 != g_NowBlockInfo[m_iNowBlockShape][m_iNowBlockDir][tempY][tempX])
       {
        DrawOneBlock(BOARD_Y_POS + m_iNowBlockY+tempY,BOARD_X_POS + m_iNowBlockX+tempX,m_iOneBlockSize,&pDC,RGB(250,050,250));
       }
       else
       {
        // 벽돌이 아닌 곳을 회색으로 표시
    //    DrawOneBlock(BOARD_Y_POS + m_iNowBlockY+tempY, BOARD_X_POS+m_iNowBlockX+tempX,m_iOneBlockSize,&pDC,RGB(200,200,200));
       }
      }
     }
     //////////////////////////////////////////////////////////////////////////


      for(tempY = 0;tempY<BOARD_Y_SIZE+1;tempY++)
     {
       for(int tempX=0; tempX<BOARD_X_SIZE+2; tempX++)
      {
       if(0 != g_BoardInfo[tempY][tempX])
       {
         DrawOneBlock((BOARD_Y_POS+tempY),BOARD_X_POS+tempX,m_iOneBlockSize,&pDC,RGB(200,200,200));
     
        }
      }
      }

     

    이 함수대로 넣고 실행을하면, 제일 처음 벽돌이 생성되는 위치가 위에서 부터 생성이 되는데, 조절되게 하는 방법좀 부탁드립니다...

     

    최초에 시작되는 것만 수정하면 될것같던데..

     

    못찾겠어요...

  • WhiteAT 2011.05.18 13:58

    C++왕초보 님에게 달린 댓글

    조금만 더 보시면 아실거 같은데요.^^

     

    보드의 상단을 막으려면

    현재는 NewBoard() 에서 아래처럼 되어 있는데,

     

      // 보드의 하단 벽

        for( i=0;i<BOARD_X_SIZE+2;i++){

                m_iBoard[BOARD_Y_SIZE][i].m_iValue=50;

        }

     
    이렇게 바꾸면 되겠죠?

        for( i=0;i<BOARD_X_SIZE+2;i++){

                m_iBoard[0][i].m_iValue=50;

        }

     

     

     

     

    OnPaint() 는 현재 보드,벽돌의 상태를 다시 출력해줄 뿐입니다.^^

    앞에서도 답변 드렸었는데, 벽돌을 새로 만드는 함수에서 좌표를 지정하게 되어 있습니다.

    아마도 NewBlock() 인듯 하다고 말씀드렸습니다.^^

     

  • C++왕초보 2011.05.18 23:59 글쓴이

    WhiteAT 님에게 달린 댓글

    답변으로 하나는 해결했습니다.

     

    일단 처음 생성되는 것을 찾아보니까

     

    GAmeStart에 있는

    함수들이었네요...

     

    이런 허접한 질문을 한 제가 죄송할 정도로 너무 쉽게 풀려서

    ㅈㅅ합니다.

     

    그리고

    두번째로

     

    저는 보드판을 그리는 함수따로,

     

    실질적으로 벽으로 막는 함수 따로인줄 알았는데,

     

    그게 아니군요...

     

    아직도 ++을 이해하려면 에휴~~

    ㅠ.ㅠ

    답변은 언제나 감사합니다.

     

     

  • WhiteAT 2011.05.19 07:09

    C++왕초보 님에게 달린 댓글

    구조를 간단하게 설명드리면^^

     

    m_iBoard [][] 라는 변수에 보드의 정보를 넣습니다.

    여기에는 블럭이 쌓인 정보도 함께 있구요^^

    벽돌이 쌓일때마다 계속 변경이 되겠지요...

     

    그리고 보드 또는 벽돌을 그려주는 것은

    m_iBoard [][]를 보고 출력만 해주는 겁니다.^^

     

     

    m_iBoard 를 잘 활용해 보세요.~

     

     

  • C++왕초보 2011.05.27 15:54 글쓴이

    WhiteAT 님에게 달린 댓글

    오랜만에 다시 작업을 하네요..

     

    마무리를 지으려고 합니다.

     

    일단은 모든것이 완료 되었고, 이제 마지막으로 보드판에 저장하는것만 하면 되는데,(블록이 천장에 닿으면)

    그런데...

     

    이게 아예 막히네요..

     

    함수를 해석할수가 없어요...

     

    void CWATTetrisView::ChecknRemove()
    {
     // 벽돌을 보드에 저장하기
     for (int iTempBlockY = 0; iTempBlockY<4 && (m_iNowBlockY+iTempBlockY<BOARD_Y_SIZE); iTempBlockY++)
     {
      for (int iTempBlockX = 0;iTempBlockX<4;iTempBlockX++)
      {
       if(0 == g_BoardInfo[m_iNowBlockY+iTempBlockY][m_iNowBlockX+iTempBlockX] )
       {
        if( 0 !=g_NowBlockInfo[m_iNowBlockShape][m_iNowBlockDir][iTempBlockY][iTempBlockX])
        {
         g_BoardInfo[m_iNowBlockY+iTempBlockY][m_iNowBlockX+iTempBlockX] = g_NowBlockInfo[m_iNowBlockShape][m_iNowBlockDir][iTempBlockY][iTempBlockX];

        }
       }
      }
     }

     // 한줄 없애기
     BOOL bGoodOneLine = TRUE;
     for ( iTempBlockY = 0;iTempBlockY<4 && (m_iNowBlockY+iTempBlockY<BOARD_Y_SIZE);iTempBlockY++)
     {
      bGoodOneLine = TRUE;
      for (int iTempBlockX = 0;iTempBlockX<BOARD_X_SIZE+2;iTempBlockX++)
      {
       if(0 == g_BoardInfo[m_iNowBlockY+iTempBlockY][iTempBlockX] ){ // 한칸이라도 빈칸이 있으면.
        bGoodOneLine = FALSE;
        iTempBlockX = BOARD_X_SIZE + 2;
       }

      }
      if(TRUE == bGoodOneLine){
       int iRemoveLineNum = m_iNowBlockY+iTempBlockY;
       for(int i=iRemoveLineNum ; i>0 ; i--){
        for(int j=1;j<BOARD_X_SIZE+2;j++){
         g_BoardInfo[i][j] =g_BoardInfo[i-1][j] ;
        }
       }
      }
     }


     if(IsGameEnd()){
      KillTimer(1);
      if(IDYES == MessageBox("한판 더 해","게임이 끝났습니다.",MB_YESNOCANCEL)){
       GameStart();
      }

     }
    }

    BOOL CWATTetrisView::IsGameEnd(){
      for(int tempY = 15;tempY>13 ;tempY--){
       for(int tempX=3; tempX<7; tempX++)
      {
       if(0 != g_BoardInfo[tempY][tempX])
       {
        return TRUE;
        }
      }
      }

     return FALSE;

    이 함수 자체가 해석이 안되는데, 해석좀 도와주시고,

    마지막으로 제일 윗 천장부터 시작해서 저장이 될수 있도록 도와주세요...

     

    제가 프로그램을 건드려 보면서 한거는 g_boradinfo라는 것을 건드리면 될것 같던데...

    중요한건

    이 프로그램에서 게임이 끝났는지 체크하는 함수에서


    BOOL CWATTetrisView::IsGameEnd(){
      for(int tempY = 15;tempY>13 ;tempY--){
       for(int tempX=3; tempX<7; tempX++)
      {
       if(0 != g_BoardInfo[tempY][tempX]){
        return TRUE;
        }
      }
      }

     return FALSE;
    }

    이런식으로 상수를 바꾸어서 주면,

    블럭이 전체적으로 쌓이는 것이 아니라. 원래 다음벽돌에 닿으면 바로 쌓여야 되는데, 그렇지 못하고 원래 쌓인 블럭 안으로 들어가서  쌓여버리는 현상이 나타납니다..

     

    뭐가 문젠지... 이해가 잘 안가서..

    도와주십시오

  • WhiteAT 2011.05.30 07:00

    C++왕초보 님에게 달린 댓글

    위에 함수 해석을 다 해드릴수는 없구요;;

    모르는 부부만 체크해 주세요^^

     

    IsGameEnd 함수는 게임이 끝났나 체크만 하는 함수입니다.~~

    10000번 체크해도 보드 상태는 변경되지 않습니다.^^

     

    IsGameEnd 함수를 변경하시면

    게임 종료 체크가 비정상으로 될수 있을겁니다.

     

  • C++왕초보 2011.06.03 01:23 글쓴이

    WhiteAT 님에게 달린 댓글

    아 결국은 프로그램을 완성했네요.. 감사합니다....~!

  • WhiteAT 2011.06.03 10:35

    C++왕초보 님에게 달린 댓글

    잘 해결되셔서 다행입니다.~~

     


  1. [제발도와주세요] acitveX 를 이용하여 comport 연결하기

    Date2011.07.14 Category :프로그래밍 Reply3
    Read More
  2. 소스 질문입니다 !

    Date2011.07.11 Category :프로그래밍 Reply4
    Read More
  3. 비밀글 입니다.

    Date2011.06.03 Category :프로그래밍 Reply4
    Read More
  4. mfc wav 음악파일 재생.

    Date2011.06.03 Category :프로그래밍 Reply2
    Read More
  5. mfc 테트리스 만들기 타이머설정 (왕초보)

    Date2011.05.31 Category :프로그래밍 Reply1
    Read More
  6. 비밀글 입니다.

    Date2011.05.26 Category :프로그래밍 Reply1
    Read More
  7. c++하는데 MFC 이용해서 이미지 불러오기!!!

    Date2011.05.26 Category :프로그래밍 Reply1
    Read More
  8. Commu 프로그램에서

    Date2011.05.21 Category :프로그래밍 Reply1
    Read More
  9. MFC 테트리스 만드는것 질문

    Date2011.05.15 Category :프로그래밍 Reply11
    Read More
  10. 비밀글 입니다.

    Date2011.05.11 Category :프로그래밍 Reply1
    Read More
  11. 비밀글 입니다.

    Date2011.04.18 Category :프로그래밍 Reply1
    Read More
  12. mfc 다이얼로그 활용소스 질문요 WATDialogAll_src

    Date2010.06.10 Category :프로그래밍 Reply1
    Read More
  13. 안녕하십니까 테트리쓰에 대해서 질문 드릴려구요

    Date2010.06.03 Category :프로그래밍 Reply1
    Read More
  14. 질문이요

    Date2010.04.19 Category :프로그래밍 Reply1
    Read More
  15. c++ 내림차순이요

    Date2010.03.27 Category :프로그래밍 Reply1
    Read More
목록
Board Pagination Prev 1 2 3 4 5 Next
/ 5