디시인사이드 갤러리

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

갤러리 본문 영역

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

오리망탱(112.159) 2011.11.30 21:17:20
조회 406 추천 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 - -
AD 따뜻한 겨울나기! 방한용품 SALE 운영자 25/11/27 - -
292101 횽들 ㅠㅠ 프로그래밍 알바구함... [6] 자비점(203.252) 11.12.02 233 0
292100 요즘 한나라당 패기 쩌넼ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ [1] -ㅂ-(210.90) 11.12.02 128 0
292099 방송 자체가 올드 미디어 아니냐? [6] 분당살람갤로그로 이동합니다. 11.12.02 111 0
292097 10.26 재보선 선관위 DDos공격은 혹시 곽노현팀장이 한거냐? [1] 바보플머(121.190) 11.12.02 77 0
292094 부동 소수점 곱셈 개념좀 [2] 전원버튼갤로그로 이동합니다. 11.12.02 108 0
292092 우리나라에 진짜 실력자 해커들은 몇명이나 있을까요? [2] 복실이(59.23) 11.12.02 190 0
292091 곽노현팀장은 머냐? [2] 바보플머(121.190) 11.12.02 126 0
292090 선관위 홈피 DDOS 공격한게 국회의원실 직원?? [5] 시불라미갤로그로 이동합니다. 11.12.02 138 1
292088 세미나 이름을 지금봤네ㅋㅋㅋ [1] 햏햏했갤로그로 이동합니다. 11.12.02 87 0
292086 쓸데없는 것들로 주절주절 비관하지 마라. [3] 바보플머(121.190) 11.12.02 98 0
292085 학기말에 과제만 쌓여간다.. 다이렉트어렵다갤로그로 이동합니다. 11.12.02 42 0
292084 무선랜카드 유선랜카드 차이점이 무엇인가요? [15] ㅜㅜ(183.104) 11.12.02 196 0
292083 지금 전 회사에서 통장에 돈이 들어왔는데 [12] 좋은아버지갤로그로 이동합니다. 11.12.02 186 0
292081 = ㉦=).... 땡칠도사갤로그로 이동합니다. 11.12.02 65 0
292079 게이들아 안녕 줫밥(122.49) 11.12.02 36 0
292076 아스형 Lover♥갤로그로 이동합니다. 11.12.02 33 0
292073 세미나 가는길 [2] 햏햏했갤로그로 이동합니다. 11.12.02 67 0
292072 밥묵고 합세다 Gavi_cp갤로그로 이동합니다. 11.12.02 60 0
292070 자바 AWT 질문좀.. Partyup갤로그로 이동합니다. 11.12.02 51 0
292067 혹시 Community Day 가는 새퀴덜없냐? ㅋ [1] 초딩6(59.13) 11.12.02 51 0
292065 프갤님들먼가 퀄리티가 있어보임 [6] 푸른명월갤로그로 이동합니다. 11.12.02 120 0
292063 내 생각이지만 곽팀장은 [5] Gavi_cp갤로그로 이동합니다. 11.12.02 117 0
292061 하루에 몇시간 공부해야 공부했다고 할까요? [4] 푸른명월갤로그로 이동합니다. 11.12.02 122 0
292060 내글 누가 신고했었냐? [3] 1(121.182) 11.12.02 66 0
292059 프갤러를 위한 글 [4] Gavi_cp갤로그로 이동합니다. 11.12.02 81 0
292055 나는 초슈퍼울트라메가톤핵폐기물급 쓰레기다 [8] 얼빠진호랑이갤로그로 이동합니다. 11.12.02 173 0
292053 그동안 얼마나 하고 싶었을까?? [1] 1(121.182) 11.12.02 89 0
292052 인터넷으로 c언어 하는 방법좀 Цпкпошп갤로그로 이동합니다. 11.12.02 79 0
292051 근데 여자친구랑 미술관 가면 뭐하냐? [7] 이명박보영(61.80) 11.12.02 101 0
292050 나근데 리얼 여자친구있음.. [3] Gavi_cp갤로그로 이동합니다. 11.12.02 82 0
292049 Fan Death 따위나 신봉하는 무지한 Gook들에게 고함 [1] 곽노현차장(59.13) 11.12.02 47 0
292047 그림좋아하는 프갤러있음? [12] Gavi_cp갤로그로 이동합니다. 11.12.02 112 0
292046 종편 시청률 1프로래 [4] 분당살람갤로그로 이동합니다. 11.12.02 82 0
292045 오오미 구글에서 CString을 검색하니 초딩6(59.13) 11.12.02 49 0
292044 에디쓴은 하루 4-5시간씩 잤다고해요 [3] 푸른명월갤로그로 이동합니다. 11.12.02 69 0
292043 기사는 사실만 전달해야 하는가? [4] Gavi_cp갤로그로 이동합니다. 11.12.02 73 0
292041 우분투는 반투어로 "네가 있으니 내가 있다" [5] 다림줄갤로그로 이동합니다. 11.12.02 101 0
292037 조선만한 언론사는 없는듯 [7] 곽노현차장(59.13) 11.12.02 115 1
292036 페북 계정을 잃어버렸다.. [1] 햏햏했(115.90) 11.12.02 53 0
292035 혹시 우분투 채팅방열때 ip랑 포트설정아시는분 계세여.ㅠ? 우분투(116.41) 11.12.02 25 0
292032 병원의 아침은 6시부터 [1] 알탱o갤로그로 이동합니다. 11.12.02 50 0
292027 엑셀 비쥬얼 베이직 고수님..이것좀 도와주세요ㅠㅠ [1] 엑셀(211.195) 11.12.02 47 0
292026 레알 못할 것 같은 일은 하지 마라 [1] 땡칠도사갤로그로 이동합니다. 11.12.02 129 0
292025 자바 369입니다.ㅠㅠ 저좀 살려주세요..ㅠㅠ [8] lightnings(211.47) 11.12.02 138 0
292024 프갤고수님들 aspx 페이지에서 리스트박스 아이템 상세주소 아는법없을까요 호구甲갤로그로 이동합니다. 11.12.02 38 0
292022 회사가 망하기 일보직전이네. 이직할려는데 조언좀요 [1] (112.148) 11.12.02 100 0
292021 어셈블리 얘기가 나와서 하나 질문좀 하려 하는데... [1] 우라늄갤로그로 이동합니다. 11.12.02 64 0
292020 학교 과제로 짠 8바이트 순환큐 [1] elwlwlwk갤로그로 이동합니다. 11.12.02 144 0
292019 php고수횽님들 도움좀 [1] php(112.186) 11.12.02 65 0
292016 (DX)오른손좌표계에서 왼손좌표계로 옮길 때 [8] 한마음택배(114.202) 11.12.02 103 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

디시미디어

디시이슈

1/2