본문 바로가기

728x90

전체 글

(53)
[게임개발/C#] 타일형 랜덤맵 배열 섞기. 피셔-예이츠 셔플. # 목표 예를 들어 10*10 크기의 타일형 랜덤맵을 만들 것입니다. 그 중 20개의 타일에 벽을 배치해야할 것입니다. 이 때 사용할 수 있는 방법으로 tile[0,0] ~ tile[9,9]까지 100개의 타일을 무작위로 섞어 20개를 뽑아 벽 타일로 정해줄 수 있습니다. 이렇게 배열 (유한 수열)이 있을 때 골고루 섞어주는 방법으로 피셔-예이츠 셔플(The Fisher-Yates Shuffle)을 사용하는 방법을 알아보겠습니다. # 피셔-예이츠 셔플 피셔-예이츠 셔플은 기존의 순열에서 무작위로 하나의 수를 뽑아 새로운 수열에 뽑은 순서대로 놓는 방식입니다. 이렇게 뽑은 랜덤 수열은 매 번 뽑을 때마다 어느 한 쪽으로 편향되지 않고 골고루 나온다는 장점이 있습니다. # 코드 예제 public static..
[게임개발] 타일형 랜덤맵에서 고립된 공간 만들지 않기. Flood Fill 활용. # 목표 타일형 랜덤 맵을 만들기 위해서 빈 타일을 미리 깔아놓고, 랜덤 한 좌표에 일정 갯수의 벽 타일을 생성하는 방법을 사용합니다. 이럴 때 아래의 오른쪽 그림과 같이 벽 타일로 둘러쌓여서 고립된 공간이 생기기 마련입니다. 이 고립된 공간이 생기지 않도록 하는 방법을 알아보겠습니다. # Flood Fill 알고리즘 플러드 필 알고리즘은 다차원 배열에서 연결된 영역(공간)을 찾는 알고리즘입니다. 그림판에서 사각형을 그려놓고 픽셀로 둘러쌓여진 곳 안에 연결된 부분에 모두 색칠하는 방법으로 사용하는 것이 대표적입니다. 모서리 방향을 연결된 것으로 볼 것이냐 아니냐에 따라 4방향 탐색, 8방향 탐색이 있습니다. 오른쪽 아래에 위치한 타일에서 시작했을 경우 녹색 타일은 연결되어 있는 영역입니다. 빨간색 타일은..
[유니티] 게임 패널에 GUI 띄우기 유니티로 게임 개발을 하다보면 특정한 상황을 반복적으로 실행해서 테스트를 해야하는 경우가 많습니다. 예를 들면 캐릭터가 죽었을 때 재시작 버튼을 띄운다던가, 다시 시작지점으로 돌아가게 한다던가 하는 후속 처리가 있습니다. 이 기능들이 제대로 작동하는지 테스트하려면 캐릭터를 반복적으로 죽여야 합니다. 하지만 직접 캐릭터를 죽음의 상황에 처하도록 컨트롤하는 것은 시간낭비가 많습니다. 그래서 유니티에서는 게임 패널에 UI버튼을 추가하여 스크립트를 실행할 수 있도록 도와주고 있습니다. 예를 들어 캐릭터가 적에게 맞아 체력이 0 이하로 내려가면 die() 함수가 실행됩니다. 그럴 때 간단히 UI 버튼을 눌러 die()함수가 실행되도록 하는 것입니다. 가장 간단하게 구현하는 방법은 다음과 같습니다. private ..
[게임개발/C#] 맵에디터 랜덤 맵 생성 관련 시드값 설정하기 마인크래프트나 문명같이 맵을 랜덤하게 생성해주는 게임에서 랜덤 맵을 생성할 때 시드값 (Seed) 이라는 것이 있어 시드값을 똑같이 입력하면 랜덤 맵일지라도 똑같게 만들어진 맵에서 플레이할 수 있습니다. 이 것을 구현하기 위한 Random 클래스 사용방법입니다. - 기본적인 랜덤 값 생성 방법입니다. Random rand = new Random(); int num = rand.Next(); Console.WriteLine(num); 출력 결과 1499166260 ( 0 이상 Int32.MaxValue 미만의 정수 값 ) 이렇게 실행하면 매 번 실행할 때마다 랜덤한 값을 얻을 수 있습니다. - 시드를 활용한 랜덤 값 생성 방법입니다. // 먼저 seed로 사용할 랜덤값을 구합니다. Random randSe..
[네트워크/C#] SocketAsyncEventArgs를 이용한 비동기 TCP 통신 # SocketAsyncEventArgs 클래스 SocketAsyncEventArgs 클래스는 비동기 소켓 통신을 할 때 송신과 수신 자체 작업을 담당하는 클래스입니다. Socket 통신을 하기 때문에 Socket이고, 비동기로 작업을 하기 때문에 Async입니다. 작업을 완료하면 실행되는 완료 콜백 함수를 가질 수 있어 Event이고, Socket 클래스의 비동기 함수에 인수로 들어가기 때문에 Args라고 생각하시면 좋겠습니다. Socket 클래스의 함수 중 뒤에 Async가 붙는 함수들은 모두 public bool ***Async(SocketAsyncEventArgs e); 의 형태로 선언되어 있습니다. 그래서 SocketAsyncEventArgs를 활용한 비동기 통신을 할 때의 대략적인 순서는 So..
[안드로이드] SQLite 처음 사용해보기 - 안드로이드 스튜디오에서 프로젝트를 생성합니다. - 생성 한 후 run 'app'을 눌러 한 번은 실행해야 테스트가 잘 작동합니다. - 위도우키 + R 을 눌러 실행창을 연 후 'cmd' 실행하여 프롬프트 창을 엽니다. - adb.exe 의 위치를 찾아갑니다. > cd C:\Users\USER-PC\AppData\Local\Android\Sdk\platform-tools * adb (android debug bridge )는 PC에서 스마트폰과 통신하기 위한 프로그램입니다. > dir adb.exe 현재 폴더(디렉터리)에서 adb.exe를 보여줍니다. - adb 를 관리자 권한으로 실행한 후 > adb root - shell을 실행하여 AVD에 진입합니다. > adb shell shell에 진입하면 명..
[알고리즘] 너비 우선 탐색 Breadth First Search # 문제 설명 아래 그림과 같은 이진트리를 너비 우선 탐색해봅니다. 간선의 정보를 입력받아 처리합니다. 인접 리스트를 이용합니다. queue 자료구조를 직접 구현합니다. 너비 우선 탐색은 시작 노드부터 인접한 노드들을 모두 우선 방문하는 방식의 탐색 방법입니다. 시작 노드인 노드1을 방문 한 후 노드1에 인접한 노드2, 노드3을 방문합니다. 노드2에 인접한 노드4, 노드5를 방문합니다. 노드3에 인접한 노드6, 노드7을 방문합니다. 노드4는 인접한 노드가 없으므로 끝입니다. 노드5 ~ 노드7은 노드4와 같습니다. 다르게 이야기하면 시작 노드부터 간선 한 번에 인접한 노드들을 순회하고, 간선 두 번에 인접한 노드들을 순회하고, 간석 세 번에 인접한 노드들을 순회하는 방식으로 볼 수 있습니다. # 입출력 예..
[C] 자료 구조 # 단일 연결 리스트 Single Linked List # 연결 리스트 각 노드가 데이터와 다음 노드를 가리킬 포인터를 가지고 한 줄로 연결되어 있는 방식의 자료 구조입니다. - 배열과 다른 점 세 개의 데이터가 있는 배열[3]이 있다면 배열[0]부터 배열[2]까지 메모리의 연속된 곳에 자리하게 됩니다. 연결리스트는 각 노드가 각자 생성될 때 할당받은 다른 메모리 주소를 갖습니다. 그래서 다음 노드의 주소를 가리키는 포인터가 필요한 것입니다. - 장단점 데이터의 추가 삭제가 빠릅니다. 시간복잡도 O(1) 특정 위치의 데이터 검색이 오래걸립니다. 시간복잡도 O(n) - 노드 Node 노드에는 각종 데이터 변수와 다음 노드를 가리킬 포인터 변수가 필요합니다. 따라서 여러가지 타입의 집합체인 구조체로 정의합니다. struct Node{// 노드 이름 int val..
[네트워크/C#] .NET TCP/IP 네트워크 기초 # IPAdress 클래스 네트워크에 기본적으로 사용되는 식별자로 IP 주소 - IPAddress 클래스로 관리합니다. 도메인 - Dns 클래스로 관리합니다. 포트번호 - IPEndPoint 클래스로 관리합니다. 가 있습니다. 그 중 IPAddress 클래스의 간단한 기능들입니다. using System.Net; // 문자열 ip주소를 저장합니다. IPAddress ip = IPAddress.Parse("192.168.0.1"); Console.WriteLine(ip.ToString()); // ip주소를 byte배열로 변환합니다. byte[] buff = ip.GetAddressBytes(); Console.WriteLine(buff.Length); // ipv4 주소를 ipv6로 변환합니다. IPAd..
[안드로이드] 간단한 갤러리 앱 만들기 # 간단한 포토샵 기능 안드로이드 스튜디오에서 구현할 수 있는 간단한 갤러리 앱입니다. # 준비물 갤러리 내용으로 사용할 이미지 대략 10개 # activity_main.xml 메인 액티비티의 화면을 구성합니다. 위치: project\app\res\layout // 갤러리 이미지들을 격자로 배치합니다. # dialog.xml 클릭 이미지가 보여질 액티비티의 화면을 구성합니다. 위치: project\app\res\layout 에서 신규 생성합니다. // 갤러리에서 클릭한 이미지가 이 곳에서 // 크게 보일 것입니다. # MainActivity.java 메인 액티비티의 기능을 구현합니다. 위치: project\app\java\"프로젝트명"\ 에 있습니다. package com.sikuroku.p11_1_ga..
[C#] 자주 사용하는 문자열 관련 함수 # 문자열 함수 리스트 함수와 서식 설명 PadLeft(10) 문자열의 길이를 10으로 만들면서 좌측에 공백 만들기 PadRight(15) 문자열의 길이를 15로 만들면서 우측에 공백 만들기 IndexOf("대상 문자열") 가장 먼저 나오는 대상 문자열의 첫 번째 인덱스를 리턴합니다. 없으면 -1 리턴. LastIndexOf("대상 문자열") 가장 마지막에 나오는 대상 문자열의 첫 번째 인덱스를 리턴합니다. 없으면 -1 리턴. IndexOfAny( 문자 배열 ) 문자 배열에 있는 문자를 발견하면 그 인덱스를 리턴합니다. Substring(2, 3) 문자열 2번 인덱스에서부터 3개 문자를 리턴합니다. Contains("x") 문자열 "x"가 포함되어 있으면 true을 리턴합니다. StartsWith("y"..
[C++] 컨테이너 어댑터 Stack 컨테이너 어댑터란? 기존 컨테이너의 기능을 제한하거나 변형한 컨테이너를 만들어줍니다. STL의 컨테이너 어댑터 종류. 컨테이너 어댑터 설명 스택 ( stack) LIFO ( Last In First Out ) 나중에 삽입된 요소가 먼저 반환됩니다. 큐 (queue) FIFO ( First In First Out ) 먼저 삽입된 요소가 먼저 반환됩니다. 우선순위 큐 (Priority queue) 우선 순위가 높은 요소를 먼저 반환합니다. # stack의 멤버 함수 멤버 함수 설명 push(x) stack의 상단에 값 x를가진 요소를 추가한다. pop() stack 상단의 요소를 제거한다. top() stack 상단 요소의 값을 읽어 레퍼런스로 리턴한다. size() stack의 사이즈를 리턴합니다. emp..

728x90