디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

으아.. 도와줄수있어 ??

오리망탱(112.159) 2011.11.30 21:17:20
조회 405 추천 0 댓글 0

좀 길긴해 ;; 그리고 테트리스야

뭐 어떻게말하면 좋을진모르겠지만
열심히 공부해서 테트리스 만드려하는데
책보면서 공부해서 대충 틀은 다잡아놨거든?
그런데 사람들 테트리스보면 다음 도형나오고 점수나오고 점수 1000점 하면 레벨오르고그런거있짢아
어떻게 하는지좀알려줫으면 좋겠어
대충 다음 도형같은건 프린트폼 쓰면되는것같고
점수는 체크라인에가서 줄없어지면 카운트 변수에 1씩올리고 하면되고 
레벨은 솔직히 잘모르겠어 ㅠ

좀알려줬으면 감사감사

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>



int count=0;

// x,y 두개의 좌표가 필요하니깐 벽돌 하나 모양을 정의하려면 8바이트가 필요하지?
// 그래서 도형하나의 공간인 4행 4열 위치를 지정해야해

char form[7][4][8] =
{
        { {1,0,1,1,1,2,1,3}, {0,1,1,1,2,1,3,1} , {1,0,1,1,1,2,1,3} , {0,1,1,1,2,1,3,1} },
        { {1,1,2,1,1,2,2,2}, {1,1,2,1,1,2,2,2}, {1,1,2,1,1,2,2,2}, {1,1,2,1,1,2,2,2} },
        { {2,1,0,2,1,2,1,1}, {1,0,1,1,2,1,2,2}, {2,1,0,2,1,2,1,1}, {1,0,1,1,2,1,2,2} },
        { {0,1,1,1,1,2,2,2}, {2,0,2,1,1,1,1,2}, {0,1,1,1,1,2,2,2}, {2,0,2,1,1,1,1,2} },
        { {1,0,1,1,1,2,2,2}, {0,1,1,1,2,1,0,2}, {1,0,2,0,2,1,2,2}, {2,1,2,2,1,2,0,2} },
        { {2,0,2,1,2,2,1,2}, {0,1,0,2,1,2,2,2}, {1,0,2,0,1,1,1,2}, {0,1,1,1,2,1,2,2} },
        { {0,1,1,1,2,1,1,2} , {2,0,2,1,2,2,1,1}, {1,1,1,2,0,2,2,2} , {1,0,1,1,1,2,2,1} },
};
// 여긴 테트리스 보드판 만드는거야
int tetris[21][12];

//블록 종류를 나타내는거야

int form_kind;

// 블록 회전형태

int rotate_kind;

// 화면상의 좌표 !
int screen_x, screen_y;

// 화면 위치 지정하는함수야

void CurrentXY(int x, int y)
{
        COORD Location;
        X =x;
        Y =y;

        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Location);
}


// 화면 커서없내는 거야

void CursorOff(void)
{

        CONSOLE_CURSOR_INFO Information;

        Information.dwSize=1;
        Information.bVisible=FALSE;

        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Information);
}

// 화면 커서 나타내게 하는거야 ㅇ

void CursorOn(void)

{

        CONSOLE_CURSOR_INFO Information;

        Information.dwSize=20;
        Information.bVisible=TRUE;

        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &Information);
}

// 도형 하나를 출력하는거야

void Print_form()
{

        int i;

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

                // 화면 위치 지정하는거야
                CurrentXY(30+ (screen_x+form[form_kind][rotate_kind][i*2])*2, screen_y + form[form_kind][rotate_kind][i*2+1]);

                //착지하지 않은 도형을 1로 지정하는거야 그래서 tetris 배열에 저장하는거지

                tetris[screen_y+form[form_kind][rotate_kind][i*2+1]] [screen_x+form[form_kind][rotate_kind][i*2] ] = 1;

                // 도형을 화면에 출력하는거임

                printf("□");
        }
}

// 도형 하나 삭제하는거야 

void Delete_form()
{

        int i;

        for (i=0; i<4; i++)

        {

                // 화면 위치 지정하는거임

                CurrentXY(30+(screen_x+form[form_kind][rotate_kind][i*2]) *2, screen_y+form[form_kind][rotate_kind][i*2+1]);

                //도형이 없다는걸 0으로 tetris 배열에 저장하는거야 !

                tetris [ screen_y + form[form_kind][rotate_kind][i*2+1]] [ screen_x + form[form_kind][rotate_kind][i*2] ] = 0;

                // 화면의 도형 삭제 !!!!!
                
                printf(" ");

        }
}


// 보드판 초기위치를 어디다 할껀지 설정하고 테두리 만드는거야

