주제 : C#으로 구현하는 A Star Algorithm

개발환경 : Visual Studio 2010

사용언어 : C#



또다시 일주일만에 글을 씁니다.


일주일만에 대략적인 알고리즘을 구현하였습니다.


2주일이 걸렸습니다.


기타 부수적인 것들은 천천히 할려고 합니다.


3탄 글에서 만든 것에서 또 많은 변화가 있었습니다.


1. 어떻게 하면 클래스 관계를 깔끔하게 처리할 수 있을까?

2. 에이스타 알고리즘에 필요한 opennode와 closednode를 어떻게 해야 하나?


이 두 개 때문에 많은 변화가 생겼고 시간 또한 오래 잡아먹었습니다.


클래스 관계는 이래저래 생각해본 결과

Board 클래스를 static으로 하는것보다는 CellGroup에 상속 시키는게 나은거 같아 변경하였고

그에 따라 부수적으로 Cell, CellGroup 클래스의 변경도 뒤따랐습니다.

물론, 변경 이외에도 보강도 하였습니다.


두 번째로 opennode와 closednode를 어떻게 해야하나 에서 많이 시간을 잡아먹었습니다.


내가 만들어 쓰자니 귀찮고

C#에 딱 알맞는 게 있나 보니 없었고

그러다가 찾은 PowerCollections 라이브러리를 발견하여

오! 여기에 있겠는데!! 하다가 시간만 날려먹었습니다. ㅡㅡ;

결국 제가 만들어 쓰기로 하였습니다.

그래도 이 프로젝트에 PowerCollections의 Pair은 적합하다고 판단하여

소스를 또... ㅡㅡ; 전면적으로 수정하였습니다.


그러고 오늘 드디어 대략적인 구현이 끝났습니다.


설명을 쓰자니.. 주석에 써논걸 또 쓰는거 같아

자잘한 기능까지 구현이 끝나면 그냥 파일을 통째로 올리겠습니다.

나름 주석을 잘 달았거든요..


클래스 관계도




실행 화면

이거 그냥 동영상 올리기 하니깐 화질이 구리더라구요..

유투브나 이런데 올리고 링크를 퍼오는 법을 배워야겠습니다..



Posted by 투명테잎

주제 : C#으로 구현하는 A Star Algorithm

개발환경 : Microsoft Visual Studio 2010

사용언어 : C#



3~7일차 작업 내용 : 알고리즘을 구현하기 위한 준비를 끝냄


- 3일차 : 폭풍 LOL로 인한 작업 fail...


- 4 ~ 5일차 : 어느정도 진척은 있었으나 전에 구현하던것과 충돌이 나거나, 수정할 것이 많아

                 수정하는데 많은 시간을 보냄


- 6일차 : 폭풍 LOL..   그래도 전반적인 준비 끝.. 자잘한 버그 발견


- 7일차 : 버그 수정, 오늘까지 만든 파일들에 주석 작성



알고리즘을 구현하기 위한 준비라고 해봤자,


기본적인 마우스, 키보드 이벤트 처리가 다였다.


C#으로 처음 만드는 프로그램이지만, 기본적으로 MFC와 비스무리하여


크게 어려움은 없었다.


2일차때 만든 Board.cs에도 대대적인 수정이 있었으며


새롭게 세 가지 클래스 파일을 만들었다.


BrushedAndPens.cs : 프로그램 전반에 사용되는 브러시와 펜을 모아논 클래스

Cell.cs : Board위에 그려지는 Cell에 대한 정보 클래스

CellGroup.cs : Cell들의 집합체


이고 현재까지 만든 클래스들의 관계도를 살펴보면 다음과 같다.





만약, 이 글을 읽으시는 분이 있다면.

위 클래스 파일을 보실 때는


1. Board.cs

2. Cell.cs

3. CellGroup.cs


BrushesAndPens.cs : 별개


순으로 읽으시기 바랍니다.


파일은 이 글들이 다 끝나면 프로그램을 배포하는 글에서 다운 받으 실 수 있을 것입니다.


여기까지가 지난 5일 간의 작업 내용이며


중간에 Board 클래스를 static을 사용해 상속도 아니고 포함도 아닌 그냥 사용하도록 만들었고


깔끔하게 만들기 위해 BrushesAndPens라는 클래스를 만들어 모든 펜과 브러시에 대한 정보를 집어 넣었습니다.


막상 글을 쓰니 5일동안 한게 없어 보이지만.. 실제로도 별로 없네요. 하..


끝으로 오늘까지 만든 프로그램의 실행화면을 동영상으로 찍었습니다.


실행화면




Posted by 투명테잎
C#/기본문법2012. 4. 8. 09:55

C#에서 2차원배열과 동적으로 2차원배열을 만드는 법을 작성하겠습니다.


C#에서는 C/C++과는 다르게 변수를 사용해서 배열을 만들 수 있다.

먼저, 정적 2차원배열을 만드는법입니다.


using System;

public class DateTimeTest
{
    public static void Main()
    {
        int a = 5, b = 6;
        int[,] c = new int[a, b];
        for (int i = 0; i < a; ++i)
        {
            for (int j = 0; j < b; ++j)
            {
                c[i,j] = i + j;
                Console.Write(c[i,j] + "   ");
            }
            Console.WriteLine();
        }
    }
}


int[.] c를 생성하는데 있어 두 인덱스 모두를 변수로 사용할 수 있습니다.

이건 C/C++에서는 사용할 수 없었던 부분입니다.

더 편리하다고 느껴집니다.



동적 2차원배열은 제네릭 컬렉션을 사용해서 해결할 수 있다.

동적 2차원배열은 다음과 같이 생길 수 있습니다.


O O O

O O O O O

O O

O O O O


위의 그림과 같이 2차원 배열이지만 각 행 마다 크기가 다른 배열이다.

이런 류는 다음과 같이 Collections.Generic의 List<T>를 사용하여 해결 할 수 있습니다.


using System;
using System.Collections.Generic;

public class DateTimeTest
{
    public static void Main()
    {
        int a = 5, b = 6;
        List<int[]> c = new List<int[]>();
        for (int i = 0; i < a; ++i)
        {
            c.Add(new int[i + b]);
            for (int j = 0; j < i + b; ++j)
            {
                c[i][j] = i + j;

                Console.Write(c[i][j] + "   ");
            }
            Console.WriteLine();
        }
    }
}


처음과 두번째 예제의 차이점은 배열을 인덱싱하는 데에서 차이가 있습니다.

첫번째 예의 정적 2차원배열은 [i, j]와 같이 콤마로 인덱싱해야 하지만

List<>를 사용한 동적 2차원배열은 [i][j]와 같이 인덱싱해줘야합니다.

Posted by 투명테잎