본문 바로가기
프로그래밍/콘솔프로젝트

공 튕기기

by SUGI_ 2023. 7. 12.
namespace BrickGame6
{
    public class BALLDATA
    {
        public int nReady;  //준비 공을 움직일지 안움직일지
        public int nX, nY;  //좌표
        public int nDirect; //방향
    }
}
namespace BrickGame6
{
    public class Ball
    {
        BALLDATA m_tBall = new BALLDATA();

        //C#공의 방향 배열 정의
        int[,] g_WallCollision = new int[4, 6]
        {
            {  3 , 2,-1,-1,-1, 4},
            { -1 ,-1,-1,-1, 2, 1},
            { -1 , 5, 4,-1,-1,-1},
            { -1 ,-1, 1, 0, 5,-1},
        };

        public void gotoxy(int x, int y)
        {
            Console.SetCursorPosition(x, y);
        }

        public void ScreenWall()
        {
            gotoxy(0, 0);
            Console.Write("┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓");
            gotoxy(0, 1);
            Console.Write("┃                                                                             ┃");
            gotoxy(0,2);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 3);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 4);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 5);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 6);
            Console.Write("┃                                                                             ┃");
            gotoxy(0,7);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 8);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 9);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 10);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 11);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 12);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 13);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 14);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 15);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 16);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 17);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 18);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 19);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 20);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 21);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 22);
            Console.Write("┃                                                                             ┃");
            gotoxy(0, 23);
            Console.Write("┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛");
        }

        public void KeyInput() 
        {
            int nKey;

            if(Console.KeyAvailable)
            {
                nKey = Program._getch();
                switch(nKey)
                {
                    case '0':
                        m_tBall.nDirect = 0;
                        m_tBall.nX = 30;
                        m_tBall.nY = 10;
                        break;
                    case '1':
                        m_tBall.nDirect = 1;
                        m_tBall.nX = 30;
                        m_tBall.nY = 10;
                        break;
                    case '2':
                        m_tBall.nDirect = 2;
                        m_tBall.nX = 30;
                        m_tBall.nY = 10;
                        break;
                    case '3':
                        m_tBall.nDirect = 3;
                        m_tBall.nX = 30;
                        m_tBall.nY = 10;
                        break;
                    case '4':
                        m_tBall.nDirect = 4;
                        m_tBall.nX = 30;
                        m_tBall.nY = 10;
                        break;
                    case '5':
                        m_tBall.nDirect = 5;
                        m_tBall.nX = 30;
                        m_tBall.nY = 10;
                        break;
                    case 'f':
                        m_tBall.nReady = 0;
                        break;
                    case 'r':
                        m_tBall.nReady = 1;
                        m_tBall.nX = 30;
                        m_tBall.nY = 10;
                        break;
                }
            }
        }

        //벽과 충돌시 상태변환 
        public int Collision(int x, int y)
        {
            if(y ==0)
            {
                m_tBall.nDirect = g_WallCollision[0,m_tBall.nDirect];
                return 1; //공의 방향이 바뀌면 1을 리턴  
            }

            if(x ==1)
            {
                m_tBall.nDirect = g_WallCollision[1, m_tBall.nDirect];
                return 1;
            }

            if( x ==  77)
            {
                m_tBall.nDirect = g_WallCollision[2,m_tBall.nDirect];
                return 1;
            }

            if(y == 23)
            {
                m_tBall.nDirect = g_WallCollision[3, m_tBall.nDirect];
                return 1;
            }

            return 0; //공의 방향이 바뀌지 않으면 0 리턴
        }

        public void Initialize() 
        {
            m_tBall.nReady = 1; //공안움직임 1 움직임 0
            m_tBall.nDirect = 0;
            m_tBall.nX = 30;
            m_tBall.nY = 10;
        
        }
        public void Progress() {

            KeyInput();


            if(m_tBall.nReady == 0)
            {
                //공의 방향에따른 스위치문
                switch(m_tBall.nDirect)
                {
                    case 0: //위
                        if (Collision(m_tBall.nX, m_tBall.nY-1) == 0)
                            m_tBall.nY--; 
                        break;
                    case 1:  //오른쪽 위
                        if(Collision(m_tBall.nX +1, m_tBall.nY -1) == 0)
                        {
                            m_tBall.nX++;
                            m_tBall.nY--;
                        }
                        break;
                    case 2: //오른쪽 아래
                        if(Collision(m_tBall.nX+1, m_tBall.nY+1) == 0)
                        {
                            m_tBall.nX++;
                            m_tBall.nY++;
                        }
                        break;
                    case 3: //아래
                        if (Collision(m_tBall.nX, m_tBall.nY + 1) == 0)
                            m_tBall.nY++;
                        break;
                    case 4: //왼쪽 아래
                        if(Collision(m_tBall.nX-1,m_tBall.nY+1) ==0)
                        {
                            m_tBall.nX--;
                            m_tBall.nY++;
                        }
                        break;
                    case 5://왼쪽 위
                        if(Collision(m_tBall.nX-1 ,m_tBall.nY -1)==0)
                        {
                            m_tBall.nX--;
                            m_tBall.nY--;
                        }
                        break;
                }
            }
        }
        public void Render() {
            ScreenWall();

            gotoxy(m_tBall.nX,m_tBall.nY);
            Console.Write("●");
        
        }
        public void Release() { }
    }
}
namespace BrickGame6
{
    public class Program
    {
        [DllImport("msvcrt.dll")]
        public static extern int _getch();  //c언어 함수 가져옴

        static void Main(string[] args)
        {
            Ball ball = new Ball();//객체생성

            int Curr = Environment.TickCount;

            ball.Initialize();

            while (true) { 
            
                if(Curr + 50 < Environment.TickCount)
                {
                    Curr = Environment.TickCount;

                    Console.Clear();
                    ball.Progress();
                    ball.Render();
                }           
            }
            ball.Release();
        }
    }
}
728x90

'프로그래밍 > 콘솔프로젝트' 카테고리의 다른 글

BrickGame <최종>  (0) 2023.07.13
벽돌 중복없이 만들기  (0) 2023.07.12
Ball Bar로 잡기  (0) 2023.07.11
공의 이동  (0) 2023.07.11
공 벽 튕기기  (0) 2023.07.11