void Initial()
{
        int i,j;

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

                for(j=0; j<12; j++)
                {   //외벽을 의미하는 3을 저장하는거야 
                        if (i==20 || j==0 || j==11)
                                tetris[i][j] = 3;
                        else // 빈 도형을 의미하는 0을 저장해
                                tetris[i][j] = 0;
                }
        }

        for(i=0; i<21; i++)
        {   // 아래로 출력 !

                CurrentXY(30,i);
                printf("│");
                CurrentXY(52,i);
                printf("│");

        }

        CurrentXY(30,20);

        printf("└");
        for (j=1; j<11;j++)
        {     // 옆으로 출력

                CurrentXY(30 + j*2, 20);
                printf("─");
        }

        CurrentXY(52,20);
        printf("┘");
}

// 위치에 도형이나 테두리가 있는지 체크하는거야

int Check_board(int location_x, int location_y)
{
        int i, temp=0;

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

                // 현재 위치에 있는 도형 정보를 읽는거야

                temp = tetris[ location_y + form[form_kind][rotate_kind][i*2+1]] [ location_x + form[form_kind][rotate_kind][i*2] ];


                // 아까 도형이있으면 1저장한댔짢아? 그거야

                if ( temp > 1)
                        return TRUE;
        }

        return FALSE;
}

// 현재 보드판 상황의 도형들을 출력

void Print_data()

{

        int i,j;

        for(i=0; i <20; i++)
                for (j=1; j <11; j++)
                        // 착지한 도형이면

                        if (tetris[i][j] == 2)
                        {

                                CurrentXY(30 + j*2, i);
                                printf("□");
                        }
                        else
                        {
                                CurrentXY(30 + j*2, i);
                                printf(" ");
                        }
}

// 보드판 데이터를 한줄 아래로 이동 !!

void Move_data(int row)

{

        int i,j;

        // 삭제 대상의 윗줄부터 최상위 라인까지를 한줄 아래로 이동 !!


        for ( i=row - 1; i >=0; i--)

                for (j=1; j< 11; j++)

                        tetris[i+1][j] = tetris[i][j];
}

// 한줄찼는지 체크하는거야 그리고 나 이제 졸리다 ㅠ 새벽샜어

int Check_line2 (int row)
{

        int chk=0;
        int j;

        for(j=1; j<11; j++)

                chk += tetris[row][j];

        // 착지한 도형을 의미하는 2가 열개모이면 줄이찬거야 

        if (chk==20) return TRUE;
        else return FALSE;
}


// 없앨줄있는지 체크

void Check_line()

{
        int rst;

        int i;

        for(i=screen_y; i<screen_y + 4; i++)
        {

                // 한줄 찼는지 점검 !
                rst =Check_line2(i);
                
                // 한줄이 찼으면 삭제할 줄을 없애는거야

                if (rst==TRUE)
                {

                        Move_data(i);
                        Print_data();
                        i--;
                }
        }
}

// 착지 완료된 도형의 데이터를 보드판에 기입해 ㅠㅠ 졸려

void Write_board()
{

        int i;

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

                tetris[ screen_y + form[form_kind][rotate_kind][i *2 +1]] [ screen_x + form[form_kind][rotate_kind][i*2]] =2;
        }
}

// 도형을 아래로 이동하게하는거야 

int Go_down()
{

        int chk2;

        // 한줄ㅇ ㅏ래로 이동 가능한지 점검한다 !

        chk2 = Check_board(screen_x, screen_y + 1);

        // 이동 가능하지않으면

        if (chk2==TRUE)
        {

                // 보드판에 2를 저장해

                Write_board();

                // 채워진 줄이 존재하는 점검해바

                Check_line();

                return TRUE;
        }

        // 도형을 아래로 내려
        Delete_form();
        screen_y++;
        Print_form();

        return FALSE;
}

// 키값에 따른처리해 이거 키 이벤트야 알지 ?

int Select(void)

{

        int chk1;
        int prev_rotate;
        int new_rotate;
        int rtn_value;

        if(GetAsyncKeyState(VK_LEFT))
        {

                //왼쪽누르면 
                chk1= Check_board(screen_x-1, screen_y);

                // 이동할 위치가 빈곳이면

                if (chk1 ==FALSE)

                {

                        // 기존에있는 도형을 삭제하고 새 위치에 출력하는거야!
                        Delete_form();
                        screen_x--;
                        Print_form();
                        return TRUE;
                }
        }

        if(GetAsyncKeyState(VK_RIGHT))
        {
                // 오른쪽 누르면

                chk1 = Check_board(screen_x+1, screen_y);

                // 이동할 위치가 빈곳이면

                if(chk1 ==FALSE)
                {

                        // 기존 위치의 도형 삭제하고 새 위치에 출력

                        Delete_form();

                        screen_x++;

                        Print_form();

                        return TRUE;
                }
        }

        if(GetAsyncKeyState(VK_UP))
        {
                // 위 입력하면 도형을 바꿔

                prev_rotate = rotate_kind;

                // 도형 모양을 바꿈

                if(rotate_kind ==3) rotate_kind = 0;

                else rotate_kind++;

                new_rotate = rotate_kind;

                // 새로운 도형이 출력 ㅏ가능한지 점검해봐

                chk1 = Check_board(screen_x, screen_y);
                // 가능하면 전 도형 삭제하고 새도형 출력해

                if(chk1==FALSE)
                {

                rotate_kind = prev_rotate;
                Delete_form();

                rotate_kind = new_rotate;
                Print_form();
                return TRUE;
                }
                else
                {
                        rotate_kind = prev_rotate;
                }
        }

        if(GetAsyncKeyState(VK_SPACE))
        {
                // 도형을 한줄 밑으로 출력하는 Go_down 을 연속 호출해서 밑으로 쭉내리는거지

                while ( !Go_down());
                return FALSE;
        }

        rtn_value = Go_down();

        if (rtn_value==TRUE) return FALSE;
        else return TRUE;
}

