Tic-Tac-Toe AI 작성

Posted 2009. 2. 23. 23:32 by 카메란


예전에 우연찮게 접하게 된 게임트리(Game Tree)란 용어.
그리고 미니맥스(Mini Max), 알파-베타 가지치기(alpha-beta pruning)
그 당시에는 대충 무슨 것인지 알고 있었는데 구현을 할 줄 몰랐다.

그 이후에도 몇 번 책에서 보긴 했는데,
자세한 설명이 없어서(사실 내가 노력하지 않은 것 일수도)
실제적인 구현을 해 보지 못했는데,
최근에 좋은 자료를 우연치 않게 얻어서..
다시 공부하게 되었다.

자료를 보내 주신 분께 다시 한번 감사의 말씀을-ㅋ

자료는 장기 AI 를 짜는 것(MFC 기반)이었는데,
UI 구현 하기도 귀찮고 해서..
Tic-Tac-Toe로 결정..

언어는 제일 자신 있는 JAVA로
UI는 SWT로 구현..

시간 남으면 알고리즘을 정리 해봐야...
그리고 이번엔 오델로 AI 를 짜봐야..ㅋ

실행하려면 첨부된 zip 풀고
jar 파일 실행시키면 끝
     java -jar TTCAI.jar



(그림 파일을 jar 파일 안에 넣어서 실행하면 좋은데
할 줄 몰라서-.-)




Tag : Ai, alpha-beta pruning, Game Tree, minimax, tic-tac-toe, 게임트리, 미니맥스, 알파베타 가지치기, 인공지능

  1. 올망

    | 2009.03.27 02:37 신고 | PERMALINK | EDIT | REPLY |

    헐,, 알파베타......미니맥스...틱텍토..= ㅁ=;;
    스웨덴에서 AI 시간에 배운것들이군(...)

    이번에 우리학교꺼 AI 수업듣는데,,
    우리학교에선 뉴런네트워크배우더라 ㅇ ㅅㅇ;

    그건 그렇고,
    나 자바좀 알려줘= ㅁ=...
    왠지 진짜 써본지 오래된거같아.....................

  2. 카메란

    | 2009.03.29 11:39 신고 | PERMALINK | EDIT | REPLY |

    으흠 뉴런 네턱이라;;;
    ....


    자바야=.=
    뭐 그냥 하면 되는거;;ㅋ

Write your message and submit

SyntaxHighlighter + Tistory

Posted 2008. 12. 28. 22:34 by 카메란

프로그래밍 관련 포스팅을 할 때마다,
코드를 보기 좋게 삽입할 방법을 몰라서 그냥 table tag 를 써서 해 왔는데
보기가 좋지 않아서 늘 맘에 걸렸다.

그러다가 얼마전에 어느 블로그에서 코드가 예쁘게 써져 있는 것을 보고
찾아보니깐
SyntaxHighlighter 라는 것을 써서 올린 것 이었다.

SyntaxHighlighter 홈페이지

티스토리에 설치하는 방법은
구글이나 네이버에서 찾아 보면 많이 나오므로 생략하고 검색링크로 대체.
syntaxhighlighter + tistory


테스트 코드




Tag : syntaxhighlighter, Tistory, 코드, 프로그래밍

Write your message and submit

Eclipse 에서 @override 에서 에러 날 때

Posted 2008. 11. 23. 14:41 by 카메란

언제부터인가

Eclipse 에서  @override 에서 에러 마커가 떴다..

분명히 그 전부터 멀쩡히 에러 마커가 안 뜬 소스였다..



구글링을 해보니

Java 5.0까지는 @override를

interface 의 method를 implement 할 때  사용 못하는데,

6.0 부터는 위의 경우에도 사용할 수 있다는 것이었다..


그러자 생각난 것이,

얼마전에

[Window] - [Preference] 에서

Java- Compiler 에서

Compiler compliance level 을  1.5 로 바꾼것이 생각 났다..

그래서 이걸 다시 1.6으로 바꿨더니,

에러가 사라졌다...


아래는 수정한 부분..

사용자 삽입 이미지





Tag : Eclipse, Override

  1. | 2012.09.13 14:03 | PERMALINK | EDIT | REPLY |

    항상 이걸로 고생했는데, 따라해보니 잘되네요 감사합니다!

  2. 비비

    | 2012.10.11 17:13 | PERMALINK | EDIT | REPLY |

    감사함당!

Write your message and submit

SWT. CONTROL의 pack()

Posted 2008. 3. 28. 00:15 by 카메란

Wizard 를 만들던 중에

user의 의해

wizardPage의 화면을 변경하고자 했다..


그래서

user의 행동에 따라서 widget은 추가 했는데,

화면에는 변화가 보이지 않았다.

