lập trình java game cờ caro
TRANSCRIPT
-
8/11/2019 lp trnh java game c caro
1/27
1
MC LC
LI NI U......................................................................................... 2
I.YU CU BI TON.......................................................................... 3
II.PHN TCH GII QUYT BI TON.......................................... 3
1. Phn tch yu cu.......................................................................... 3
2. Phng php gii quyt............................................................... 3
2.1 Tm kim nc i...................................................................... 32.2 K thut lng gi..................................................................... 8
3. Xy dng cc lp.......................................................................... 9
4. Giao din v cch chi............................................................... 25
KT LUN............................................................................................ 27
-
8/11/2019 lp trnh java game c caro
2/27
2
LI NI U
Game Caro (hay cn gi l game Gomoku) l mt tr chi quen thuc i
vi nhiu i tng, dchi, gim cng thng,...CCaro l mt trong nhng trchi rt phbin, c bit l trong gii hc sinh, sinh vin. y cng l mt trchi chng em rt thch, chnh v vychng em chn ti Lm game ccarocho mn Tr tunhn to.
Trong qu trnh hon thnh ti ny, chng em tm hiu c cc thutton c hc trong mn Tr tu nhn to nh thut ton tm kim nc iMinimax, gii thut Alpha-Beta cng nh k nng lp trnh ngn ng Java.
Chng em cng xin cm n s hng dn tn tnh ca thy Phm Vn Hi,c v chuyn mn cng nh nh hng. V kin thc cn hn hp nn trong qu
trnh thc hin ti khng th trnh khi thiu st. V vy rt mong nhn cnhn s gp ca thy ti c th hon thin hn na.
-
8/11/2019 lp trnh java game c caro
3/27
3
I. YU CU BI TON
Xy dng mt bn c c k cc vung vi kch thc 25x25. C 2 qun c l Xv O.
Ngi chi c th nh vi my. Ngi thng l ngi i c 5 qun c cngkiu trn hang dc, hng ngang hoc ng cho. Hai ngi ho nhau khi bn cht ch nh m vn cha phn c thng bi
II. PHN TCH GII QUYT BI TON1.
Phn tch yu cuM phng bn c
Bn c (Board) bao gm cc c ( Pos) c t trong mt mng 2 chiu(kch thc a x b)Trong mi Pos c th xc nh c:
V trpos ( Row, collumme)Trng thipos (Status) Bao gm ang trng (0) nc i ca i th (2) hoc nci ca my (1) nguy him ca c tu theo trng thipos v c th thay i c.
nh gi gi trcc posGing nh trong thc t, ngi chi thng nh gi mt s nc c l nguy him,
bnh thng hoc t nguy him, my tnh cng nh gi nhng c th hn bng cccon s.
2. Phng php gii quyt
2.1Tm kim nc iGii thiu v khng gian tm kim
Trong tr chi Caro, c sau mi nc c, mi i th s chn ra t nhng trng i, do , sau 1 mi nc i th s trng cn li s gim. Nh vy, victm nc i tip theo cho trng thi c sn ch l vic tm kim nhng trng cnli, ngthi, khng gian tm kim s thu hp theo s nc i to.
Khng gian chn nc i t mi trng thi ban u l hu hn, nhng khnggian tm kim 1 nc i dn n chin thng l rt ln.Do ta khng th vt sch
khng gian tm kim nc i ny m taphi gii hn khng gian tm kim.Mt khng gian tm kim c th hin theo 1 cy a phn v uc gi l cytm kim haycy tr chi.
-
8/11/2019 lp trnh java game c caro
4/27
4
V d :
Cy tr chi
Da vo ci cy tr chi nh ngha trn, vic tm kim nc i l chn1 nt trn cy ( mc 1) sao cho nc l tt.Theo thng thng khi chi, mtnc i tt hay khng l ph thuc vo kh nng dnh chin thng l cao hay thpsau khi nc i ny uc i. Do , mun chn 1 nc i tt th nu ch da voth c hin ti l cha , m phi bit thng tin ca nhng th c sau khi chnnc ny i.
Chin lcminimax tm kim nc i
Chin lc ny c xc nh bng cch xt gi tr MINIMAX i vi mint trong cy biu din tr chi.MAX chn nc i ng vi gi tr MINIMAX cc i ( t cgitr cc
ica hm mc tiu) t c gi tr cc i ca hm mc tiu)Ngc li, MIN chn nc i ng vi gi tr MINIMAX cctiu.
-
8/11/2019 lp trnh java game c caro
5/27
5
V d:
Gii thut minimax
-
8/11/2019 lp trnh java game c caro
6/27
6
Gii thut tm kim MINIMAX vp phi vn bng n (mc hm m) cckh nng nc i cn phi xt khng ph hp vi nhiu bi ton tr chi thct.
Chng ta c th ct ta (b i khng xt n) mt s nhnh tm kim trongcy biu din tr chi
Phng php ctta - (Alpha-beta prunning) tng: Nu mt nhnh tm kim no khng th ci thin i vi gi tr(hm tin ch) m chng ta c, th khng cn xt n nhnh tm kim
na!Vic ct ta cc nhnh tm kim (ti) khng nh hng n kt qu cui
cng l gi tr ca nc i tt nht ivi MAX (gi tr ti a) tnh n hin ti
i vi nhnh tm kim. Nu v l gi tr ti hn , MAX s b qua nc i ng viv -> Ct ta nhnh ng vi v c nh ngha tng t i vi MIN..
V d :
-
8/11/2019 lp trnh java game c caro
7/27
7
Gii thut alpha beta
-
8/11/2019 lp trnh java game c caro
8/27
8
So snh s nt phi xt gia 2 thut ton Minimax v - :
i vi cc tr chi c khng gian trng thi ln, th phng php ct ta - vn khng ph hp. Khng gian tm kim (kt hp ct ta) vn ln
C th hn ch khng gian tm kim bng cch s dng cc tri thc c thca bi ton
Tri thc cho php nh gi mi trng thi ca tr chi.Tri thc b sung (heuristic) ny ng vai tr tng t nh l hm c lng
h(n) trong gii thut tm kim A*
2.2 Kthut lng giK thut lng gi l mt k thut quan trng trong vic xy dng tr chic caro. K thut ny gip cho im trng thi ca bn c t xy dng cytr chi. Vic xy dng hm lng gi hp l, chnh xc s gip cho h thng cnh gi chnh xc vtrng thi bn c a ra nc i thng minh hn.
i vi bi ton c caro, ta c th dng 1 hm lng gi nh gi tnh"tt, xu" ti 1 thi im. Nhng no gn cc qun nh trc s c imcao hn. Nhng cng xa th c cng t im.Tuy nhin y ch l Heuristicnn ta phi b sung thm cc Heuristic khc na, v d vng c 2, 3, 4 ... qun lintip th s c cng thm 1 s im thng no cho vng da vo trng squn (tc l nhiu qun lin tip th c cng nhiu im thng hn).
Sau mi nc i, h thng s kim tra bn c tm cc th c ri ty vo li th nh trc tnh ra im. C th l:*TH1: Trng hp chc thng (+5000 im)
{0, 1, 1, 1, 1}, {1, 0, 1, 1, 1}, {1, 1, 0, 1, 1},
-
8/11/2019 lp trnh java game c caro
9/27
9
* TH2: Trng hp thun li (+585 im)
{0, 0, 1, 1, 1, 0}, {0, 1, 0, 1, 1, 0}, {1, 0, 1, 0, 1, 0, 1}
*TH3: ( +73 )
{0, 1, 1, 1, 0}, {0, 0, 1, 1, 1}, {0, 1, 0, 1, 1},{0, 1, 1, 0, 1}, {0, 0, 1, 1, 1}, {1, 0, 1, 1, 0},
{1, 0, 0, 1, 1}, {1, 0, 1, 0, 1}, {1, 0, 0, 1, 1},
{0, 1, 0, 1, 1}
*TH3: Trng hp bnh thng (+9im)
{0, 0, 1, 1, 0, 0}, {0, 1, 0, 1, 0, 0},{0, 1, 1, 0, 0, 0}, {0, 1, 0, 1, 0, 0}, {0, 1, 1, 0, 0, 0},{0, 1, 0, 0, 1, 0}
3. Xy dng cc lp
Lp CaroBoard
Biu din cc trng thi ca bn c Caro, danh sch cc nc nh. Cp nhttm im nh cho ngi chi "class Player". C th coi nh thnh phn lu trthng tin ca class Player
-public void updateStateOfBoard(Point point):cp nht trng thi bn c. B im nh ra khi cc nh cha nh, cp nht cc im cn li:public void updateStateOfBoard(Point point) {
// Bo diem da danh ra khoi danh sach cac dinh chua danh
MarkNonTickedOfOnePlayer[point.x][point.y] = 0;MarkNonTickedOfTwoPlayer[point.x][point.y] = 0;
// Cap nhat lai danh sach cac o chua danh
// Phan cap nhat nay can sua sau cho nhanh hon
numberNonTicked = 0;for (int i = 0; i < number_step; i++) {
for (int j = 0; j < 8; j++) {
if (board[listAreaTicked[i].x + dx[j]][listAreaTicked[i].y + dy[j]] == 0) {Point p = new Point(listAreaTicked[i].x + dx[j], listAreaTicked[i].y +
dy[j]);
-
8/11/2019 lp trnh java game c caro
10/27
-
8/11/2019 lp trnh java game c caro
11/27
11
// Tim cac o duong cheo phufor (int j = 0; j < 11; j++) {
if (point.x + stepValue[10 - j] < rows && point.x + stepValue[10 - j] >= 0
&& point.y + stepValue[j] < cols && point.y + stepValue[j] >= 0&& board[point.x + stepValue[10 - j]][point.y + stepValue[j]] == 0) {
updateMarkOfPoint(new Point(point.x + stepValue[10 - j], point.y +stepValue[j]));
}}
}-public int getMarkOfPointByPlayer(Point p, int player):tnhim cho mt pos (mttrn bn c):
public int getMarkOfPointByPlayer(Point p, int player) {int mark = 0;
// Tim cac o duong doc
for (int j = 0; j < 11; j++) {StepChess[j] = ((p.x + stepValue[j] < rows) && (p.x + stepValue[j] >= 0) ?
board[p.x + stepValue[j]][p.y] : -1);
}mark += ChessMark.MarkOfChessArea(StepChess, player);
// Tim cac o duong ngangfor (int j = 0; j < 11; j++) {
StepChess[j] = ((p.y + stepValue[j] < cols) && (p.y + stepValue[j] >= 0) ?board[p.x][p.y + stepValue[j]] : -1);
}
mark += ChessMark.MarkOfChessArea(StepChess, player);
// Tim cac o duong cheo chinh
for (int j = 0; j < 11; j++) {StepChess[j] = ((p.x + stepValue[j] < rows && p.x + stepValue[j] >= 0)
&& (p.y + stepValue[j] < cols && p.y + stepValue[j] >= 0) ? board[p.x +
stepValue[j]][p.y + stepValue[j]] : -1);}
mark += ChessMark.MarkOfChessArea(StepChess, player);
-
8/11/2019 lp trnh java game c caro
12/27
12
// Tim cac o duong cheo phu
for (int j = 0; j < 11; j++) {StepChess[j] = ((p.x + stepValue[10 - j] < rows && p.x + stepValue[10 - j]
>= 0) && (p.y + stepValue[j] < cols && p.y + stepValue[j] >= 0) ? board[p.x +
stepValue[10 - j]][p.y + stepValue[j]] : -1);}
mark += ChessMark.MarkOfChessArea(StepChess, player);
// Tinh toan nuoc doiif (mark >= 2 * ChessMark.MARK_2 && mark < ChessMark.MARK_3) {
mark = ChessMark.MARK_3 + 4 * ChessMark.MARK_1;
} else if (mark > (ChessMark.MARK_3 + ChessMark.MARK_2) && mark = 0) &&board[point.x + stepValue[j]][point.y] == 0) {
-
8/11/2019 lp trnh java game c caro
13/27
13
Point p = new Point(point.x + stepValue[j], point.y);
increaseMark = increaseMark + getMarkOfPointByPlayer(p, 1) -MarkNonTickedOfOnePlayer[p.x][p.y];
decreaseMark = decreaseMark + MarkNonTickedOfTwoPlayer[p.x][p.y]
- getMarkOfPointByPlayer(p, 2);}
}
// Tim cac o duong ngangfor (int j = 0; j < 11; j++) {
if ((point.y + stepValue[j] < cols) && (point.y + stepValue[j] >= 0) &&
board[point.x][point.y + stepValue[j]] == 0) {Point p = new Point(point.x, point.y + stepValue[j]);
increaseMark = increaseMark + getMarkOfPointByPlayer(p, 1) -
MarkNonTickedOfOnePlayer[p.x][p.y];decreaseMark = decreaseMark + MarkNonTickedOfTwoPlayer[p.x][p.y]
- getMarkOfPointByPlayer(p, 2);
}
}
// Tim cac o duong cheo chinh
for (int j = 0; j < 11; j++) {if (point.x + stepValue[j] < rows && point.x + stepValue[j] >= 0
&& point.y + stepValue[j] < cols && point.y + stepValue[j] >= 0
&& board[point.x + stepValue[j]][point.y + stepValue[j]] == 0) {Point p = new Point(point.x + stepValue[j], point.y + stepValue[j]);
increaseMark = increaseMark + getMarkOfPointByPlayer(p, 1) -MarkNonTickedOfOnePlayer[p.x][p.y];
decreaseMark = decreaseMark + MarkNonTickedOfTwoPlayer[p.x][p.y]
- getMarkOfPointByPlayer(p, 2);
}}
// Tim cac o duong cheo phufor (int j = 0; j < 11; j++) {
if (point.x + stepValue[10 - j] < rows && point.x + stepValue[10 - j] >= 0
&& point.y + stepValue[j] < cols && point.y + stepValue[j] >= 0&& board[point.x + stepValue[10 - j]][point.y + stepValue[j]] == 0) {
Point p = new Point(point.x + stepValue[10 - j], point.y + stepValue[j]);
-
8/11/2019 lp trnh java game c caro
14/27
14
increaseMark = increaseMark + getMarkOfPointByPlayer(p, 1) -
MarkNonTickedOfOnePlayer[p.x][p.y];decreaseMark = decreaseMark + MarkNonTickedOfTwoPlayer[p.x][p.y]
- getMarkOfPointByPlayer(p, 2);
}}
board[point.x][point.y] = 0;return (increaseMark + 1) / (decreaseMark + 1);
}
-public int selectPoint(int diff, int defendOrAttack):Chnmt(pos) trong scctrngnh, ny thamn giithutMinimax.public int selectPoint(int diff, int defendOrAttack) {
int max1 = -1;
int max2 = -1;for (int i = 0; i < numberNonTicked; i++) {
Point p = listAreaNonTicked[i];
if (max1 == -1 || MarkNonTickedOfOnePlayer[p.x][p.y] >MarkNonTickedOfOnePlayer[listAreaNonTicked[max1].x][listAreaNonTicked[m
ax1].y]) {
max1 = i;}
if (max2 == -1 || MarkNonTickedOfTwoPlayer[p.x][p.y] >MarkNonTickedOfTwoPlayer[listAreaNonTicked[max2].x][listAreaNonTicked[m
ax2].y]) {max2 = i;
}
}
Point p1 = listAreaNonTicked[max1];Point p2 = listAreaNonTicked[max2];
if (MarkNonTickedOfOnePlayer[p1.x][p1.y] >=
MarkNonTickedOfTwoPlayer[p2.x][p2.y]&& MarkNonTickedOfOnePlayer[p1.x][p1.y] >=
ChessMark.WIN_MARK) {
return max1;}
if (MarkNonTickedOfOnePlayer[p1.x][p1.y] =
ChessMark.WIN_MARK) {// Tim nuoc ma co kha nang chan duoc nuoc tan cong cua doi phuong
int max = MarkNonTickedOfTwoPlayer[p2.x][p2.y];
return getPosition(max);
}return getNormalPos(diff, defendOrAttack);
}
-public int getNormalPos(int diff, int DefendOrAttack):nhnci nuimccpos bnh thngpublic int getNormalPos(int diff, int DefendOrAttack) {
int[] candidates = new int[numberNonTicked];int i, j;int temp;
Point p1, p2;
boolean isAttack = true;for (i = 0; i < numberNonTicked; i++) {
candidates[i] = i;
}if (DefendOrAttack > 2) {
// Lay phong thu
isAttack = false;for (i = 0; i < numberNonTicked - 1; i++) {
p1 = listAreaNonTicked[i];for (j = i + 1; j < numberNonTicked; j++) {
p2 = listAreaNonTicked[j];
if (MarkNonTickedOfTwoPlayer[p1.x][p1.y] = lengOfTheco) {
return mark[i];
}}
return 0;
}}
Lp player
Class Player : tng trng cho mt my tnh vi cc thng snhm thc hin nc i, thao tc vi ngi s dng.-public Player(int pDiff, int pAttackOrDepend, int width, int heigth)public Player(int pDiff, int pAttackOrDepend, int width, int heigth)
{
this.difficult = pDiff;this.attackOrDepend = pAttackOrDepend;caroTable = new CaroBoard(width, heigth);
}
Lp point
Biu din 1 im nh trong bn c caro
-
8/11/2019 lp trnh java game c caro
25/27
25
4. Giao din v cch chi
Trc khi bt u chi ta thit lp cc thng s v: kh: Chn kh ca my Cng th: Bn mun my nh th cng hay th th? Nhp 0 my nh
th 0 v 1 my nh th th
Sau nu bn mun nh trc th bn chn To ngi chi v bt u chi,nu mun my nh trcth sau khi chn To ngi chi bn chn My i trc.
-
8/11/2019 lp trnh java game c caro
26/27
26
Cc hp thoi hin ln khi chi:Khi bn thua
Khi bn nh vo nc nh ri
Khi bn thng:
Khi bn thng hoc thua, bn chn To ngi chi chi li hoc Exit thotgame!
-
8/11/2019 lp trnh java game c caro
27/27
27
KT LUNQua mn hc v trong qu trnh tm hiu thc hin ti ny, nhm em
c ci nhn ton din hn trong vic ng dng tr tu nhn to vo gii quytvn trong thc t. C caro l mt tr chi ng dng tt thut ton minimax vgii thut alpha-beta. Tuy nhin trong qu trinh thc thi chng trnh khng thtrnh khi nhng sai st v cha thc s ti u. Chng em mong c s gp ca thy c th hon thin hn trong tng lai!
Chng em xin chn thnh cm n!