목록전체 글 (58)
시작은 0부터
지뢰찾기는 어느정도 만들었다. 현재 구현하지 못한 부분은 깃발 꽂기와 근처 8방향 기준으로 지뢰가 없는 블록을 클릭했을 때 주변에 지뢰가 없는 0 블록들이 한번에 드러나는 기능이다. 깃발 꽂기는 금방 만들 수 있을 것 같은데 문제는 0블록을 퍼지게 만드는 것이다. 플레이어가 블록을 클릭했을 때 0인 블록들이 전부 드러나버리면 클릭한 위치와 상관없이 모든 0블록이 드러나면 안되고 클릭한 위치를 기준으로 확장이 되어야 하는데, 이를 구현하려면 재귀함수를 써야한다는 동기의 조언을 들었다. 재귀함수 : 함수가 자기자신을 호출하는 것. 함수 A 가 호출되면 함수 A 안에서 값을 받은 것들로 코드를 처리하고 나온 결과값을 다시 자기 자신에게 넣어 호출하는 것이다. 이 개념만 알고 막상 써보려고 하니 자꾸 스택오버플..
필드(Field) : 멤버변수로 클래스 또는 클래스의 객체 상태를 저장하는 곳. 클래스 범위를 '필드'라고 쓴다고 한다. ex) Class A = new Class(); // 클래스 생성 Class A; // 클래스 정의만 하고 메모리를 새로 생성하지 않은 상태. 생성자 : 클래스를 생성하면 기본으로 생성되는 객체이다. 클래스 내부에 객체를 별도로 선언하지 않으면 어셈블리(Assembly) : 컴파일을 통해 나온 결과 파일. 교재에서 internal 접근제한자에 대한 설명으로 쓰였는데, 범위를 표현할 때 이 단어가 쓰일 경우 '프로젝트 내에서 사용가능'이라고 생각하면 된다. This : 내부에서 자기 자신을 가리킬 때 쓰인다고 한다. 이게 쓰이는 경우는 동기 왈 외부에서 변수를 불러들여올 때 내부의 변수..
클래스의 개념에 대해 배우고 그것을 실제로 응용하여 게임을 만들어보고 있다. 클래스는 붕어빵 틀이고 객체는 그 붕어빵 틀로 찍어낸 붕어빵이다. 객체를 생성할 때는 클래스 객체이름(클래스명) = new 클래스(); 식을 사용한다. new 는 새로운 메모리 할당을 의미하니 여기서 생성된 객체는 클래스의 한 종류이긴 하지만 엄연히 클래스와는 다르다는 것을 숙지해야한다. 이걸 자꾸 혼동해서 클래스 안에서 다른 클래스를 불러올 때, 객체를 생성하는 코드를 쓰고 그 객체의 값을 불러오면서 왜 클래스의 값이 바뀌지 않는지 이해하지 못하는 착각을 하게됐다. 그리고 클래스를 배열로 사용할 때는 각 배열마다 new 클래스를 선언해줘야한다. 클래스 배열은 다음과 같다. 클래스[ ] 클래스이름 = new 클래스[개수]; 이 ..
이번 수업때는 어릴적 구형 게임기에서 많이 해봤던 지렁이게임을 직접 만들어 보았다. 교수님이 설명하시면 그렇구나 하면서도 처음부터 혼자서 코드를 짜라고 하면 바로바로 구조가 생각나지 않고 어디서부터 해야할지 막막한 감이 오는 것이 아직 제대로 이해하지못했음을 스스로 체감하게 하는 것 같다. 화면 안에서 플레이어가 입력받은 방향키에 따라 움직이고 아이템을 먹는 구조 까지는 교수님께서 직접 코드 설계를 보여주시면서 진행했다. 이후 그 코드를 가지고 아이템을 먹을 때마다 플레이어를 뒤따라오는 꼬리를 생성하는 것을 과제로 내주셨다. 이전 시간에 진행했던 슈팅게임보다 쉽다고 하셨는데 전혀 모르겠다. 클래스 구조는 슈팅게임과 거의 흡사하다. 1.GameLoop 클래스 internal class GameLoop { ..
함수를 호출할 때 Get 과 Set 이라는 용어를 쓴다. 각 뜻의 차이는 다음과 같다. Get : 함수 외부에서 함수 내부 값을 가져오는 것. 가령 A라는 함수 안에 int a = 1 라고 선언되어있을 때, 함수 안에 a 값을 가져온다면 1인 a값을 그대로 가져오는 것이다. Class A { int a; public int GetA() { return a; } } ▲ 함수가 GetA 함수가 호출되면 A 클래스 안에 있는 a를 반환한다. Set : 함수 외부에서 함수 내부에 값을 입력하는 것. 가령 함수를 호출하는 부분에서 a값을 넣으면 함수에서 입력받은 a를 받아와서 처리한다. void 일 경우 반환값이 없기 때문에 입력받기만 하고, return이 있을 경우 입력값을 받아 대입하여 얻은 결과값을 반환한다..
화면 위쪽에서 적들이 균일하게 떨어지게 하는 방법은 구현했고, 적들이 같은 Y값 안에서 무작위로 출현하게 하는 방법도 구현했다. 그러나 동시에 적들이 서로 다른 Y값에서 동시에 떨어지게 하는 방법은 여전히 구현하지 못했다. 교수님께서는 코드를 클래스화하여 구현하라고 하셨는데, 클래스화를 하기 전에 구현 조차 하지 못했다.. 2차원 배열을 사용하여 x값과 y값을 설정했다. 2차원 배열 구조는 쉼표( , ) 를 기준으로 오른쪽 값이 최대값으로 도달할 때 마다 왼쪽 값이 하나씩 증가되는 구조이기 때문에 첫번째 값이 Y, 두번째 값을 X로 하는 것이 구조적으로 맞다. x값은 리스트를 사용하여 그 리스트에 랜덤함수를 사용하여 X축 범위 내 랜덤값을 랜덤하게 부여하는 방식으로 Y값에 랜덤한 적을 넣는 것까지는 구현..
while문을 돌리고 그 안에 SetCursorPosition로 적의 위치, 플레이어 위치를 찍으면서 출력하고 Clear로 콘솔창을 계속 지우면서 그리는 방법을 사용했었다. 그러나 while문 안에 DateTime.Now.Ticks 함수를 이용하여 딜레이를 주더라도 Clear를 사용하면 화면이 깜빡거리는 문제가 불가피했고, 그 깜빡거리는 정도를 개선하기 위해서는 Clear를 사용하지 않는 방법을 찾았다. (혼자 찾기 보다는 동기의 조언을 통해서 알게 되었다.) Console.SetCursorPosition(0,0) 으로 Console.Clear 를 대체하기 : while문 안에 SetCursorPosition(0, 0)을 한번만 넣으면 Clear를 사용하지 않더라도 반복문이 돌 때 동안 화면이 포인트 지..
DateTime.Now.Ticks : 현재 시간의 틱을 가져오는 함수다. 틱은 천만분의 1초인데 이 틱을 가져와서 원하는 딜레이(코드 안에서는 1000이 1초로 작용해서 60프레임을 설정하고 싶다면 1000/60으로 코드를 작성한다)값을 설정하고, 설정한 딜레이값보다 작으면 continue 함수를 통해 딜레이값을 충족할 때 까지 for문을 돌려 딜레이를 만든다. 그러다 원하는 딜레이값을 충족하면 동일한 딜레이를 계속 반복해서 주어야하기 때문에 설정값을 충족한 틱값을 이전틱값에 부여한다. 그리고 틱값에 이전틱값을 뺀 값과 딜레이값을 비교하면, 딜레이값을 충족할 때 마다 틱값 - 이전틱값(=틱값) = 0 이 되어 틱값이 동일한 간격으로 초기화되는 방식이다. System.Environment.TickCount..