그래서 redraw() 를 불렀는데

별 변화가 없었고,

언제나 그렇지만.....

구글로~~~~


그렇게 해 본 결과

pack() 란 method를 알게 되었다.

api를 찾아 보니..

receiver가 preferred size에 맞게 resize 하도록 한다고 되어있다.


그래서

이것을 부르면

화면에 변경 사항이 반영 되는 것이다.


관련 예제 코드는 아래에 첨부



위의 코드를 실행시키면

창 하나에 버튼 하나가 나온다.

위의 코드의 shell.pack() 줄을 주석 처리 하면

버튼을 눌러도 label이 추가가 되는 것을 확인 할 수 없다..

하지만 주석 처리를 하지 않으면

버튼 누를 때마다 label이 추가 되는 것을 볼 수 있다.



Tag : swt, 이클립스

Write your message and submit

SWT - moveAbove, moveBelow

Posted 2008. 2. 9. 22:12 by 카메란
SWT로 작업하던 중에

label 에 image 를 불러와서 화면에 배치하던 중에

여러개의 label 이 겹치게 되는 경우가 발생하게 되었다..

그런데 default 대로 작업하다 보니 내가 원하는 순서가 아닌 대로

배치가 되었다..

그래서 이러한 배치 순서를 바꾸는 방법을 찾던 중에//

역시나 API 를 보고 해결 방법을 찾게 되었다.


일단 예제 코드


위 예제 코드를 실행시켜 보면

창에

각각 TEST1, TEST2 란 text 를 갖고 있는

label 2개가 생긴다..

그리고 TEST1 아래에 TEST2가 잘려서

보이는 것을 알 수 있다..


여기서 TEST2를 TEST1 위에 보이게

즉 label2 가 label1 위에 배치되게 하고 싶다면 방법은 간단하다.


label2.setSize(100, 100) 과

shell.open() 사이에

label2.moveAbove(label1);

이란 줄을 삽입하면 된다..

(혹은 label1.moveBelow(label2);)


method 명에서도 쉽게 유추 할 수 있듯이,

'label2 를 label1 위로 움직여라'

라는 코드 인 것이다..

(괄호 안에는 반대로 label1을 label2 아래로 움직여라)


한 라인을 삽입하고 실행시켜 보면

원하는 결과를 얻을 수 있다.




Tag : ECLIPSE SWT, Java, moveAbove, moveBelow

Write your message and submit

RequestConstants (org.eclipse.gef.RequestConstants)의 field

Posted 2008. 1. 10. 20:33 by 카메란

GEF 에서
사용자의 변경 요청이
Request 형태로 넘어오는 데 이러한 요청 들이
RequestConstants의 정해진 field에 맞게 type을 셋팅 한다.

대표적인(내가 써본) RequestConstants 의 field 를 보면
REQ_CREATE, REQ_RESIZE_CHILDREN, REQ_MOVE_CHILDREN
등....

그리고 최근에 잘 쓴 건 REQ_OPEN...

차례 대로 보면

REQ_CREATE
             Object 가 생성 될 때.
REQ_RESIZE_CHILDREN
             a group of children 의 사이즈 변경
REQ_MOVE_CHILDREn
             a group of children 의 이동
REQ_OPEN
             receiver에 user 가 mouse  double-click 할 때



여기서 REQ_OPEN 의 경우..
GEF 프로그래밍 하다보면 마우스 처리 할 때
mouse listener 를 사용 하여 double-click을 처리하려고 하면
mousePressed(MouseEvent e) 만 불리는 경우가 있는데 ,
이것은 mousePressed~ 가 불리고 나서 다른 리스너로 이벤트가 넘어가기 때문이다.

따라서 이 때 mouse listener를 사용하지 말고

해당 모델과 관련된 editpart 에서


로 처리하면 된다





Tag : ECLIPSE GEF, MOUSE DOUBLE CLICK, Request

Write your message and submit

draw2d-버튼추가

Posted 2008. 1. 6. 20:41 by 카메란
draw2D 예제.

버튼 하나 추가하기.

코드는 아래와 같다.



위에서부터 보면

Display 를 보면,

java doc 를 보면
http://help.eclipse.org/stable/nftopic/org.eclipse.platform.doc.isv
/reference/api/org/eclipse/swt/widgets/Display.html
 
Display 가 SWT 와 os 사이의 커넥션을 관리하는 역할을 한다고 나와있다.

그 다음에는 Shell
http://help.eclipse.org/stable/nftopic/org.eclipse.platform.doc.isv
/reference/api/org/eclipse/swt/widgets/Shell.html

shell instances 가 desktop이나 "window manager" 가 관리하고 있는
"windows"를 나타낸다고 한다는 듯...

