Từ 1 tới 3 trên tổng số 3 kết quả

Đề tài: Chuyển code C từ giao diện console sang đồ họa như thế nào?

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    22

    Question Chuyển code C từ giao diện console sang đồ họa như thế nào?

    Các bạn cho mình hỏi qui trình chuyền 1 chương trình từ giao diện console sang đồ họa.
    ví dụ như chương trình cờ tướng của thầy nguyên dạng console:
    C Code:
    1. /*VSCCP - Very Simple Chinese Chess Program
    2.    
    3.     Version:
    4.     ->      1.0 - basic
    5.             1.1 - add opening book
    6.             1.2 - improve eval function
    7.             1.3 - improve alphabeta search by adding iterative deepening,
    8.                   quiescence, principal variation, history, killer heuristics
    9.             1.4 - add new rules and interface for tournament between 2 programs
    10.                   A tournament can be controled by ROCC (Referee of Chinese Chess)
    11. */
    12.  
    13. #include <stdio.h>
    14. #include <conio.h>
    15. #include <stdlib.h>
    16. #include "defs10.h"
    17.  
    18.  
    19. /* the board representation && the initial board state */
    20. char color[BOARD_SIZE]= {
    21.         0, 0, 0, 0, 0, 0, 0, 0, 0,
    22.         7, 7, 7, 7, 7, 7, 7, 7, 7,
    23.         7, 0, 7, 7, 7, 7, 7, 0, 7,
    24.         0, 7, 0, 7, 0, 7, 0, 7, 0,
    25.         7, 7, 7, 7, 7, 7, 7, 7, 7,
    26.         7, 7, 7, 7, 7, 7, 7, 7, 7,
    27.         1, 7, 1, 7, 1, 7, 1, 7, 1,
    28.         7, 1, 7, 7, 7, 7, 7, 1, 7,
    29.         7, 7, 7, 7, 7, 7, 7, 7, 7,
    30.         1, 1, 1, 1, 1, 1, 1, 1, 1};
    31.  
    32. char piece[BOARD_SIZE]= {
    33.         5, 3, 2, 1, 6, 1, 2, 3, 5,
    34.         7, 7, 7, 7, 7, 7, 7, 7, 7,
    35.         7, 4, 7, 7, 7, 7, 7, 4, 7,
    36.         0, 7, 0, 7, 0, 7, 0, 7, 0,
    37.         7, 7, 7, 7, 7, 7, 7, 7, 7,
    38.         7, 7, 7, 7, 7, 7, 7, 7, 7,
    39.         0, 7, 0, 7, 0, 7, 0, 7, 0,
    40.         7, 4, 7, 7, 7, 7, 7, 4, 7,
    41.         7, 7, 7, 7, 7, 7, 7, 7, 7,
    42.         5, 3, 2, 1, 6, 1, 2, 3, 5};
    43.  
    44. /* For getting information */
    45. unsigned long   nodecount, brandtotal = 0, gencount = 0;
    46. char    ply, side, xside, computerside;
    47. move    newmove;
    48. gen_rec gen_dat[MOVE_STACK];
    49. short   gen_begin[HIST_STACK], gen_end[HIST_STACK];
    50. hist_rec hist_dat[HIST_STACK];
    51. short   hdp;
    52.  
    53. volatile unsigned long *systicks=(unsigned long *)0x46C; /* Clock counter */
    54. unsigned long tickstart, tickend;
    55.  
    56. /***** INTERFACE *****/
    57. void MoveTo(short x, short y)
    58. {
    59.     gotoxy (5*x+1, 2*y+1);
    60. }
    61.  
    62.  
    63. void DrawCell(short pos, short mode)
    64. {
    65.     char piece_char[] = "PBENCRK+"; /*"TSVMPXT+"; /* the piece letters */
    66.  
    67.     if (color[pos]==DARK) textcolor(13);
    68.     else if (color[pos]==LIGHT) textcolor(14); else textcolor(7);
    69.     if (mode==NORMAL) textbackground(0); else textbackground(1);
    70.     MoveTo(pos%9, pos/9);
    71.     cprintf("%c", piece_char[piece[pos]]);
    72. }
    73.  
    74.  
    75. void DrawBoard(void)
    76. {
    77.     int i;
    78.     textcolor(7); textbackground(0); clrscr(); gotoxy(1,1);
    79.     printf("+----+----+----+----+----+----+----+----+  9\n");
    80.     printf("|    |    |    | \\  |  / |    |    |    |\n");
    81.     printf("+----+----+----+----+----+----+----+----+  8\n");
    82.     printf("|    |    |    | /  |  \\ |    |    |    |\n");
    83.     printf("+----+----+----+----+----+----+----+----+  7\n");
    84.     printf("|    |    |    |    |    |    |    |    |\n");
    85.     printf("+----+----+----+----+----+----+----+----+  6\n");
    86.     printf("|    |    |    |    |    |    |    |    |\n");
    87.     printf("+----+----+----+----+----+----+----+----+  5\n");
    88.     printf("|                                       |\n");
    89.     printf("+----+----+----+----+----+----+----+----+  4\n");
    90.     printf("|    |    |    |    |    |    |    |    |\n");
    91.     printf("+----+----+----+----+----+----+----+----+  3\n");
    92.     printf("|    |    |    |    |    |    |    |    |\n");
    93.     printf("+----+----+----+----+----+----+----+----+  2\n");
    94.     printf("|    |    |    | \\  |  / |    |    |    |\n");
    95.     printf("+----+----+----+----+----+----+----+----+  1\n");
    96.     printf("|    |    |    | /  |  \\ |    |    |    |\n");
    97.     printf("+----+----+----+----+----+----+----+----+  0\n");
    98.     printf("A    B    C    D    E    F    G    H    I\n");
    99.     gotoxy(1,25); printf("Up, Down, Right, Left: cursor move   Enter or Space: select  ESC: escape");
    100.     gotoxy(48,1); cprintf("VERY SIMPLE CHINESE CHESS PROGRAM");
    101.     gotoxy(50,2); cprintf("(C) Pham Hong Nguyen. Ver %s", VERSION);
    102.  
    103.     for (i=0; i<BOARD_SIZE; i++) DrawCell(i, NORMAL);
    104. }
    105.  
    106.  
    107. void Gen(void);
    108.  
    109. short GetHumanMove(void)
    110. {
    111.     static short x = 4, y = 5;
    112.     short ch, from, t, i, selecting = 0;
    113.  
    114.     Gen();       /* for check legal move only */
    115.  
    116.     while (1)
    117.     {
    118.         MoveTo (x, y);
    119.         ch = (short)getch();
    120.         switch (ch) {
    121.         case 13:
    122.         case 32:                        /* Enter or Spacebar */
    123.             t = x + y*SIZE_X;
    124.             if (!selecting)
    125.             {
    126.                 if (color[t]==side)
    127.                 {
    128.                     selecting = 1; from = t; DrawCell(t, SELECT);
    129.                 }
    130.             }
    131.             else
    132.                 {
    133.                 if (t != from) DrawCell(from, NORMAL);
    134.                 if (color[t]==side)
    135.                 {
    136.                     from = t; DrawCell(t, SELECT);
    137.                 }
    138.                 else
    139.                 {
    140.                     newmove.from = from; newmove.dest = t;
    141.                     for (i=gen_begin[ply]; i<gen_end[ply]; i++)
    142.                         if (gen_dat[i].m.from==newmove.from && gen_dat[i].m.dest==newmove.dest) return 0;
    143.                     DrawCell(from, SELECT);
    144.                 }
    145.             }
    146.             break;
    147.  
    148.         case 27:  return 1;     /* ESC */
    149.  
    150.         case 0:
    151.                 ch = (short)getch();
    152.                 switch (ch) {
    153.                 case 75: if (x) x--; else x = SIZE_X-1; break;  /* LEFT */
    154.                 case 77: if (x<SIZE_X-1) x++; else x = 0; break;    /* RIGHT */
    155.                 case 72: if (y) y--; else y = SIZE_Y-1; break;  /* UP */
    156.                 case 80: if (y<SIZE_Y-1) y++; else y = 0; break;    /* DOWN */
    157.                 }
    158.                 break;
    159.         } /* switch */
    160.     } /* while */
    161. }
    162.  
    163.  
    164. /**** MOVE GENERATE ****/
    165. short offset[7][8] =
    166.         {{-1, 1,13, 0, 0, 0, 0, 0},     /* PAWN {for DARK side} _tot*/
    167.         {-12,-14,12,14,0,0,0,0},        /* BISHOP _si*/
    168.         {-28,-24,24,28, 0, 0, 0, 0 },   /* ELEPHAN _tuong*/
    169.         {-11,-15,-25,-27,11,15,25,27},  /* KNIGHT _ma*/
    170.         {-1, 1,-13,13, 0, 0, 0, 0},     /* CANNON _phao*/
    171.         {-1, 1,-13,13, 0, 0, 0, 0},     /* ROOK _xe*/
    172.         {-1, 1,-13,13, 0, 0, 0, 0}};    /* KING _tuong*/
    173.  
    174. short mailbox182[182] =
    175.         {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    176.         -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    177.         -1,-1, 0, 1, 2, 3, 4, 5, 6, 7, 8,-1,-1,
    178.         -1,-1, 9,10,11,12,13,14,15,16,17,-1,-1,
    179.         -1,-1,18,19,20,21,22,23,24,25,26,-1,-1,
    180.         -1,-1,27,28,29,30,31,32,33,34,35,-1,-1,
    181.         -1,-1,36,37,38,39,40,41,42,43,44,-1,-1,
    182.         -1,-1,45,46,47,48,49,50,51,52,53,-1,-1,
    183.         -1,-1,54,55,56,57,58,59,60,61,62,-1,-1,
    184.         -1,-1,63,64,65,66,67,68,69,70,71,-1,-1,
    185.         -1,-1,72,73,74,75,76,77,78,79,80,-1,-1,
    186.         -1,-1,81,82,83,84,85,86,87,88,89,-1,-1,
    187.         -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    188.         -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};
    189.  
    190. short mailbox90[90] =
    191.         {28, 29, 30, 31, 32, 33, 34, 35, 36,
    192.          41, 42, 43, 44, 45, 46, 47, 48, 49,
    193.          54, 55, 56, 57, 58, 59, 60, 61, 62,
    194.          67, 68, 69, 70, 71, 72, 73, 74, 75,
    195.          80, 81, 82, 83, 84, 85, 86, 87, 88,
    196.          93, 94, 95, 96, 97, 98, 99,100,101,
    197.         106, 107,108,109,110,111,112,113,114,
    198.         119, 120,121,122,123,124,125,126,127,
    199.         132, 133,134,135,136,137,138,139,140,
    200.         145, 146,147,148,149,150,151,152,153};
    201.  
    202. short legalposition[90] =
    203.         {1, 1, 5, 3, 3, 3, 5, 1, 1,
    204.         1, 1, 1, 3, 3, 3, 1, 1, 1,
    205.         5, 1, 1, 3, 7, 3, 1, 1, 5,
    206.         1, 1, 1, 1, 1, 1, 1, 1, 1,
    207.         9, 1,13, 1, 9, 1,13, 1, 9,
    208.         9, 9, 9, 9, 9, 9, 9, 9, 9,
    209.         9, 9, 9, 9, 9, 9, 9, 9, 9,
    210.         9, 9, 9, 9, 9, 9, 9, 9, 9,
    211.         9, 9, 9, 9, 9, 9, 9, 9, 9,
    212.         9, 9, 9, 9, 9, 9, 9, 9, 9};
    213.  
    214. short maskpiece[7] = {8, 2, 4, 1, 1, 1, 2},
    215.     knightcheck[8] = {1,-1,-9,-9,-1,1,9,9},
    216.     elephancheck[8] = {-10,-8,8,10,0,0,0,0},
    217.     kingpalace[9] = {3,4,5,12,13,14,21,22,23};
    218.  
    219.  
    220. void InitGen(void)
    221. {
    222.     gen_begin[0] = 0; ply = 0; hdp = 0;
    223. }
    224.  
    225.  
    226. short KingFace(short from, short dest)
    227. {
    228.     short i, k, t, r = 0;
    229.     i = from % SIZE_X;
    230.     if (i>=3 && i<=5 && piece[dest]!=KING) {
    231.         t = piece[dest]; piece[dest] = piece[from]; piece[from] = EMPTY;
    232.         i = 0;
    233.         for (k=kingpalace[i]; piece[k]!=KING; k++) ;
    234.         for (k += SIZE_X; k<BOARD_SIZE && piece[k]==EMPTY; k += SIZE_X);
    235.         if (piece[k]==KING) r = 1;
    236.         piece[from] = piece[dest]; piece[dest] = t;
    237.     }
    238.     return r;
    239. }
    240.  
    241. void Gen_push(short from, short dest)
    242. {
    243.     if (!KingFace(from, dest)) {
    244.         gen_dat[gen_end[ply]].m.from = from;
    245.         gen_dat[gen_end[ply]].m.dest = dest;
    246.         gen_end[ply]++;
    247.     }
    248. }
    249.  
    250.  
    251. void Gen(void)
    252. {
    253.     short i, j, k, n, p, x, y, t, fcannon;
    254.  
    255.     gen_end[ply] = gen_begin[ply];
    256.  
    257.     for(i=0; i < BOARD_SIZE; i++)
    258.         if (color[i]==side) {
    259.             p = piece[i];
    260.             for(j=0; j<8; j++) {
    261.                 if (!offset[p][j]) break;
    262.                 x = mailbox90[i]; fcannon = 0;
    263.                 if (p==ROOK || p==CANNON) n = 9; else n = 1;
    264.                 for (k=0; k<n; k++) {
    265.                     if (p==PAWN && side==LIGHT) x -= offset[p][j]; else x += offset[p][j];
    266.  
    267.                     y = mailbox182[x];
    268.                     if (side == DARK) t = y; else t = 89-y;
    269.                     if (y==-1 || (legalposition[t] & maskpiece[p])==0) break;
    270.                     if (!fcannon) {
    271.                         if (color[y]!=side)
    272.                             switch (p) {
    273.                             case KNIGHT: if (color[i+knightcheck[j]]==EMPTY) Gen_push(i, y); break;
    274.                             case ELEPHAN:if (color[i+elephancheck[j]]==EMPTY) Gen_push(i, y); break;
    275.                             case CANNON: if (color[y]==EMPTY) Gen_push(i, y); break;
    276.                             default: Gen_push(i, y);
    277.                             }
    278.                         if (color[y]!=EMPTY) { if (p==CANNON) fcannon++; else break; }
    279.                     }
    280.                     else {  /* CANNON switch */
    281.                         if (color[y] != EMPTY) {
    282.                             if (color[y]==xside) Gen_push(i, y);
    283.                             break;
    284.                         }
    285.                     }
    286.                 } /* for k */
    287.             } /* for j */
    288.     }
    289.  
    290.     gen_end[ply+1] = gen_end[ply]; gen_begin[ply+1] = gen_end[ply];
    291.     brandtotal += gen_end[ply] - gen_begin[ply]; gencount++;
    292. }
    293.  
    294.  
    295. /***** MOVE *****/
    296. short MakeMove(move m)
    297. {
    298.     short from, dest, p;
    299.     nodecount++;
    300.     from = m.from; dest = m.dest;
    301.     hist_dat[hdp].m = m; hist_dat[hdp].capture = p = piece[dest];
    302.     piece[dest] = piece[from]; piece[from] = EMPTY;
    303.     color[dest] = color[from]; color[from] = EMPTY;
    304.     hdp++; ply++; side = xside; xside = 1-xside;
    305.     return p == KING;
    306. }
    307.  
    308.  
    309. void UnMakeMove(void)
    310. {
    311.     short from, dest;
    312.     hdp--; ply--; side = xside; xside = 1-xside;
    313.     from = hist_dat[hdp].m.from; dest = hist_dat[hdp].m.dest;
    314.     piece[from] = piece[dest]; color[from] = color[dest];
    315.     piece[dest] = hist_dat[hdp].capture;
    316.     if (piece[dest] == EMPTY) color[dest] = EMPTY; else color[dest] = xside;
    317. }
    318.  
    319.  
    320. short UpdateNewMove(void)
    321. {
    322.     short from, dest, p;
    323.     from = newmove.from; dest = newmove.dest; p = piece[dest];
    324.     piece[dest] = piece[from]; piece[from] = EMPTY;
    325.     color[dest] = color[from]; color[from] = EMPTY;
    326.     DrawCell(from, NORMAL); DrawCell(dest, NORMAL);
    327.     return p == KING;
    328. }
    329.  
    330.  
    331. /***** EVALUATE *****/
    332. short Eval(void)
    333. {
    334.     static short piecevalue[7] = {10, 20, 20, 40, 45, 90, 1000};
    335.     short   i, s = 0;
    336.     for (i=0; i<BOARD_SIZE; i++)
    337.         if (color[i]==side) s += piecevalue[piece[i]];
    338.         else if (color[i]==xside) s -= piecevalue[piece[i]];
    339.     return s;
    340. }
    341.  
    342.  
    343. /***** SEARCH *****/
    344. /* Search game tree by alpha-beta algorith */
    345. short AlphaBeta(short alpha, short beta, short depth)
    346. {
    347.     short i, value, best;
    348.  
    349.     if (!depth) return Eval();
    350.  
    351.     Gen();
    352.     best = -INFINITY;
    353.  
    354.     for (i=gen_begin[ply]; i<gen_end[ply] && best<beta; i++) {
    355.         if (best > alpha) alpha = best;
    356.  
    357.         if (MakeMove(gen_dat[i].m)) value = 1000-ply;
    358.         else value = -AlphaBeta(-beta, -alpha, depth-1);
    359.         UnMakeMove();
    360.  
    361.         if (value > best) {
    362.             best = value; if (!ply) newmove = gen_dat[i].m;
    363.         }
    364.     }
    365.  
    366.     return best;
    367. }
    368.  
    369.  
    370. /***** THINK *****/
    371. /* Call AlphaBeta short && display some information */
    372. void ComputerThink(void)
    373. {
    374.     short best;
    375.     tickstart = *systicks; nodecount = 0;
    376.     best = AlphaBeta(-INFINITY, INFINITY, MAX_PLY);
    377.     /* Display some information */
    378.     tickend = *systicks; textcolor(7);
    379.     gotoxy(50, 4); printf("Depth            : %d", MAX_PLY);
    380.     gotoxy(50, 5); printf("Node total       : %ld ", nodecount);
    381.     gotoxy(50, 6); printf("Brand factor     : %.2f ", (float)brandtotal/gencount);
    382.     gotoxy(50, 7); printf("Time (second)    : %.2f ", (tickend-tickstart)/18.23);
    383.     gotoxy(50, 8); printf("Nodes per second : %ld ", (long)(nodecount*18.23/(tickend-tickstart+1)));
    384.     gotoxy(50, 9); printf("Score            : %d ", best);
    385.     gotoxy(50,11); printf("Computer move    : %c%d%c%d ", (char)(newmove.from%SIZE_X+65), (short)(SIZE_X-newmove.from/SIZE_X),
    386.                                                 (char)(newmove.dest%SIZE_X+65), (short)(SIZE_X-newmove.dest/SIZE_X));
    387. }
    388.  
    389.  
    390. /***** MAIN BLOCK *****/
    391.  main(void)
    392. {
    393.     InitGen(); DrawBoard(); side = DARK; xside = LIGHT; computerside = DARK;
    394.  
    395.     do {
    396.         if (side == computerside) ComputerThink();
    397.         else if (GetHumanMove()) break;
    398.         side = xside; xside = 1-xside;
    399.     } while (!UpdateNewMove());
    400. }

    Làm thế nào để chạy đồ họa với hình các quân cờ và bàn cờ thay cho các ký tự của màn hình console??? Nếu có thể các bạn demo giúp cái source code thì tốt quá!!!
    Đã được chỉnh sửa lần cuối bởi thanhnam46 : 20-05-2009 lúc 09:51 AM.
    NO

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Cái này bạn cần hiểu nó làm như thế nào và chuyển sang đồ họa thôi. Không khó nhưng mất thời gian, cho nên sẽ không ai giúp bạn được ngoài bạn hoặc tiền của bạn. Nần chuyển trả tiền sẽ có người làm cho bạn.
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    Ngày gia nhập
    03 2008
    Bài viết
    22

    Thanks admin!!! cái code console mình cũng hiểu sơ sơ rùi, nhưng mờ mình cũng chưa từng chuyển qua đồ họa cho chương trình console bao giờ nên thấy khó khăn quá :(
    NO

Các đề tài tương tự

  1. code chuyển từ hệ thập phân sang cơ số 2
    Gửi bởi kdtuan trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 1
    Bài viết cuối: 16-03-2013, 07:59 AM
  2. Làm thế nào để chuyển hình ảnh Đồ Hoạ sang hình ảnh Console
    Gửi bởi thonght trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 4
    Bài viết cuối: 06-06-2012, 10:28 PM
  3. chuyển n sang hệ cơ số bất kì [ giải thích code]
    Gửi bởi thangit trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 30-08-2009, 05:42 PM
  4. Đoạn code vb.net này chuyển sang C# như thế nào ?
    Gửi bởi himylove trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 4
    Bài viết cuối: 09-06-2009, 09:33 PM
  5. Muốn chuyển đoạn code sau từ VB sang C# như thế nào
    Gửi bởi boyhotasia trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 2
    Bài viết cuối: 31-10-2007, 10:23 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn