SI코딩노예 [421820] · MS 2012 · 쪽지

2014-10-01 00:57:25
조회수 7,415

컴공러가심심해서만든2048게임C코드

게시글 주소: https://orbi.kr/0004914769

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>

void plus(int (*plate)[4], char *input) // 이동 시 서로 붙어 있는 수가 있으면 서로 더해주기 위한 함수
{
    int i, j;
    
    if((*input=='w')||(*input=='W')) // 위로 몰아넣으므로, 맨 위에 붙어있는 수들부터 차례대로 더한다.
    for(i=0; i<3; i++)
    {
        {
            for(j=0; j<4; j++)
            {
                if(plate[i][j]==plate[i+1][j])
                {
                    plate[i][j]*=2;
                    plate[i+1][j]=0;
                }
            }
        }
    }

    else if((*input=='s')||(*input=='S')) // 아래로 몰아넣으므로, 맨 아래에 붙어있는 수들끼리 차례대로 더한다.
    for(i=3; i>0; i--)
    {
        {
            for(j=3; j>=0; j--)
            {
                if(plate[i][j]==plate[i-1][j])
                {
                    plate[i][j]*=2;
                    plate[i-1][j]=0;
                }
            }
        }
    }

    else if((*input=='a')||(*input=='A')) // 원리는 같다.
    for(j=0; j<3; j++)
    {
        {
            for(i=0; i<4; i++)
            {
                if(plate[i][j]==plate[i][j+1])
                {
                    plate[i][j]*=2;
                    plate[i][j+1]=0;
                }
            }
        }
    }

    else if((*input=='d')||(*input=='D')) // 원리는 같다.
    for(j=3; j>0; j--)
    {
        {
            for(i=3; i>=0; i--)
            {
                if(plate[i][j]==plate[i][j-1])
                {
                    plate[i][j]*=2;
                    plate[i][j-1]=0;
                }
            }
        }
    }
}

void move(int (*plate)[4], char *input) // 이동 방향으로 수들을 모조리 몰아넣기 위한 함수
{
    int i, j, k;

    if((*input=='w')||(*input=='W'))
    for(k=0; k<10; k++) // 충분히 여러번 반복해서 완전히 몰아넣게 하기 위함
    for(i=0; i<3; i++)
    {
        {
            for(j=0; j<4; j++)
            {
                if(plate[i][j]==0)
                {
                    plate[i][j]=plate[i+1][j];
                    plate[i+1][j]=0;
                }
            }
        }
    }

    else if((*input=='s')||(*input=='S'))
    for(k=0; k<10; k++)
    for(i=3; i>0; i--)
    {
        {
            for(j=3; j>=0; j--)
            {
                if(plate[i][j]==0)
                {
                    plate[i][j]=plate[i-1][j];
                    plate[i-1][j]=0;
                }
            }
        }
    }

    else if((*input=='a')||(*input=='A'))
    for(k=0; k<10; k++)
    for(j=0; j<3; j++)
    {
        {
            for(i=0; i<4; i++)
            {
                if(plate[i][j]==0)
                {
                    plate[i][j]=plate[i][j+1];
                    plate[i][j+1]=0;
                }
            }
        }
    }

    else if((*input=='d')||(*input=='D'))
    for(k=0; k<10; k++)
    for(j=3; j>0; j--)
    {
        {
            for(i=3; i>=0; i--)
            {
                if(plate[i][j]==0)
                {
                    plate[i][j]=plate[i][j-1];
                    plate[i][j-1]=0;
                }
            }
        }
    }
}

