Top Banner

of 27

lập trình java game cờ caro

Jun 02, 2018

Download

Documents

Phuoc Vu
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
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!