27
LỜI NÓI ĐẦU Nói đến CNTT là chúng ta hình dung ngay tới một môi trường phát triển năng động vào bậc nhất trên toàn thế giới hiện nay. Nó được ứng dụng vào mọi mặt của đời sống của con người, từ công việc cho tới giải trí. Cùng với sự phát triển vượt bậc của CNTT, con người đã cho ra đời rất nhiều sản phẩm mang tính giải trí mạnh mẽ và hấp dẫn, tuy nhiên những chương trình nhỏ mang tính trí tuệ vẫn chiếm một thị phần nào đó trong lĩnh vực này. Một trong những chương trình đó phải kể tới là các chương trình chơi cờ, đại diện là “Trò chơi cờ Caro”. Cờ Caro được khá nhiều người ưa thích vì tính đơn giản của trò chơi nhưng bản thân lại mang tính trí tuệ khá cao. Chương trình được viết bằng ngôn ngữ Java, là một ngôn ngữ có khả năng tương tác khá mạnh với những công cụ sẵn có giúp cho người lập trình phát triển ứng dụng cực nhanh và thuận tiện Bản thân là một sinh viên trong điều kiện thực tế công việc, kinh nghiệm lập trình chưa có nhiều , quá trình thực hiện việc viết chương trình cũng như kỹ năng còn nhiều hạn chế. Tuy vậy được sự giúp đỡ tận tình của thầy hướng dẫn cũng như các bạn sinh viên trong lớp. Em đã cố gắng thực

BC Mon JAVA - Co Caro

Embed Size (px)

Citation preview

Page 1: BC Mon JAVA - Co Caro

LỜI NÓI ĐẦU

Nói đến CNTT là chúng ta hình dung ngay tới một môi trường phát triển năng động

vào bậc nhất trên toàn thế giới hiện nay. Nó được ứng dụng vào mọi mặt của đời sống của

con người, từ công việc cho tới giải trí.

Cùng với sự phát triển vượt bậc của CNTT, con người đã cho ra đời rất nhiều sản

phẩm mang tính giải trí mạnh mẽ và hấp dẫn, tuy nhiên những chương trình nhỏ mang

tính trí tuệ vẫn chiếm một thị phần nào đó trong lĩnh vực này. Một trong những chương

trình đó phải kể tới là các chương trình chơi cờ, đại diện là “Trò chơi cờ Caro”. Cờ Caro

được khá nhiều người ưa thích vì tính đơn giản của trò chơi nhưng bản thân lại mang tính

trí tuệ khá cao.

Chương trình được viết bằng ngôn ngữ Java, là một ngôn ngữ có khả năng tương tác

khá mạnh với những công cụ sẵn có giúp cho người lập trình phát triển ứng dụng cực

nhanh và thuận tiện

Bản thân là một sinh viên trong điều kiện thực tế công việc, kinh nghiệm lập trình

chưa có nhiều , quá trình thực hiện việc viết chương trình cũng như kỹ năng còn nhiều

hạn chế. Tuy vậy được sự giúp đỡ tận tình của thầy hướng dẫn cũng như các bạn sinh

viên trong lớp. Em đã cố gắng thực hiện xong chương trình này. Tuy chương trình chỉ rất

nhỏ và còn nhiều lỗi nhưng nó giúp em có niềm tin để thực hiện nhiều công việc lớn hơn

sau này. Mặc dù đã cố gắng giải quyết bài toán một cách đúng đắn nhất nhưng chắc chắn

vẫn không thể tránh khỏi những thiếu sót. Em thực hiện đề tài này mong muốn nhận được

các ý kiến đóng góp để có thể hoàn thiện hơn nữa chương trình.

Hà Nội, ngày 20 tháng 11 năm 2012

Nhóm sinh viên thực hiện

Page 2: BC Mon JAVA - Co Caro

1. Cơ sở lý thuyết

1.1 Yêu cầu bài toán.

Xây dựng một bàn cờ có kẻ các ô vuông với kích thước 20 x 20. Có 2 quân cờ là X và

O.

Người chơi có thể đánh với máy hoặc 2 người chơi với nhau. Người thắng là người đi

được 5 quân cờ cùng kiểu trên hàng dọc, hàng ngang hoặc đường chéo. Hai người hoà