// 시간 지연 처리 하는곳이야

void Timing(void)
{

        DWORD   thisTickCount;
        static DWORD  lastTickCount = 0;
        DWORD   delay = 100;                // 딜레이 이부분 수정하면속도를 늦추거나 빠르게할수있음


        //클럭 틱을 얻어 온다.

        thisTickCount = GetTickCount();

        while(1)
        {
                // 클럭틱의 횟수를 비교한다 .

                if((thisTickCount - lastTickCount) > delay)
                {
                        // 정해진 횟수의 틱 카운트면 최과해

                        lastTickCount = thisTickCount;
                        return;

                }

                thisTickCount = GetTickCount();
        }
}


void main()

{

        int chk, chk2;

        // 커서 안보이게하기!

        CursorOff();

        Initial();

        do {

                // 화면 좌표 초기값

                screen_y = 0;
                screen_x = 4;

                // 도형 종류 및 회전형태 지정

                form_kind = rand() % 7;
                rotate_kind = 0;

                Print_form();

                chk = Check_board(screen_x, screen_y);
                chk2 = Check_board(screen_x, screen_y+1);

                // 처음 위치가 아니라면 저장 하고 종료

                if ( chk==FALSE && chk2==TRUE)
                {

                        Write_board();
                        Check_line();

                        break;

                }
                // 처음위치라면 저장라고 종료해

                else 
                        if(chk ==TRUE && chk2==TRUE)
                                break;

                do {
                        Timing();
                }
                while(Select());

        }

        while(1);

        // 커서 다시 나타내자

        CursorOn();

}

추천 비추천

