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 |