nhau khi bàn cờ hết chỗ đánh mà vẫn chưa phân được thắng bại.

1.2 Phân tích bài toán.

1.2.1 Mô phỏng bàn cờ

Bàn cờ (Board) bao gồm các ô cờ (Cells) được đặt trong một mảng 2 chiều (kích

thước a x b)

Trong mỗi Cell có thể xác định được:

Vị trí cell ( Row, collumme)

Trạng thái Cell (Status) Bao gồm đang trống (empty) nước đi của đối thủ

(Player) hoặc nước đi của máy (Com)

Độ nguy hiểm của ô cờ tuỳ theo trạng thái Cell và có thể thay đổi được.

1.2.2 Đánh giá giá trị Cell.

Giống như trong thực tế, người chơi thường đánh giá một số nước cờ là

nguy hiểm, bình thường hoặc ít nguy hiểm, máy tính cũng đánh giá nhưng cụ thể

hơn bằng các con số.

1.3 Phương pháp giải quyết bài toán.

1.3.1 Tìm kiếm nước đi, không gian tìm kiếm.

Trong trò chơi Caro, cứ sau mỗi nước cờ, mỗi đối thủ sẽ chọn ra từ những ô trống

để đi, do đó, sau 1 mỗi nước đi thì số ô trống còn lại sẽ giảm. Như vậy, việc tìm nước đi

tiếp theo cho trạng thái có sẵn chỉ là việc tìm kiếm những ô trống còn lại, đồng thời,

không gian tìm kiếm sẽ thu hẹp theo số nước đi đã tạo.

Không gian chọn nước đi từ mỗi trạng thái ban đầu là hữu hạn, nhưng không gian

tìm kiếm 1 nước đi dẫn đến chiến thắng là rất lớn. Do đó ta không thể vét sạch không gian

tìm kiếm nước đi này mà ta phải giới hạn không gian tìm kiếm.

Page 3: BC Mon JAVA - Co Caro

Một không gian tìm kiếm có thể hiện theo 1 cây đa phân và đuợc gọi là cây tìm

kiếm hay cây trò chơi.

Ví dụ:

Dựa vào cái cây trò chơi đã định nghĩa ở trên, việc tìm kiếm nước đi là chọn

1 nút trên cây (ở mức 1) sao cho nước đó là tốt. Theo thông thường khi chơi, một

nước đi tốt hay không là phụ thuộc vào khả năng dành chiến thắng là cao hay thấp

sau khi nước đi này đuợc đi. Do đó, muốn chọn 1 nước đi tốt thì nếu chỉ dựa vào

thế cờ hiện tại là chưa đủ, mà phải biết thông tin của những thế cờ sau khi chọn

nước này để đi.

Page 4: BC Mon JAVA - Co Caro

1.3.2 Giải thuật Minimax.

1.3.2.1 Chiến lược Minimax để tìm kiếm nước đi

Chiến lược này được xác định bằng cách xet giá trị MINIMAX đối với mỗi nút

trong cây biểu diễn trò chơi.

MAX chọn nước đi ứng với giá trị MINIMAX cực đại (để đạt được giátrị cực đại

của hàm mục tiêu) đạt được giá trị cực đại của hàm mục tiêu)

Ngược lại, MIN chọn nước đi ứng với giá trị MINIMAX cực tiểu.

Ví dụ:

Page 5: BC Mon JAVA - Co Caro

1.3.2.2 Giải thuật Minimax:

Giải thuật tìm kiếm MINIMAX vấp phải vấn đề bùng nổ (mức hàm mũ) các khả

năng nước đi cần phải xét → không phù hợp với nhiều bài toán trò chơi thực tế. Chúng ta

có thể cắt tỉa (bỏ đi – không xét đến) một số nhánh tìm kiếm trong cây biểu diễn trò chơi.

1.3.3 Phương pháp cắttỉa α-β (Alpha-beta prunning).

1.3.3.1 Ý tưởng.

Nếu một nhánh tìm kiếm nào đó không thể cải thiện đối với giá trị (hàm tiện ích)

mà chúng ta đã có, thì không cần xét đến nhánh tìm kiếm đó nữa. Việc cắt tỉa các nhánh

tìm kiếm (“tồi”) không ảnh hưởng đến kết quả cuối cùng