그리고 LightweightSystem
이것도 api 보면
http://help.eclipse.org/help31/topic/org.eclipse.draw2d.doc.isv/
reference/api/org/eclipse/draw2d/LightweightSystem.html

SWT 랑 draw2d 사이의 링크라는 듯.

그 다음엔

이제 전체적인 순서 보면

Display, Shell, LightweightSystem 등을 만들고
버튼 만들고 Figure 하나 만들고
버튼을 figure 에 추가하고
figure 를  LightweightSystem 를 추가한다.
그 다음에 shell 을 open한다

그 다음 3 줄은 이벤트들을 처리하는 부분
shell 이 dispose 되기 전까지 dispatch 를 하는 부분.ㅋ




Tag : Draw2d, swt

Write your message and submit

사용자가 정의한 Class 와 관련된 Transfer 만들기

Posted 2007. 11. 21. 22:13 by 카메란
Transfer 만들기(SWT)

/*
1. SWT 는 http://www.eclipse.org/swt 에서
 2. SWT라고 분류는 해놨지만 GEF editor에다가다 붙여도 되는듯.
*/

드래그 앤 드랍 기능을 구현하는데 제공되는 Transfer는

TextTransfer
FileTransfer
HTMLTransfer

등등이 있다.

여기서 사용자가 정의한 클래스를 Transfer 하고 싶다면

org.eclipse.swt.dnd.ByteArrayTransfer를 상속받아서

구현하면 된다

먼저 API 를 보면

하나의 예시 코드가 있다

http://help.eclipse.org/stable/nftopic/org.eclipse.
platform.doc.isv/reference/api/org/eclipse/swt/dnd/ByteArrayTransfer.html


String, long  타입의 변수들을 필드로 갖는 MyType class 를 사용한 코드이다.

여기서는, String, long,  타입 뿐만 아니라

java.util.ArrayList 등등을 필드로 갖는 class를 transfer 시키는

Transfer를 만들겠다.

일단 전송시킬 class 를 정의해보자
이제 Transfer.

org.eclipse.swt.dnd.ByteArrayTransfer를 상속받아야 한다.

member field 부터 보면,


이제 getTypeIds(), getTypeNames(),  getInstance().

다음에는 javaToNative(Object object, TransferData transferData).
br />여기서 예제와 바뀐 점이 있는데,

첫번째로,
 
예제에서는 object instanceof MyType[] 즉.. 배열에 대한 instance 인지를 체크한 반면

여기서는  object instanceof MyClass , 즉, 배열이 아니다.

그리고 예제에서는 DataOutputStream을 쓴 반면에

여기서는 List(Object)를 내보내기 위해서  ObjectOutputStream을 사용하였다.

이 메소드를 보면

MyClass 멤버들을 타입에 맞게 ObjectOutputStream을 사용해서 write를 한다
예를 보면

String은 길이를 writeInt를 써서 write 하고 다음에 string을 byte array로 바꾼후에 write한다

int, boolean은 각각 writeInt, writeBoolean 으로

ArrayList(Object)는 writeObject를 사용한다

그리고 마지막으로 bout의 toByteArray한 결과를 사용해서

ByteArrayTransfer의 javaToNative를 콜한다.


다음은 nativeToJava(TransferData transferData).

여기서도 마찬가지로

예제와 다르게

DataInputStream 대신에 ObjectInputStream을 사용했고

배열을 사용하지 않았다.


여기서도 방법은 javaToNative와 비슷하게

멤버 필드의 타입마다 다른 read method로 불러다가 새로운 MyClass object에다가

각 멤버 필드에 대입한 후에 그 object를 리턴한다.

string은 write했던 방법을 생각해서

먼저 길이를 읽어다가 그 길이만큼 바이트 배열을 읽으면 되고,

int, boolean 은 각각 readInt, readBoolean을 사용하고

ArrayList(Object)는 readObject를 사용한다.


이렇게 하면 Transfer 완성이다.

최종 MyClassTransfer 는 다음과 같다.

추가적으로 말하면..

이 코드는 만든 다른 Transfer 코드를 수정해서 만들고

사정이 있어서 직접 테스트를 못해봤다......ㅠㅠ





Tag : DnD, Eclipse, swt

Write your message and submit

Eclipse GEF 란 무엇인가??

Posted 2007. 11. 3. 21:58 by 카메란
지금 쓰는 것은 거의 대부분
일본 사이트
http://www13.plala.or.jp/observe/
바탕으로 쓴 것이다.


1. GEF(Graphical Editing Framework)?

  말그대로 framework. 그래픽 쪽을 다루기 위한 framework. 모델을 그래픽적으로 다룰 때 쓰는 것.
