• Nenhum resultado encontrado

BC Mon JAVA - Co Caro

N/A
N/A
Protected

Academic year: 2021

Share "BC Mon JAVA - Co Caro"

Copied!
22
0
0

Texto

(1)

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

(2)

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.

(3)

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.

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

(4)

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.

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ụ:

(5)

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

(6)

α 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.

Ví dụ :

(7)
(8)

Đố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*

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.

(9)

Đố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)

*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.*;

publicclass Gomoku extends Applet { Panel ButtonArea;

Button Buttons[]; Label MessageLabel; Checkbox Check1,Check2; CGoban Goban;

CComputer Computer; intPlayer[];

(10)

finalintCOMPUTER = 2; intCurrentPlayer;

finalintWHITE = 1; finalintBLACK = 2; intGameState;

finalintGS_END = 0;

finalintGS_PLAYUSER = 1; finalintGS_PLAYCOM = 2; finalintGS_READY = 3; publicvoid 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); Check2.setState(true); Goban.Sakiyomi = true; Goban.Kinjite=true;

Computer = new CComputer(Goban); Player = newint[3];

}

publicvoid start() { InitGame(); }

publicboolean action(Event e,Object o) { String label = o.toString();

if(e.targetinstanceof Button){ if(label.equals("First")){

StartGame(HUMAN);

} elseif (label.equals("Second")) {

(11)

} elseif (label.equals("Clear")) { InitGame();

}

} elseif(e.targetinstanceof Checkbox) { Goban.Sakiyomi = Check1.getState(); Goban.Kinjite = Check2.getState(); }

returntrue; }

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){ Goban.Area[7][7] = 1; PlayComputer(); } else { GameState = GS_PLAYUSER; } }

publicboolean mouseDown(Event evt,int x,int y) {

if(GameState==GS_PLAYUSER && Player[CurrentPlayer]==HUMAN) { GPos pos = new GPos();

if( !Goban.GetPos(x,y,pos) ) returntrue;

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;

(12)

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; } } returntrue; }

publicboolean mouseUp(Event evt,int x,int y) { if(GameState == GS_PLAYCOM){ PlayComputer(); } returntrue; } 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; }

(13)

publicvoid PutMessage(String s) { MessageLabel.setText(s); }

publicvoid paint(Graphics g) { Goban.Draw(); } } 2.4.2 Cgoban.java import java.applet.*; import java.awt.*;

publicclass CGoban extends Canvas { staticfinalintTOP = 10; staticfinalintLEFT = 10; staticfinalintBOARDSIZE = 15; staticfinalintPIECESIZE = 20;

staticfinalintMAXPIECENUM = BOARDSIZE * BOARDSIZE; staticfinalintGC_OK = 0;

staticfinalintGC_ILLEGAL = 1; staticfinalintGC_CANNOT= 2; staticfinalintGC_FILLED = 3;

staticfinalintGC_WIN = 4; publicbooleanSakiyomi;

publicbooleanKinjite; CPiece Pieces[][]; publicintArea[][];

staticfinalintAREASIZE = 2; publicintnumPiece;

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 = newint[BOARDSIZE][BOARDSIZE]; }

publicvoid 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;

(14)

}

numPiece = 0; }

publicvoid 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]++; }

} }

}

publicvoid 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 ;

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

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

} }

}

publicint Check(int color,int x,int y) { int ret;

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

Put(color,x,y);

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

Remove(x,y);

returnGC_ILLEGAL; }

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

(15)

if(ret == Computer.OK5) returnGC_WIN; if(numPiece == MAXPIECENUM) returnGC_FILLED; returnGC_OK; }

publicboolean GetPos(int x,int y,GPos pos) {

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

returnfalse;

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

returnfalse;

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

}

publicvoid Draw() { repaint(); }

publicvoid 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++) {

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;

(16)

} }

} }

2.4.3 Cpiece.java

publicclass CPiece {

publicintState;

staticfinalintEMPTY = 0;

staticfinalintWHITE = 1;

staticfinalintBLACK = 2;

}

2.4.4 Gpos.java

publicclass GPos {

intx;

inty; }

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

import java.applet.*;

import java.awt.*;

publicclass Gomoku extends Applet {

Panel ButtonArea; Button Buttons[]; Label MessageLabel; Checkbox Check1,Check2; CGoban Goban;

CComputer Computer;

intPlayer[];

finalintHUMAN = 1;

finalintCOMPUTER = 2;

intCurrentPlayer;

finalintWHITE = 1;

finalintBLACK = 2;

(17)

finalintGS_END = 0;

finalintGS_PLAYUSER = 1;

finalintGS_PLAYCOM = 2;

finalintGS_READY = 3;

publicvoid 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); Check2.setState(true); Goban.Sakiyomi = true; Goban.Kinjite=true;

Computer = new CComputer(Goban); Player = newint[3];

}

publicvoid start() {

InitGame(); }

publicboolean action(Event e,Object o) {

String label = o.toString();

if(e.targetinstanceof Button){

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

StartGame(COMPUTER); } elseif (label.equals("Clear")) {

(18)

}

} elseif(e.targetinstanceof Checkbox) { Goban.Sakiyomi = Check1.getState(); Goban.Kinjite = Check2.getState(); }

returntrue;

}

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){ Goban.Area[7][7] = 1; PlayComputer(); } else { GameState = GS_PLAYUSER; } }

publicboolean mouseDown(Event evt,int x,int y) {

if(GameState==GS_PLAYUSER && Player[CurrentPlayer]==HUMAN) { GPos pos = new GPos();

if( !Goban.GetPos(x,y,pos) )

returntrue;

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

case CGoban.GC_OK:

CurrentPlayer = (CurrentPlayer == WHITE) ? BLACK : WHITE;

if(Player[CurrentPlayer] == COMPUTER){ GameState = GS_PLAYCOM;

(19)

}

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; } } returntrue; }

publicboolean mouseUp(Event evt,int x,int y) {

if(GameState == GS_PLAYCOM){ PlayComputer(); } returntrue; } 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;

(20)

case CComputer.THINK_WIN:

PutMessage("Computer Win !!!"); GameState = GS_END;

break;

} }

publicvoid PutMessage(String s) {

MessageLabel.setText(s); }

publicvoid paint(Graphics g) {

Goban.Draw(); }

}

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

(21)

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.

(22)

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ế.

Referências

Documentos relacionados