α là giá trị của nước đi tốt nhất đối với MAX (giá trị tối đa) tính đến hiện tại đối

với nhánh tìm kiếm. Nếu v là giá trị tồi hơn α, MAX sẽ bỏ qua nước đi ứng với v -> Cắt

tỉa nhánh ứng với v β được định nghĩa tương tự đối với MIN.

Page 6: BC Mon JAVA - Co Caro

Ví dụ :

1.3.3.2 Giải thuật phương pháp cắt tỉa α-β (Alpha-beta prunning).

Page 7: BC Mon JAVA - Co Caro

So sánh số nút phải xét giữa 2 thuật toán Minimax và α-β :

Đối với các trò chơi có không gian trạng thái lớn, thì phương pháp cắt tỉa α-β vẫn

không phù hợp. Không gian tìm kiếm (kết hợp cắt tỉa) vẫn lớn

Có thể hạn chế không gian tìm kiếm bằng cách sử dụng các tri thức cụ thể của bài

toán

+ Tri thức để cho phép đánh giá mỗi trạng thái của trò chơi.

+ Tri thức bổ sung (heuristic) này đóng vai trò tương tự như là hàm ước

lượng h(n) trong giải thuật tìm kiếm A*

Page 8: BC Mon JAVA - Co Caro

2. Xây dựng chương trình:

2.1 Giới thiệu tổng quan chương trình:

Đây là một Game mô tả trò chơi cờ Caro có thể chơi online trên mạng

Internet hoặc offline tại máy tính cá nhân, trò chơi được lập trình bằng ngôn ngữ

Java theo phương pháp hướng đối tượng. Tuy là một Game đã xuất hiện từ lâu

trên thế giới, nhưng ưu điểm của Game Nhóm chúng Tôi thiêt kế đồ họa khá đẹp,

tốc độ Game nhanh, không yêu cầu cấu hình mạnh.

2.2 Kỹ thuật lượng giá.

Kỹ thuật lượng giá là một kỹ thuật quan trọng trong việc xây dựng trò chơi

cở caro. Kĩ thuật này giúp cho điểm trạng thái của bàn cờ để từ đó xây dựng cây

trò chơi. Việc xây dựng hàm lượng giá hợp lý, chính xác sẽ giúp cho hệ thống có

đánh giá chính xác về trạng thái bàn cờ để đưa ra nước đi thông minh hơn.

Đối với bài toán cờ caro, ta có thể dùng 1 hàm lượng giá để đánh giá tính

"tốt, xấu" tại 1 thời điểm. Những ô nào ở gần các quân đã đánh trước sẽ được điểm

cao hơn. Những ô càng xa thì được càng ít điểm. Tuy nhiên đây chỉ là Heuristic

nên ta phải bổ sung thêm các Heuristic khác nữa, ví dụ vùng có 2, 3, 4 ... quân liên

tiếp thì sẽ được cộng thêm 1 số điểm thưởng nào đó cho vùng đó dựa vào trọng số

quân (tức là nhiều quân liên tiếp thì được cộng nhiều điểm thưởng hơn).

Sau mỗi nước đi, hệ thống sẽ kiểm tra bàn cờ tìm các thế cờ đó rồi tùy vào

độ lợi thế đã định trước để tính ra điểm. Cụ thể là:

*TH1: Trường hợp chắc thắng (+5000 điểm)

* TH2: Trường hợp rất thuận lợi (+600 điểm)

* TH3: Trường hợp thuận lợi (+500 điểm)

Page 9: BC Mon JAVA - Co Caro

*TH4: Trường hợp bình thường (+50 điểm)

2.3 Xây dựng chương trình.

2.3.1 CComputer.java

