lập trình java game cờ caro

Upload: phuoc-vu

Post on 02-Jun-2018

228 views

Category:

Documents


0 download

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!