void main()
{
    int plate[4][4]={0};
    int before[4][4]={0};

    int i, j, width, vertical, count=0, first=0, finish=0;

    char input;

    srand((unsigned)time(NULL));

            width=rand()%4;
            vertical=rand()%4;


    printf("Welcome to the 2048 game.\n\n");
    printf("coded by 김성보\n\n");
    printf("w : up,   s : down,   a : left,   d : right,   b : back\n\n");
    printf("Please press any key to start\n\n\n");

    scanf("%c", &input);
    fflush(stdin);
    system("cls");

restart:


    for(i=0; i<4; i++)
        for(j=0; j<4; j++)
            plate[i][j] = 0;
    plate[width][vertical]=2; // 맨 처음 시작할 때 아무 칸에서나 랜덤하게 2가 생겨나게 하기 위함

    while(1)
    {
        for(i=0; i<4; i++)
        {
            for(j=0; j<4; j++)
            {
                if(plate[i][j]!=0)
                {
                        printf("[%5d]", plate[i][j]);
                }
            
                else
                    printf("[     ]");
            }
            printf("\n\n\n\n\n");
        }

        input = getch();
        fflush(stdin);
        system("cls");

        for(i=0; i<3; i++)
        {
            for(j=0; j<=3; j++)
            {
                if(plate[i][j]==plate[i+1][j]) // 세로로 같은 숫자가 서로 붙어있는 경우가 하나라도 있으면 finish=1
                    finish=1;
            }
        }

        for(j=0; j<3; j++)
        {
            for(i=0; i<=3; i++)
            {
                if(plate[i][j]==plate[i][j+1]) // 가로로 같은 숫자가 서로 붙어있는 경우가 하나라도 있으면 finish=1
                    finish=1;
            }
        }

        for(i=0; i<4; i++)
        {
            for(j=0; j<4; j++)
            {
                if(plate[i][j]==0) // 한 칸이라도 비어있으면 finish=1
                    finish=1;
            }
        }
    
        if(finish==0) // 같은 숫자가 서로 붙어있는 경우가 아얘 없거나, 비어있는 칸도 없어서 더 이상의 게임 진행이 불가능한 경우
            break;

        finish=0;

        if(input=='w'||input=='W'||input=='a'||input=='A'||input=='s'||input=='S'||input=='d'||input=='D')
        {
            count=0;
            first=1;

            for(i=0; i<4; i++)
            {
                for(j=0; j<4; j++)
                {
                    before[i][j]=plate[i][j];
                }
            }

            move(plate, &input);
            plus(plate, &input);
            move(plate, &input);


            for(i=0; i<4; i++)
            {
                for(j=0; j<4; j++)
                {
                    if(before[i][j]!=plate[i][j]) // 바로 전의 칸과 현재의 칸이 완벽히 같은지를 구별하기 위함
                        count=1;
                }
            }

            if(count==0)
                goto end;

            
            width=rand()%4;
            vertical=rand()%4;

            for(i=0; i<4; i++)
                        {
                            for(j=0; j<4; j++)
                            {
                                if(plate[i][j]==0)
                                    count=1;
                            }
                        }

            if(count==1)
            while(1)
                {
                    if(plate[width][vertical]==0)
                    {
                        plate[width][vertical]=2;
                        break;
                    }    

                    width=rand()%4;
                    vertical=rand()%4;
                }
end:
            count=0;
    }
        else if(input=='b'||input=='B')
        {
            if(first==0)
                printf("맨 처음에는 뒤로 갈 수 없습니다!\n\n");

            else if(count!=1)
            for(i=0; i<4; i++)
            {
                for(j=0; j<4; j++)
                {
                    plate[i][j]=before[i][j];
                    before[i][j]=0;
                }
            }
            else
                printf("뒤로가기는 바로 전의 상태로밖에 돌아갈 수 없습니다.\n\n");

            count=1;
        }
    }

    system("cls");
    for(i=0; i<4; i++)
        {
            for(j=0; j<4; j++)
            {
                printf("[%5d]", plate[i][j]);
            }

            printf("\n\n\n\n\n");
        }

    printf("\n\nGAME OVER\n\n");
    printf("r : restart,   e : exit game");
    scanf("%c", &input);

    while(1)
    {
        if(input=='r'||input=='R')
        {
            system("cls");
            goto restart;
        }
        else if(input=='e'||input=='E')
        {
            system("cls");
            break;
        }
    }
}




// 진짜 과제하러 갈게요

0 XDK (+0)

  1. 유익한 글을 읽었다면 작성자에게 XDK를 선물하세요.