import java.applet.*;import java.awt.*;public class Gomoku extends Applet {

Panel ButtonArea;Button Buttons[];Label MessageLabel;Checkbox Check1,Check2;CGoban Goban;CComputer Computer;int Player[];final int HUMAN = 1;final int COMPUTER = 2;int CurrentPlayer;final int WHITE = 1;final int BLACK = 2;int GameState;final int GS_END = 0;final int GS_PLAYUSER = 1;final int GS_PLAYCOM = 2;final int GS_READY = 3;public void init() {

ButtonArea = new Panel();setLayout(new BorderLayout());add("South",ButtonArea);MessageLabel = new Label("Welcome to Gomoku-Narabe Game !");add("Center",MessageLabel);Goban = new CGoban();add("North",Goban);Buttons = new Button[4];Buttons[0] = new Button("First");Buttons[1] = new Button("Second");Buttons[2] = new Button("Clear");;Buttons[3] = new Button("Check");ButtonArea.setLayout(new FlowLayout());for(int i=0;i<3;i++)

ButtonArea.add(Buttons[i]);Check1 = new Checkbox("Sakiyomi");Check2 = new Checkbox("Kinjite");

Page 10: BC Mon JAVA - Co Caro

ButtonArea.add(Check1);ButtonArea.add(Check2);Check1.setState(true);Check2.setState(true);Goban.Sakiyomi = true;Goban.Kinjite=true;Computer = new CComputer(Goban);Player = new int[3];

}public void start() {

InitGame();}public boolean action(Event e,Object o) {

String label = o.toString();if(e.target instanceof Button){

if(label.equals("First")){StartGame(HUMAN);

} else if (label.equals("Second")) {StartGame(COMPUTER);

} else if (label.equals("Clear")) {InitGame();

}} else if(e.target instanceof Checkbox) {

Goban.Sakiyomi = Check1.getState();Goban.Kinjite = Check2.getState();

}return true;

}void InitGame() {

Goban.Initialize(Computer);Goban.Draw();repaint();GameState = GS_READY;for(int i=0;i<2;i++)

Buttons [i]. enable () ;PutMessage("Click 'First' or 'Second' to start game.");

}void StartGame(int FirstPlayer) {

if(GameState!=GS_READY)return;

Player[BLACK] = FirstPlayer;Player[WHITE] = (FirstPlayer==COMPUTER) ? HUMAN : COMPUTER;CurrentPlayer = BLACK;for(int i=0;i<2;i++)

Buttons [i]. disable () ;

Page 11: BC Mon JAVA - Co Caro

if(FirstPlayer==COMPUTER){Goban.Area[7][7] = 1;PlayComputer();

} else {GameState = GS_PLAYUSER;

}}public boolean mouseDown(Event evt,int x,int y) {

if(GameState==GS_PLAYUSER && Player[CurrentPlayer]==HUMAN) {GPos pos = new GPos();if( !Goban.GetPos(x,y,pos) )

return true;switch(Goban.Check(CurrentPlayer, pos.x, pos.y)) {

case CGoban.GC_OK:CurrentPlayer = (CurrentPlayer == WHITE) ? BLACK : WHITE;if(Player[CurrentPlayer] == COMPUTER){

GameState = GS_PLAYCOM;}break;

case CGoban.GC_ILLEGAL:PutMessage("Illegal postion ! Can't put");break;

case CGoban.GC_CANNOT:PutMessage("Aleady exist! Can't put");break;

case CGoban.GC_FILLED:PutMessage("Board is filled ! Draw game.");GameState = GS_END;break;

case CGoban.GC_WIN:PutMessage("You Win !!!");GameState = GS_END;break;

}}return true;

}public boolean mouseUp(Event evt,int x,int y) {

if(GameState == GS_PLAYCOM){PlayComputer();

}return true;

}void PlayComputer() {

GPos pos = new GPos();PutMessage("Computer now thinking...");

Page 12: BC Mon JAVA - Co Caro

switch(Computer.Think(CurrentPlayer,pos)) {case CComputer.THINK_OK:

PutMessage("It's now your turn.");CurrentPlayer = (CurrentPlayer == WHITE) ? BLACK : WHITE;if(Player[CurrentPlayer] == COMPUTER){

PlayComputer();} else {

GameState = GS_PLAYUSER;}break;

case CComputer.THINK_FILLED:PutMessage("Board is filled ! Draw game.");GameState = GS_END;break;

case CComputer.THINK_WIN:PutMessage("Computer Win !!!");GameState = GS_END;break;

}}public void PutMessage(String s) {

MessageLabel.setText(s);}public void paint(Graphics g) {

Goban.Draw();}

}

2.4.2 Cgoban.java