0

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 뛰어난 운동 신경으로 남자와 싸워도 이길 것 같은 여자 스타는? 운영자 25/11/24 - -
이슈 [디시人터뷰] 충무로가 주목하는 신예, '세계의 주인' 서수빈 운영자 25/11/24 - -
AD 대학생 필수템! What's in my Bag 운영자 25/11/21 - -
291862 형들은 보통 출근하는데 시간 얼마나걸려? [7] 좋은아버지갤로그로 이동합니다. 11.12.01 94 0
291861 근데 진짜 여자 프로그래머없어?? [8] 엄쿤(61.40) 11.12.01 201 0
291859 xml 파싱에서 파싱이 뭔지 간단하게 설명좀 해줘 형들 [2] 핫산(203.237) 11.12.01 78 0
291857 숭실 동국 둘중에 하나 간다는 종자 소환 [10] 나리링갤로그로 이동합니다. 11.12.01 321 0
291856 신촌에 먹을 곳이 없다니 [1] 초딩6(59.13) 11.12.01 60 0
291855 형들은 나이차이 몇살까지 가능함? 연하 [9] 붑이8(61.40) 11.12.01 138 0
291854 방금 입사지원 하라고 연락이 왔어요 [9] 좋은아버지갤로그로 이동합니다. 11.12.01 158 0
291853 아게이가 천재와 바보를 이야기하는데 [1] Adelposs갤로그로 이동합니다. 11.12.01 68 0
291852 신촌에 점심먹을곳 괜찮은곳 없나? [4] Partyup갤로그로 이동합니다. 11.12.01 128 0
291851 동국대 컴공이랑 숭실대 컴학에 붙었다면 어디가는게 더나을까여 [8] ㅁㅁ(125.135) 11.12.01 235 0
291850 아근 SM존나 나쁜덧 [1] Gavi_cp갤로그로 이동합니다. 11.12.01 89 0
291848 점심때가 되었슴다 [10] Gavi_cp갤로그로 이동합니다. 11.12.01 91 0
291846 이런거 프로들이 만들겠지? [1] iljeomobolt갤로그로 이동합니다. 11.12.01 87 0
291845 빈말들으면 당연히 좋기야 하겠지 [1] 개쉛기갤로그로 이동합니다. 11.12.01 83 0
291843 이쁜남자라는건 Adelposs갤로그로 이동합니다. 11.12.01 41 0
291841 여기 컴퓨터과 다니는분들 많나요? 제가 경영학관데 [7] 경영(125.131) 11.12.01 173 0
291840 sns 차단 가능할까? [3] iljeomobolt갤로그로 이동합니다. 11.12.01 73 0
291839 굽신굽신 디갤서 왔슴돠 혹시 데비안쪽 잘 아는 성님 계신가요? 나팔갤로그로 이동합니다. 11.12.01 47 0
291838 임베디드 쪽으로 나가면 미래없냐?? [2] ㄹㄴ(119.149) 11.12.01 181 0
291837 망해따.. [1] 일광면(119.198) 11.12.01 54 0
291834 아래 새끼 참 생각 없구나 [5] -ㅂ-(210.90) 11.12.01 171 0
291833 아근데 왜 짤이 안올라가지지 [1] Gavi_cp갤로그로 이동합니다. 11.12.01 75 0
291831 나는 친구한테 고민을 얘기하지 않는데 [3] Gavi_cp갤로그로 이동합니다. 11.12.01 70 0
291828 넷헬퍼라는 거 감시프로그램이야? 카링(14.54) 11.12.01 47 0
291825 사람들은 자기 칭찬에만 너무 익숙해져 있다.. [7] 쿄스케갤로그로 이동합니다. 11.12.01 117 0
291824 입갤 ) 컴퓨터 조립할려고 하는데요 다림줄갤로그로 이동합니다. 11.12.01 47 0
291823 스타킹 신은 남자가 최고라는거 모르냐 Lover♥갤로그로 이동합니다. 11.12.01 62 0
291822 해외기업에서 동영상 스트리밍 해달라고 파일을 줬는데 비트레이트가 [1] (112.223) 11.12.01 106 0
291820 기말과제로 교수가 어셈블러 만들라는대 너무 막막함 ㅜㅡ 살려줘요!! [6] 라탓타갤로그로 이동합니다. 11.12.01 153 0
291819 아아 여기는 서울 [3] Adelposs갤로그로 이동합니다. 11.12.01 68 0
291817 result = num > 0 ? num : num*(-1); [9] 듣보잡뉴비(59.24) 11.12.01 77 0
291816 ★html에서 버튼을 만들었는데 이상해 [2] 옷가게사장님갤로그로 이동합니다. 11.12.01 72 0
291815 usb에 넣은줄 알고 지웠는데 일광면(119.198) 11.12.01 48 0
291813 여긴 왜이렇게 게임에 관심있는 사람들이 많지? [3] ㅂㅈㄷㄱ(136.152) 11.12.01 138 0
291811 개발자님들이나 고수님들 윈도우에서 .bat 스크립트짜는거 한가지만알려조요 [3] 서버관리자(203.225) 11.12.01 76 0
291810 sql문으로 테이블 만드는거 도와줘요 [4] 내용정리갤로그로 이동합니다. 11.12.01 62 0
291809 내 생각엔 지금 시간대가 질문하기 좋은 시간대인거같아 [7] 22222(218.50) 11.12.01 95 0
291808 형들 백신 뭐씀? [4] 잦빙핱갤로그로 이동합니다. 11.12.01 137 0
291807 2222는 봅니다. [12] 좋은아버지갤로그로 이동합니다. 11.12.01 109 0
291806 아 디씨 짜증나 [2] 좋은아버지갤로그로 이동합니다. 11.12.01 55 0
291805 형들 뉴비 길좀 알려줘 [3] income갤로그로 이동합니다. 11.12.01 88 0
291804 게이갤러리에 여자사람 인생조언 부탁해도 돼 형들? [9] 222222(218.50) 11.12.01 131 1
291803 질문좀..............이거 왜이러냐 바이러슨가바 [4] 질문하나만(175.198) 11.12.01 73 0
291802 내가 하고 싶은 일을 하기 위해서 [2] 좋은아버지갤로그로 이동합니다. 11.12.01 74 0
291801 회의감느낀다 [5] 三didas갤로그로 이동합니다. 11.12.01 101 0
291800 횽아들 운영체제때문에 질문하나있씀니다 [13] 닥회드(119.64) 11.12.01 115 0
291799 IT병역특례병 100명이 있다고하면 95명은 빽이란게 사실?? [4] gfngne갤로그로 이동합니다. 11.12.01 154 0
291798 근데말야 졸업예정자나, 졸업한사람 [5] 궁금한데(125.141) 11.12.01 121 0
291797 아주 만약인데 정말 만약이야. 이건 [6] 좋은아버지갤로그로 이동합니다. 11.12.01 111 0
291796 데이타 베이스 설계과목 빡세다 [1] 마타버터갤로그로 이동합니다. 11.12.01 70 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2