목록분류 전체보기 (58)
시작은 0부터
콘솔 RPG 만들기를 진행하면서 프로젝트 안에 여러 개의 클래스를 나누고, 각 클래스마다 특정 함수들이 각각 서로 다른 클래스들을 오가면서 참조하고 값을 넣고 하다보니 참조를 제대로 하지 못하는 문제가 발생했고, 처음에 이를 해결하기 위해 외부 클래스에서 사용을 하는 모든 멤버변수들을 전부 다 스태틱으로 바꿔버렸다. 그리고 해당 클래스 내부의 변수값을 가져올 때는 생성자를 통해서 가져오는 것이 아닌 클래스 자체의 값을 가져오는 식으로 가져왔다. 모든 변수를 스태틱으로 만들고 게임을 실행하다보니 처음에는 잘 되는 것 같다가 거의 다 완성이 되갈 때 쯤 제대로 작동하지 않는 문제가 생겼다. 클래스 a, b, c, d 가 있고 메인 함수가 있는 프로그램에서 모든 클래스의 변수를 사용하는 a의 생성자를 생성했는..
클래스를 다중으로 쓰다보면 클래스 내부 변수들을 선언할 때 그 변수의 범용성에 따라 접근제한자를 고민하여 사용한다. 클래스 외부에서 해당 변수를 참조하거나 값을 넣기 위해서는 해당 변수에 대한 접근권한이 있어야하고, 이를 위해 클래스 내부 변수의 접근제한자를 public으로 하여 외부에서 접근이 가능하도록 할 경우, 상황에 따라 접근을 원치 않을 때에도 의도치 않게 접근이 되어버리는 문제가 발생할 수 있다. 이러한 문제를 방지하기 위해, 변수의 접근성을 설정하는 기능이 '프로퍼티'다. 프로퍼티(Property) : 변수에 접근하는 두 가지 경우, 외부에서 읽어들일 수 있는 '읽기(Get)'와 외부에서 값을 써넣을 수 있는 '쓰기(Set)'를 제어하는 기능이다. public int a { get; set;..
구조체(Struct) : 멤버변수를 정의하는 데이터 형식. 클래스와 유사하지만 클래스와 달리 구조체를 생성하는 것으로, 클래스와 비슷한 개념인 것 같다. 클래스 개념을 이해할 때 클래스란 붕어빵을 찍어내는 붕어빵 '틀'로 이해했다. Class bread { int a; int b; string c; } 빵이라는 클래스 틀을 만들고 그 안에 멤버변수 a, b, c 를 생성하고, 빵 클래스 틀을 활용하여 빵 클래스를 만들면 그 클래스 고유 이름을 선언하고 생성한다. Bread honeybutterbread = new Bread(); honeybutterbread.a = 1; honeybutterbread.b = 2; honeybutterbread.c = 3; 빵 클래스로부터 꿀버터빵(?)이라는 생성자를 통해..
지뢰찾기까지 모든 과제를 마치고 콘솔RPG를 시작하려는 찰나 교수님께서 달팽이형식 만들기를 다시 시키셨다. 이전에 만든 코드보다 더 간결하게 만들 것을 제안하셨는데, 기존에 방식보다 더 간단한 코드를 예전에 동기형이 보여준 사이트에서 얼추 기억하고 있던 것이 있었다. 2차원 배열 0, 0에서 시작해서 방향을 설정하는 함수 -1를 지정하고 상하좌우 방향을 두번 꺾을 때 마다 *1을 해주어 양수로 만들어서 X++(우측이동) Y++(아래이동) , X--(좌측이동) Y--(위로이동) 을 반복하는 구조로 for문 두개로 만들어진 상당히 가벼운 코드였다. 얼추 기억하는 것은 이정도 뿐이라 이 정보를 바탕으로 두개의 for문으로 코드를 짜보려고 했는데 생각처럼 되지 않는다. 이전에 만들었을 때도 약간 이상한 방법으로..
1차원배열에 장애물이 낙하할 x값을 랜덤하게 넣어 동일한 Y값에 일렬로 낙하하는 것은 구현했었다. 그런데 장애물이 한줄로만 떨어지는 것이 아닌 동시다발적으로 계속해서 떨어지는 것은 구현하지 못했었다. 그래서 지뢰찾기를 다 끝내고 이전에 제대로 끝내지 못했던 지렁이게임과 레이싱게임을 다시 손봤다. 지렁이게임은 비교적 순조롭게 수정했다. 간혹 2P의 캐릭터 꼬리가 증가되지 않는 현상이 있었는데 코드를 잘 들여다보니 2P가 아닌 1P의 증가로 되어있어 그러한 오류가 생겼었고, 꼬리끼리 부딪혀도 죽도록 만들었는데 상대방의 꼬리에 부딪히지도 않았는데 죽었다는 판정이 떠서 왜 그런가 했더니 충돌판정을 딜레이 안에 넣지 않아서 프레임이 갱신되기도 전에 충돌판정이 되어 랜더로 이미지를 출력했을 때는 부딪히지 않았지만 ..
오늘 수업중에 지뢰찾기의 모든 기능을 완벽하게 구현한줄 알았는데 동기가 문제를 발견했다. 지뢰찾기 게임에는 세 가지의 버튼이 있다. 마우스 왼쪽 : 블록 열기, 마우스 오른쪽 : 깃발 꽂기, 마우스 왼쪽+오른쪽 : 열린 블록의 숫자와 닫힌 블록과 깃발을 비교해서 닫힌 블록보다 숫자가 크거나, 또는 숫자가 주변 8방향의 깃발수보다 작거나 같은 경우에 자동으로 열리는 것이다. 그리고 이때, 지뢰가 아닌 곳에 깃발을 꽂아두었다면 바로 게임오버가 된다. 동기의 코드를 보고 원리를 이해하여 0블록을 클릭시 주변 0블록이 열리는 코드를 구현하고, 다 끝났다 싶었는데 개인적으로 지뢰찾기의 핵심이라고 생각하는 마우스 좌우 동시 클릭기능을 구현해야 진정한 지뢰찾기 게임의 완성이라고 생각하여 코드를 작성했다. 잘 되는줄 ..
enum : 열거형을 나타내는 데이터형. enum A { a, b, c, d, e } 열거형 A 안에 a, b, c, d, e라는 이름을 각각 만들면, 해당 이름들에 값을 넣지 않더라도 사용할 수 있다. 또한 자동으로 열거형 안에서 왼쪽에서부터 0부터 순서가 매겨진다. enum 값을 그대로 출력하면 이름이 나타나고 정수형 데이터로 변환하면 순서가 나타난다. interface : 기능 구현을 위해서 변수를 지정해 놓는 클래스. 클래스와 구조가 유사하지만 정의만 한다는 특징이 있다. 보통 인터페이스 클래스를 사용할 때는 클래스 이름 앞에 I를 써넣어 구분한다고 한다. 또 다른 클래스와의 차이점은 클래스는 다른 클래스를 상속 받을 때 1개의 클래스만 상속받을 수 있고 다중 상속이 불가능하지만 인터페이스 클래스..
1 2 3 8 9 4 7 6 5 ▲ 배열을 위 그림처럼 달팽이 모양으로 순서대로 큰값을 넣는 것이 과제였다. 달팽이 모양 순서로 어떻게 집어넣을지를 생각해보다가 바로 이전에 진행했던 지뢰찾기 게임을 만들 때 주변에 폭탄개수를 새는 원리를 생각해보게 되었다. 가장 먼저 입력받은 정사각형 배열의 크기에서 가운데 위치에다 큰 값을 지정한다. 정사각형의 가운데 위치값은 짝수, 홀수에 따라 두가지의 경우만 존재한다. 홀수의 경우 입력값을 2로 나눈 값을 각각의 X 와 Y의 값에 넣으면 정확하게 가운데 위치에 최대값이 입력된다. 최대값은 2차원 배열의 길이 값을 넣었다. [3, 3] 의 2차원 배열을 만들면 배열의 길이는 9이고 결국 그 길이가 최대값이기 때문이다. 가운데를 2로 나누었을 때 정확하게 가운데로 나오..