import java.applet.*;import java.awt.*;public class CGoban extends Canvas {

static final int TOP = 10;static final int LEFT = 10;static final int BOARDSIZE = 15;static final int PIECESIZE = 20;static final int MAXPIECENUM = BOARDSIZE * BOARDSIZE;static final int GC_OK = 0;static final int GC_ILLEGAL = 1;static final int GC_CANNOT= 2;static final int GC_FILLED = 3;static final int GC_WIN = 4;public boolean Sakiyomi;public boolean Kinjite;CPiece Pieces[][];public int Area[][];

Page 13: BC Mon JAVA - Co Caro

static final int AREASIZE = 2;public int numPiece;CComputer Computer;public CGoban() {

resize (310,310) ;Pieces = new CPiece[BOARDSIZE][BOARDSIZE];for(int i=0; i < BOARDSIZE; i++){

for(int j=0; j < BOARDSIZE; j++){Pieces[i][j] = new CPiece();

}}Area = new int[BOARDSIZE][BOARDSIZE];

}public void Initialize(CComputer com) {

Computer = com;for(int x=0; x < BOARDSIZE; x++){

for(int y=0; y < BOARDSIZE; y++){Pieces[x][y].State = CPiece.EMPTY;Area[x][y] = 0;

}}numPiece = 0;

}public void Put(int color,int x,int y) {

if(Pieces[x][y].State == CPiece.EMPTY) {Pieces[x][y].State = color;numPiece++;int x1,x2,y1,y2;x1 = (x-AREASIZE < 0) ? 0 : x-AREASIZE ;x2 = (x+AREASIZE >= BOARDSIZE) ? BOARDSIZE-1 : x+AREASIZE;y1 = (y-AREASIZE < 0) ? 0 : y-AREASIZE ;y2 = (y+AREASIZE >= BOARDSIZE) ? BOARDSIZE-1 : y+AREASIZE;for( ; x1 <= x2; x1++){

for(y = y1 ; y <= y2; y++) {Area[x1][y]++;

}}

}}public void Remove(int x,int y) {

if(Pieces[x][y].State != CPiece.EMPTY) {Pieces[x][y].State = CPiece.EMPTY;numPiece--;int x1,x2,y1,y2;x1 = (x-AREASIZE < 0) ? 0 : x-AREASIZE ;x2 = (x+AREASIZE >= BOARDSIZE) ? BOARDSIZE-1 : x+AREASIZE;y1 = (y-AREASIZE < 0) ? 0 : y-AREASIZE ;

Page 14: BC Mon JAVA - Co Caro

y2 = (y+AREASIZE >= BOARDSIZE) ? BOARDSIZE-1 : y+AREASIZE;for( ; x1 <= x2; x1++){

for( y = y1; y <= y2; y++) {Area[x1][y]--;

}}

}}public int Check(int color,int x,int y) {

int ret;if(Pieces[x][y].State != CPiece.EMPTY)

return GC_CANNOT;Put(color,x,y);ret = Computer.CheckIllegal(color,x,y);if(ret != Computer.ILL_NOT){

Remove(x,y);return GC_ILLEGAL;

}ret = Computer.Find5Block(color,x,y);Draw();if(ret == Computer.OK5)

return GC_WIN;

if(numPiece == MAXPIECENUM)return GC_FILLED;

return GC_OK;}public boolean GetPos(int x,int y,GPos pos) {

if(x < LEFT-(PIECESIZE/2) || x > LEFT+(PIECESIZE*(BOARDSIZE-1))+(PIECESIZE/2) )return false;

if(y < TOP-(PIECESIZE/2) || y > TOP+(PIECESIZE*(BOARDSIZE-1))+(PIECESIZE/2) )return false;

pos.x = ( x-(LEFT-(PIECESIZE/2)) ) / PIECESIZE;pos.y = ( y-(TOP -(PIECESIZE/2)) ) / PIECESIZE;return true;

}public void Draw() {

repaint();}public void paint(Graphics g) {

int x,y;g.setColor(Color.black);for(x = 0; x < BOARDSIZE; x++) {

g.drawLine(x*PIECESIZE+LEFT,TOP,x*PIECESIZE+LEFT,TOP+(BOARDSIZE-1)*PIECESIZE);

}for(y = 0; y < BOARDSIZE; y++) {

Page 15: BC Mon JAVA - Co Caro

g.drawLine(LEFT,y*PIECESIZE+TOP,LEFT+(BOARDSIZE-1)*PIECESIZE,y*PIECESIZE+TOP);

}for(x = 0; x < BOARDSIZE; x++) {

for(y = 0; y < BOARDSIZE; y++) {switch(Pieces[x][y].State) {

case CPiece.WHITE:g.setColor(Color.white);

g.fillOval(x*PIECESIZE,y*PIECESIZE,PIECESIZE-2,PIECESIZE-2);g.setColor(Color.black);

g.drawOval(x*PIECESIZE,y*PIECESIZE,PIECESIZE-2,PIECESIZE-2);break;

case CPiece.BLACK:g.setColor(Color.black);

g.fillOval(x*PIECESIZE,y*PIECESIZE,PIECESIZE-2,PIECESIZE-2);break;

}}

}}

2.4.3 Cpiece.java

public class CPiece {

public int State;static final int EMPTY = 0;static final int WHITE = 1;static final int BLACK = 2;

}

2.4.4 Gpos.java

public class GPos {int x;int y;

}

Page 16: BC Mon JAVA - Co Caro

2.4.5 Gomoku.java File giao diện chính của chương trình:

import java.applet.*;import java.awt.*;public class Gomoku extends Applet {

Panel ButtonArea;Button Buttons[];Label MessageLabel;Checkbox Check1,Check2;CGoban Goban;CComputer Computer;int Player[];final int HUMAN = 1;final int COMPUTER = 2;int CurrentPlayer;final int WHITE = 1;final int BLACK = 2;int GameState;final int GS_END = 0;final int GS_PLAYUSER = 1;final int GS_PLAYCOM = 2;final int GS_READY = 3;public void init() {

ButtonArea = new Panel();setLayout(new BorderLayout());add("South",ButtonArea);MessageLabel = new Label("Welcome to Gomoku-Narabe Game !");add("Center",MessageLabel);Goban = new CGoban();add("North",Goban);Buttons = new Button[4];Buttons[0] = new Button("First");Buttons[1] = new Button("Second");Buttons[2] = new Button("Clear");Buttons[3] = new Button("Check");ButtonArea.setLayout(new FlowLayout());for(int i=0;i<3;i++)

ButtonArea.add(Buttons[i]);Check1 = new Checkbox("Sakiyomi");Check2 = new Checkbox("Kinjite");ButtonArea.add(Check1);ButtonArea.add(Check2);Check1.setState(true);

Page 17: BC Mon JAVA - Co Caro

Check2.setState(true);Goban.Sakiyomi = true;Goban.Kinjite=true;Computer = new CComputer(Goban);Player = new int[3];

}public void start() {

InitGame();}public boolean action(Event e,Object o) {

String label = o.toString();if(e.target instanceof Button){

if(label.equals("First")){StartGame(HUMAN);

} else if (label.equals("Second")) {StartGame(COMPUTER);

} else if (label.equals("Clear")) {InitGame();

}} else if(e.target instanceof Checkbox) {

Goban.Sakiyomi = Check1.getState();Goban.Kinjite = Check2.getState();

}return true;

}void InitGame() {

Goban.Initialize(Computer);Goban.Draw();repaint();GameState = GS_READY;for(int i=0;i<2;i++)

Buttons [i]. enable () ;PutMessage("Click 'First' or 'Second' to start game.");

}void StartGame(int FirstPlayer) {

if(GameState!=GS_READY)return;

Player[BLACK] = FirstPlayer;Player[WHITE] = (FirstPlayer==COMPUTER) ? HUMAN : COMPUTER;CurrentPlayer = BLACK;for(int i=0;i<2;i++)

Buttons [i]. disable () ;if(FirstPlayer==COMPUTER){

Page 18: BC Mon JAVA - Co Caro

Goban.Area[7][7] = 1;PlayComputer();

} else {GameState = GS_PLAYUSER;

}}

public boolean mouseDown(Event evt,int x,int y) {if(GameState==GS_PLAYUSER && Player[CurrentPlayer]==HUMAN) {

GPos pos = new GPos();if( !Goban.GetPos(x,y,pos) )

return true;switch(Goban.Check(CurrentPlayer, pos.x, pos.y)) {

case CGoban.GC_OK:CurrentPlayer = (CurrentPlayer == WHITE) ? BLACK

: WHITE;if(Player[CurrentPlayer] == COMPUTER){

GameState = GS_PLAYCOM;}break;

case CGoban.GC_ILLEGAL:PutMessage("Illegal postion ! Can't put");break;

case CGoban.GC_CANNOT:PutMessage("Aleady exist! Can't put");break;

case CGoban.GC_FILLED:PutMessage("Board is filled ! Draw game.");GameState = GS_END;break;

case CGoban.GC_WIN:PutMessage("You Win !!!");GameState = GS_END;break;

}}return true;

}public boolean mouseUp(Event evt,int x,int y) {

if(GameState == GS_PLAYCOM){PlayComputer();

}return true;

Page 19: BC Mon JAVA - Co Caro

}void PlayComputer() {

GPos pos = new GPos();PutMessage("Computer now thinking...");switch(Computer.Think(CurrentPlayer,pos)) {

case CComputer.THINK_OK:PutMessage("It's now your turn.");CurrentPlayer = (CurrentPlayer == WHITE) ? BLACK : WHITE;if(Player[CurrentPlayer] == COMPUTER){

PlayComputer();} else {

GameState = GS_PLAYUSER;}break;

case CComputer.THINK_FILLED:PutMessage("Board is filled ! Draw game.");GameState = GS_END;break;

case CComputer.THINK_WIN:PutMessage("Computer Win !!!");GameState = GS_END;break;

}}public void PutMessage(String s) {

MessageLabel.setText(s);}public void paint(Graphics g) {

Goban.Draw();}

}

Page 20: BC Mon JAVA - Co Caro

3. Cài đặt chương trình.

3.1 Giao diện chương trình chính:

3.2 Cách sử dụng chương trình:

Nếu Click vào “First” thì người đánh trước.

Nếu chọn vào “Second” thì máy đánh trước.

Page 21: BC Mon JAVA - Co Caro

KẾT LUẬN

Với mục tiêu đề ra của đề tài là xây dựng chương trình Game cờ caro và nghiên

cứu về thuật toán tìm kiếm đối kháng Minimax, các cải tiến của nó và ứng dụng trong trò

chơi có tổng bằng không, các kết luận chính đã đạt được của đề tài có thể tóm tắt như sau:

Đã nhắc lại một cách tổng quan về vấn đề tìm kiếm trong đó có phát biểu bài

toán tìm kiếm và giới thiệu các kỹ thuật tìm kiếm cơ bản như tìm kiếm không có thông

tin, tìm kiếm có thông tin và tìm kiếm đối kháng.

Tìm hiểu về đặc điểm của trò chơi có tổng bằng không trong lĩnh vực Lý

thuyết trò chơi. Đồng thời đưa ra mô hình toán học của trò chơi có tổng bằng không và

phát biểu định lý Minimax áp dụng cho các trò chơi có tổng bằng không.

Đã nghiên cứu giải thuật tìm kiếm Minimax và giải thuật cải tiến của nó là

giải thuật Alpha-beta cho các trò chơi có tổng bằng không.

Cài đặt được giải thuật cho trò chơi có tổng bằng không với hai người chơi

trong bài toán cờ caro. Kết quả của việc cài đặt là chương trình trò chơi Game cờ caro

giữa người và máy tính. Trong đó thuật toán được cài đặt cho việc suy nghĩ của Máy tính.

Mặc dù có nhiều cố gắng nhưng chắc chắn rằng các kết quả đã cài đặt được không

tránh khỏi những thiếu sót và hạn chế, hy vọng rằng trong tương lai vấn đề này sẽ được

nghiên cứu sâu hơn và phát triển với thuật toán được cải tiến tốt hơn, chẳng hạn chúng ta

có thể đi vào nghiên cứu vấn đề song song hóa thuật toán trên.

Trên cơ sở các kết quả đã đạt được, chúng ta có thể phát triển những nghiên cứu

tiếp về thuật toán Alpha- Beta song song. Hơn nữa, chúng ta có thể nghĩ đến việc triển

khai những nghiên cứu về ứng dụng của những kết quả này trong các lĩnh vực khác của

xã hội, đặc biệt là kinh tế.