Upload
thu-dinh-nguyen
View
133
Download
12
Embed Size (px)
Citation preview
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
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.
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.
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ụ:
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.
Ví dụ :
1.3.3.2 Giải thuật phương pháp cắt tỉa α-β (Alpha-beta prunning).
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*
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)
*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");
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 () ;
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...");
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[][];
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 ;
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++) {
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;
}
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);
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){
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...");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();}
}
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.
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ế.