기본적으로는 MVC(Model - View - Controller) 체제에 맞추어져 있다. 어떠한 정보들은 Model이 갖고 있고, 그것을 화면에 보여주는 역할을 하는 것은 View 쪽에서, 관리하는 것은 Controller 쪽에서 하는 형식이다
 각 부분별로 다음 부터 보자.

2. Model

  GEF 에서의 Model 은 기본적으로 Object 형으로 처리한다. 그리고 모델은 항상 최상위 모델의 child 관계로 존재해야 한다. 예를 들면 최상위 모델을 보여주는 화면의 배경이라고 하면, 모든 모델은 이 배경의 child 로 존재해야 하는 것이다.
  또한, Model의 변경을 Controller 에 알려주기 위해서 Listener를 구현할 필요가 있다.

3. View

  GEF 에서의 View 는 GEF에 포함되어 있는 draw2d 나 SWT 를 사용해서 구현한다.

4. Controller
  GEF에서는 controller 부분을 EditPart 를 사용해서 구현한다. Contoller는 기본적으로 Model 과 View를 관리하는 역할을 하기 때문에 이와 관련된 부분이 존재한다. 그 중에 하나는 Model과 Controller를 연결하는 EditPartFactory이다. 또한, EditPolicy라는 것이 있는다. 이것은 EditPart에 install 되어서, Command(org.eclipse.gef.commands.command)를 이용해서 EditPart의 동작을 결정한다.
  Controller에서 하는 일들을 대략적으로 설명하면, user에 의해 model 의 변경이 요청이 들어온다. 이러한 요청은 Request(org.eclipse.gef.Request) 형태로 처리가 된다. 그러면 이러한 Request 형태를 갖고, EditPart는 자신에게 install 되어 있는 EditPolicy를 검토한다. EditPolicy중에 적합한 EditPolicy 를 선택하고, 이 EditPolicy 과 command(org.eclipse.gef.commands.command) 형태로 변경 명령을 내리면, model 변경이 반영되는 것이다.



Tag : Eclipse, gef

Write your message and submit

Eclipse GEF 설치 하기!!

Posted 2007. 10. 31. 00:32 by 카메란

1. GEF 란 무엇인가

 순서대로야 하려면 GEF 가 무엇인지 부터 해야 제대로 겠지만

 사정이 있어서 그건 다음으로 미루고

 단순히 GEF 는 Graphical Editing Framework 의 약자라는 것만 봐두고

 다음 기회로...

2. GEF 설치하기

 그럼 본격적으로 들어가기 전에

 공식 사이트는 http://www.eclipse.org/gef 이다.


 사이트를 들어가면

 첫 페이지에 바로 Downloads가 바로 보인다

 GEF Downloads 를 클릭하면

 GEF 버젼에 따라 다운로드 링크가 sort 되어 있다.

 자신의 Eclipse 버젼에 맞게

 GEF 버젼을 골라서

 SDK 와 Example 모두 있는

 ALL Version 을 다운 받자.


         본인의 경우에는
        
         Eclipse version이 3.3 이므로,

         GEF 3.3 ALL version DOWN!!

 다운 받으면 압축 파일 하나인데..

 이것을 적당한 곳에 압축 풀자!!!

 
 그 다음에 이제는 이클립스 화면으로..

 이클립스 메뉴에서

    [Help] - [Software Updates] - [Find and Install]  선택
 
    Search for new features to install 선택한 후에 Next

    New Local Site 를 선택하여서

    압축을 푼 폴더를 선택한 후, OK 버튼

    Fininsh 버튼
   
   그 다음에 아래와 같은 페이지가 뜨면, 체크를 아래와 같이 해준후에
 
   Next





이 거 다음에는 적절히 라이센스 동의 해주면 설치 끝나는 듯..

(사실 이 부분도 원래 자세히 썼었는데.. '예기치 못한' 오류로 익스플로러가 종료되면서

사라져 버렸다..

그 이후로 의욕 상실...)


3. Example 살펴 보기

그렇게 설치가 끝나면

이제 예제를 살펴 보자.~

예제를 실행시키려면

eclipse 에서 [File] - [ New] - [Other..] 를 선택하면

이제 Examples라는 항목이 있을 것이고..

그 하위 항목으로 GEF 가 있을 것이다..

그 아래에서 마음에 드는 예제 고르고

파일명 적절히 써주고 위치 정한다음에 Finish 버튼 클릭하면

창이 하나 뜨면서 GEF 예제를 테스트 할 수 있을 것이다...

아래 화면은 Flow Diagram 예제이다.







--------

캡쳐를 한 게 이상해서 캡쳐 화면이 이상하게 보이네요...;;;

사실 이거 한 번 쓰다가 날려 먹어서..

처음에 썼던 것 보다 약간 성의가 부족한 것 같네요... 이런이런...




Write your message and submit