using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace ShootingGame
{
// 미사일 클래스
public class Bullet
{
public int x;
public int y;
public bool fire;
}
// 플레이어 클래스
public class Player
{
[DllImport("msvcrt.dll")]
static extern int _getch(); //c언어 함수 가져옴
public int playerX; //플레이어 X좌표
public int playerY; //플레이어 Y좌표
public Bullet[] playerBullet = new Bullet[20];
public Player() //생성자 -> 생성자는 반환값이 없음. -> 초기화등에 이용
{
//플레이어 좌표위치 초기화
playerX = 0;
playerY = 12;
//미사일 초기화
for(int i = 0; i < 20; i ++)
{
playerBullet[i] = new Bullet();
playerBullet[i].x = 0;
playerBullet[i].y = 0;
playerBullet[i].fire = false;
}
}
public void GameMain()
{
//키를 입력하는 부분
KeyControl();
//플레이어를 그려준다
PlayerDraw();
}
void KeyControl() //키를 입력하는 부분
{
int pressKey; //정수형 변수선언 키값 받을거임
if(Console.KeyAvailable) //키가 눌렸을때 true
{
pressKey = _getch(); //아스키값 왼쪽 오른쪽
switch(pressKey)
{
case 72:
//위쪽방향 아스키코드
playerY--;
if(playerY < 1) playerY = 1;
break;
case 75:
//왼쪽 화살표키
playerX--;
if (playerX < 0) playerX = 0;
break;
case 77:
//오른쪽
playerX++;
if (playerX > 75) playerX = 75;
break;
case 80:
//아래
playerY++;
if (playerY > 23) playerY = 23;
break;
case 32:
//스페이스바 누르면 총알 발사
for(int i = 0; i < 20; i++)
{
//미사일이 false 발사 가능
if (playerBullet[i].fire == false)
{
playerBullet[i].fire = true;
//* 질문1.
//플레이어 앞에서 미사일 쏘기 +5
playerBullet[i].x = playerX + 5;
playerBullet[i].y = playerY + 1;
break;
}
}
break;
}
}
}
//미사일 그리기
public void BulletDraw()
{
string bullet = "->"; //미사일 모습
//20개
for(int i = 0; i < 20; i++)
{
//미사일이 살아있는 상태
if (playerBullet[i].fire == true)
{
//좌표설정 -> 중간위치를 위해 보정을 위해 x - 1 (굳이 안해줘도됨)
Console.SetCursorPosition(playerBullet[i].x - 1, playerBullet[i].y);
//총알 출력
Console.Write(bullet);
playerBullet[i].x++; //미사일 오른쪽으로 날라가기
if (playerBullet[i].x > 79) //오른쪽화면을 넘어가면
{
playerBullet[i].fire = false; //미사일 false 다시 준비상태
}
}
}
}
public void PlayerDraw() //플레이어 그리기
{
string[] player = new string[] //배열 문자열로 그리기
{
"->",
">>>",
"->"
};
for(int i = 0; i < player.Length; i++)
{
//콘솔좌표 설정 플레이어X 플레이어Y
//* 질문2.
Console.SetCursorPosition(playerX, playerY + i);
//문자열배열 출력
Console.WriteLine(player[i]);
}
}
//충돌처리
public void ClachEnemyAndBullet(Enemy enemy)
{
//미사일 20개
for(int i = 0; i < 20; i++)
{
//살아있는 미사일
if (playerBullet[i].fire == true)
{
//미사일과 적의 y값이 같을때
if (playerBullet[i].y == enemy.enemyY)
{
if (playerBullet[i].x >= (enemy.enemyX - 1)
&& playerBullet[i].x <= (enemy.enemyX+1)) //충돌
{
//충돌
Random rand = new Random();
enemy.enemyX = 75;
enemy.enemyY = rand.Next(2, 22);
playerBullet[i].fire = false; //미사일도 발사 준비
}
}
}
}
}
}
// 적 클래스
public class Enemy
{
public int enemyX; //X좌표
public int enemyY; //Y좌표
public Enemy()
{
//적 좌표 위치 초기화
enemyX = 77;
enemyY = 12;
}
public void EnemyDraw() //적그리기
{
string enemy = "<-0->"; //문자열로 표현
Console.SetCursorPosition(enemyX, enemyY);//좌표설정
Console.Write(enemy);
}
public void EnemyMove()
{
Random rand = new Random(); //랜덤
enemyX--; //왼쪽으로 움직임
if(enemyX < 2) //화면 왼쪽넘어가면 새로 좌표잡아라
{
enemyX = 77; //좌표 77
enemyY = rand.Next(2, 22);
}
}
}
internal class Program
{
static void Main(string[] args)
{
Player player = new Player(); //플레이어 생성
Enemy enemy = new Enemy(); //적생성
//유니티처럼 속도 프레임속도
int dwTime = Environment.TickCount; //1/1000 초 계산값이 들어온다.
while(true) //무한반복
{
//0.05초 지연
if(dwTime + 50 < Environment.TickCount)
{
//현재시간 셋팅
dwTime = Environment.TickCount;
Console.Clear();
//플레이어
player.BulletDraw();
player.GameMain();
//적
enemy.EnemyDraw();
enemy.EnemyMove();
//충돌처리
player.ClachEnemyAndBullet(enemy);
}
}
}
}
}
728x90
'프로그래밍 > 콘솔프로젝트' 카테고리의 다른 글
공의 이동 (0) | 2023.07.11 |
---|---|
공 벽 튕기기 (0) | 2023.07.11 |
TextRpgGame <최종> (0) | 2023.07.11 |
TextRpgGame Ver.2 (0) | 2023.07.04 |
TextRpgGame Ver.1 (0) | 2023.06.29 |