# Đề tài: Code game Con rắn trong Text mode

1. Thành viên mới
Ngày gia nhập
02 2007
Bài viết
27

## Code game Con rắn trong Text mode

Đây là game Rắn săn mồi viết trong Text mode , vì em mới làm quen với C nên ko biết xài Graphic.

C Code:
1. /*    SNAKE GAME
2.    DHDL Van Lang
3.    Class: K12T1
4.    Total size: 8.5 KB
5. */
6.
7. #include<stdio.h>
8. #include<conio.h>
9. #include<dos.h>
10. #include<stdlib.h>
11. #include<ctype.h>
12. #include<time.h>
13.
14. // Directions of the Snake
15. #define GO_UP     1
16. #define GO_DOWN   2
17. #define GO_RIGHT -1
18. #define GO_LEFT  -2
19.
20. //Arrow keys' code
21. #define BT_UP    0x48 // button UP has code 0x48
22. #define BT_DOWN  0x50
23. #define BT_RIGHT 0x4d
24. #define BT_LEFT  0x4b
25.
26. //Limits
27. #define TOP_LIM   3
28. #define BOT_LIM   20  //Bottom limit
29. #define LEFT_LIM  1
30. #define RIGHT_LIM 40
31.
32. #define len       3  //At the beginning, the Snake has 3 dots.
33.
34. //Declarations
35. typedef struct coord
36. {
37.     int x;
38.     int y;
39. } Point;
40.
41. Point Snake[100]={LEFT_LIM+1,TOP_LIM+1,LEFT_LIM+1,TOP_LIM+1,LEFT_LIM+1,TOP_LIM+1}; //Define the Snake
42. int intNew_len = len;
43. int intHead    = len-1;    //its head is the 3th dot
44. int intTail    = 0;        //its tail is the first dot
45. int intDir     = GO_RIGHT; //At the beginning, the Snake's direction is to the RIGHT.
46. int intScore   = 0;        //Eating one food, gaining one score, 10 scores for 1 level.
47. int intLevel   = 1;        //if level+1,the speed will increase.
48. int intAmount  = 10;       //if score > amount, level+1, amount+10
49. int intSpeed   = 300;      //speed of the Snake, less -> faster, more -> slower
50. char chrPress  = BT_RIGHT; //pressed button;
51.
52. // Prototypes
53. void drawYard(void);       // Draw playing yard
54. int  onSnake(Point point); // Check whether a point is on the Snake
55. void setLevel(void);       // Increase level
56. void scoreCount(void);     // Count score
57. void drawFood(void);       // Generate food
58. void eatFood(void);        // Snake eats food
59. void drawSnake(void);      // Draw beginning Snake
60. void newHeadTail(void);    // After each move, the tail and head's positions are changed
61. void moveSnake(char c);    // Make the Snake run
62. int  checkStatus(int tempX,int tempY); // Check whether the Snake dies or not
63. void refreshSnake(void);  // Snake after re-play
64. void refreshScore(void); // Score after re-play
65. void Dead(void);         // when the Snake dies
66. char quitGame(void);     // say good bye
67.
68.
69. void main()
70. {
71.     clrscr();
72.     drawYard();
73.     randomize();
74.     drawFood();
75.     drawSnake();
76.     while(1)
77.         {
78.          play:
79.
80.          while (!kbhit()) //While no key pressed
81.             {
82.                 moveSnake(chrPress);
84.                    {
86.                      chrPress=BT_RIGHT;
87.                      intDir = GO_RIGHT;//When re-play,the snake runs to the right
88.                    }
89.                 delay(intSpeed);
90.
91.             }
92.          chrPress= getch();
93.          if(chrPress==0xd)
94.             {
95.             chrPress= quitGame();
96.             if(chrPress=='N') goto play;
97.             else if(chrPress=='Y')
98.                     {
99.                         clrscr();
100.                         printf("Bye! Bye!");
101.                         delay(500);
102.                         exit(1);}
103.             }
104.         }
105. }
106.
107.
108. void drawYard() //Draw playing yard
109. {
110.     register int i;
112.     gotoxy(LEFT_LIM,TOP_LIM-2);
113.     printf("Created by Chau Nguyen Thanh Vu~ T06-3546 K12T01");
114.
115.     // Ve ÉÍÍÍÍÍÍÍÍÍ»
116.     gotoxy(LEFT_LIM, TOP_LIM); // (10,5)
117.     printf("%c",201); // Top left corner É
118.
119.     for(i=LEFT_LIM+1; i<RIGHT_LIM; i++)
120.         {
121.           gotoxy(i,TOP_LIM);
122.           printf("%c",205);    //Top horizonal line Í
123.         }
124.
125.     printf("%c",187); // Top right corner »
126.
127.
128.     //Ve ÈÍÍÍÍÍÍÍÍÍÍ¼
129.     gotoxy(LEFT_LIM, BOT_LIM); //(10,40)
130.     printf("%c",200); // Bottom left corner È
131.
132.     for(i=LEFT_LIM+1; i<RIGHT_LIM; i++)
133.         printf("%c",205);  // Bottom horizonal line  Í
134.
135.     printf("%c",188); //Bottom right corner ¼
136.
137.     for(i=TOP_LIM+1; i<BOT_LIM; i++)
138.         {
139.           gotoxy(LEFT_LIM,i);
140.           printf("%c",186); // Left vertical line º
141.
142.         }
143.
144.
145.     for(i=TOP_LIM+1; i<BOT_LIM; i++)
146.         {
147.           gotoxy(RIGHT_LIM,i);
148.           printf("%c",186); // Right vertical line º
149.         }
150.
151.     //Instructions
152.     gotoxy(RIGHT_LIM+2,TOP_LIM);
153.     printf("Press any ARROW key to play");
154.     gotoxy(RIGHT_LIM+2,TOP_LIM+2);
155.     printf("Press ENTER to exit \n");
156.     gotoxy(RIGHT_LIM+2,TOP_LIM+6);
157.     printf("Speed: %3.d milisecs/step",intSpeed);
158.
159.     //Title
160.     gotoxy(LEFT_LIM+5,TOP_LIM);
161.     printf(" Level %d ",intLevel);
162.     gotoxy(LEFT_LIM+25,TOP_LIM);
163.     printf(" Score %d ",intScore);
164. }
165.
166.
167. int onSnake(Point point)// Check whether a point is on the Snake
168. {
169.  register int i;
170.  for(i=0;i<intNew_len-1;i++)
171.     if( (point.x == Snake[i].x)&&(point.y == Snake[i].y) )
172.         return 1;
173.  return 0;
174. }
175.
176.
177. void setLevel()
178. {
179.     intScore++;
180.
181.     if ( (intScore>=intAmount)&&
182.          (intLevel<7) )         //Max level is 7, the Snake run crazily.
183.         {
184.          intAmount+= 10;
185.          intLevel++;
186.          intSpeed -= 49 ; //Decrease delay time, increase speed
187.         }
188.     if (intLevel == 7)
189.         {
190.           gotoxy(LEFT_LIM+14,TOP_LIM);
191.           printf("(Max)");
192.         }
193.     gotoxy(LEFT_LIM+25,TOP_LIM);
194.     printf(" Score: %d ",intScore);
195.     gotoxy(LEFT_LIM+5,TOP_LIM);
196.     printf(" Level %d ",intLevel);
197.     gotoxy(RIGHT_LIM+2,TOP_LIM+6);
198.     printf("Speed: %3.d milisecs/step",intSpeed);
199. }
200.
201. Point food = Snake[intHead];
202. void drawFood()
203. {
204.
205.  while( (onSnake(food) != 0)||(food.x == 0) )
206.         /* If food appears on the snake's body,
207.            it must be re-generated until it appears
208.            somewhere else */
209.     {
210.         food.x = LEFT_LIM+2+random(RIGHT_LIM - LEFT_LIM-3);
211.         food.y = TOP_LIM+2+random(BOT_LIM - TOP_LIM-3);
212.     }
213.  gotoxy(food.x,food.y);
214.  textcolor(CYAN);
215.  cprintf("*");
216.  return;
217. }
218.
219.
220. void eatFood()
221. {
222.  intNew_len++;
224.  Snake[intHead].x = food.x;
225.  Snake[intHead].y = food.y;
226.  gotoxy(food.x,food.y);
227.  textcolor(WHITE);
228.  cprintf("@");
229.  food = Snake[intHead-1]; // Put food on the snake's body, so that
230.                        //   the drawFood() function can run
231.  setLevel();
232.  drawFood();
233.  return;
234. }
235.
236.
237. void drawSnake() //At the beginning, the snake is a POINT.
238. {
239.  gotoxy(LEFT_LIM+1,TOP_LIM+1);
240.  printf("@");
241.  gotoxy(LEFT_LIM,TOP_LIM);
242. }
243.
244.
245. void newHeadTail() /* After each move, the intHead and the tail's positions
246.                         are changed. */
247. {
248.     register int i;
249.     for(i=0;i<intNew_len-1;i++)
250.         Snake[i]= Snake[i+1];
251. }
252.
253.
254. char chrLast_button; //the last button pressed
255.
256. void moveSnake(char chrButton)
257. {
258.  int arrow_pressed=0;
259.
260.  while( arrow_pressed!=1 )
261.     {
262.        if(
263.             (chrButton==BT_UP)||
264.             (chrButton==BT_DOWN)||
265.             (chrButton==BT_LEFT)||
266.             (chrButton==BT_RIGHT)
267.           )
268.          {
269.             gotoxy(Snake[intTail].x,Snake[intTail].y); //Erase the tail
270.             textcolor(BLACK);
271.             cprintf(" ");
272.
274.
275.             switch (chrButton)
276.               {
277.                 case BT_UP:
278.                     if( (intDir!=GO_DOWN)) /* While the Snake is going DOWN,
279.                                               it cannot go UP. */
280.                         {
281.                             if ( (Snake[intHead].y-1 == food.y)&&
282.                                  (Snake[intHead].x == food.x) )
283.                               {
285.                                 eatFood();
286.                               }
287.
289.                             intDir = GO_UP;
290.                         }
291.                     else Snake[intHead].y +=1;
292.                     break;
293.
294.
295.                 case BT_DOWN:
296.                     if( (intDir!=GO_UP) )
297.                         {
298.                             if ( (Snake[intHead].y+1 == food.y)&&
299.                                  (Snake[intHead].x == food.x) )
300.                               {
302.                                 eatFood();
303.                               }
304.
306.                             intDir = GO_DOWN;
307.                         }
308.                     else Snake[intHead].y -=1;
309.                     break;
310.                 case BT_LEFT:
311.                     if( (intDir!=GO_RIGHT) )
312.                         {
313.                             if ( (Snake[intHead].x-1 == food.x)&&
314.                                  (Snake[intHead].y == food.y) )
315.                               {
317.                                 eatFood();
318.                               }
319.
321.                             intDir = GO_LEFT;
322.                         }
323.                     else Snake[intHead].x +=1;
324.                     break;
325.                 case BT_RIGHT:
326.                     if( (intDir!=GO_LEFT) )
327.                         {
328.                             if ( (Snake[intHead].x+1 == food.x)&&
329.                                  (Snake[intHead].y == food.y) )
330.                               {
332.                                 eatFood();
333.                               }
334.
336.                             intDir = GO_RIGHT;
337.                         }
338.                     else Snake[intHead].x -=1;
339.                     break;
340.               }
341.             chrLast_button = chrButton; //Remember the last ARROW key
343.             textcolor(WHITE);
344.             cprintf("@");
345.             gotoxy(LEFT_LIM,TOP_LIM);
346.             arrow_pressed=1;
347.          }
348.        else chrButton = chrLast_button; /* If the pressed key is not ARROW key,
349.                             the snake uses the last ARROW key */
350.     }
351. }
352.
353.
354. int checkStatus(int tempX,int tempY)
355. {
356.     if( (tempX <= LEFT_LIM)||
357.         (tempX >= RIGHT_LIM) ||
358.         (tempY <= TOP_LIM) ||
359.         (tempY >= BOT_LIM) )
360.        return 1; //The snake dies if it hits the wall.
361.     else if( onSnake(Snake[intHead])==1) return 1; //It dies if bite itself
362.     else return 0;
363. }
364.
365.
366. void refreshSnake()
367. {
368.   register int i;
369.   intNew_len = 3;
370.   intHead    = 2;
371.   intTail    = 0;
372.   intSpeed   = 300;
373.   for(i=0;i<intNew_len;i++) //Return the Snake to the beginning
374.     {
375.         Snake[i].x = LEFT_LIM+1;
376.         Snake[i].y = TOP_LIM+1;
377.     }
378. }
379.
380. void refreshScore()
381. {
382.   intLevel   = 1;
383.   intScore   = 0;
384.   intAmount  = 10;
385. }
386.
387.
389. {
390.     char chrAns;
391.     gotoxy(LEFT_LIM+2,BOT_LIM+2);
392.     printf("You are lose. Play Again?(Y/N)");
393.     do {
394.           chrAns = toupper(getch());
395.         }
396.     while (chrAns != 'N' && chrAns != 'Y');
397.     if (chrAns=='N')
398.         {
399.           clrscr();
400.           printf("Bye Bye!");
401.           delay(500);
402.           exit(1);
403.         }
404.     else
405.         {
408.             refreshScore();
409.             refreshSnake();
410.             clrscr();
411.             drawYard();
412.             drawFood();
413.             drawSnake();
414.             return ;
415.         }
416.
417. }
418.
419.
420. char quitGame()
421. {
422.  char chrAns;
423.  gotoxy(LEFT_LIM+2, BOT_LIM+2);
424.  printf("Are you sure?(Y/N)");
425.  do
426.  {
427.    chrAns = toupper(getch());
428.  }
429.  while (chrAns!= 'Y' && chrAns!='N');
430.  gotoxy(LEFT_LIM+2, BOT_LIM+2);
431.  printf("                  ");
432.  return chrAns;
433. }

2. Thành viên mới
Ngày gia nhập
02 2007
Bài viết
27
Game Gỡ bom (Mine Sweeper), ăn cắp bản quyền của Windows, tất nhiên không hoàn toàn giống.

C Code:
1. /*
2.  * Game: Mine Sweeper
3.  * DHDL Van Lang
4.  * Class: K12T01
5.  * Total size: 12.0 KB
6. */
7.
8. #include <stdio.h>
9. #include <conio.h>
10. #include <stdlib.h>
11.
12. void menu();//Choose level
13. void frame(int color);// Playing frame
14. int exist(int **bomb, int row, int x, int y);//not 2 bombs in 1 cell
15. void makeBomb(int **&board, int range, int BombQuantity);//Generate bombs
16. void fillBoard(int **&board, int row, int col);//Fill other cells
17. void showBoard(int **board);//Show all cells
18. void showCell(int **board, int row, int col);//Show selected cell
19. void hideBoard(); //Hide al cells
20. int openBoard(int **board,int i, int j);
21. void openMass(int **board,int i, int j);//Open all non-bomb cell
22. int play(int **&board, char c,int &i,int &j,int &cursorLeft, int &cursorTop);
23. void death(int **board);//Win or lose
24. void lockBomb(int **&board,int i,int j);//Set a flag on the bomb
25.
26.
27. int top=7,left=5,bot,right,lose=0,flag;
28. int BombNumber, Quantity;//when Quantity goes to 0, you win
29.
30. void main()
31. {
32.     int **board,i,j;
33.     char c=0;
35.
36.     beginning:
37.     clrscr();
38.     lose=0;
39.     Quantity=BombNumber;
40.
41.     //creat dynamic matrix
42.     board= (int**)calloc((bot-top)/2, sizeof(int*));
43.     for(i=0; i<bot-top; i++)
44.         board[i]= (int*)calloc((right-left), sizeof(int));
45.
46.     //Set value for **board
47.     for(i=0; i<(bot-top)/2; i++)
48.         for(j=0; j<(right-left)/2; j++)
49.             board[i][j]=-10; // -10 : no bomb && closed
50.
51.     frame(WHITE);//Draw WHITE frame
52.     makeBomb(board,(right-left)/2,BombNumber);
53.     /*
54.         (right-left)/2
55.         For example:  |_|_|_|
56.         right-left=6, but there are 3 cells
57.     */
58.
59.     fillBoard(board,(bot-top)/2,(right-left)/2);
60.     hideBoard();
61.
62.     int cursorLeft=left+1, cursorTop=top+1;//Cursor
63.     i=0;
64.     j=0;
65.
66.     gotoxy(cursorLeft,cursorTop);
67.     textbackground(GREEN);
68.     showCell(board,cursorTop-top-1,cursorLeft-left-1);
69.
70.     do
71.       {
72.         flushall();
73.         c=getch();
74.         if(play(board,c,i,j,cursorLeft,cursorTop)==0) goto beginning;
75.
76.       }
77.     while(c!=0xd);//play until button ENTER is pressed
78.
79.     //free the matrix
80.     for(j=0; j<(right-left)/2; j++)
81.         free(board[j]);
82.     free(board);
83. }
84.
85.
87. {
88.     char c;
89.     clrscr();
90.     textcolor(WHITE);
91.     gotoxy(21,8);
92.     cprintf("MINE SWEEPER");
93.     gotoxy(20,10);
94.     cprintf("1. Beginner (Moi tap choi)");
95.
96.     gotoxy(20,12);
97.     cprintf("2. Experienced (Da biet choi)");
98.
99.     gotoxy(20,14);
100.     cprintf("3. Professional (Cao thu)");
101.
102.     gotoxy(20,16);
103.     cprintf("0. Quit ");
104.     gotoxy(20,18);
105.     cprintf("Chon cap do: ");
106.     do
107.       {
108.             c=getch();
109.       }
110.     while(c<'0' || c>'3');
111.
112.     switch(c)
113.         {
114.             case '1': bot=top+16; right=left+16; BombNumber=5; break;
115.             case '2': bot=top+22; right=left+22; BombNumber=20; break;
116.             case '3': bot=top+30; right=left+30; BombNumber=10; break;
117.             case '0': return;
118.         }
119. }
120.
121. int play(int **&board, char c,int &i,int &j,int &cursorLeft, int &cursorTop)
122. {
123.     switch(c)
124.             {
125.                 case 0x48://button UP
126.                             if(cursorTop>top+1)
127.                                 {
128.                                     gotoxy(cursorLeft,cursorTop);
129.                                     textbackground(BLACK);
130.                                     showCell(board,i,j);
131.                                     /* Because the cursor is GREEN
132.                                         before it leaves a cell, we must
133.                                         set textbackgound(BLACK)
134.                                     */
135.                                     cursorTop-=2;//set new position of the cursor
136.                                     i--;
137.                                 }
138.                             break;
139.
140.                 case 0x50://button DOWN
141.                             if(cursorTop<bot-1)
142.                                 {
143.                                     gotoxy(cursorLeft,cursorTop);
144.                                     textbackground(BLACK);
145.                                     showCell(board,i,j);
146.                                     cursorTop+=2;
147.                                     i++;
148.                                 }
149.                             break;
150.                 case 0x4d://button RIGHT
151.                             if(cursorLeft<right-1)
152.                                 {
153.                                     gotoxy(cursorLeft,cursorTop);
154.                                     textbackground(BLACK);
155.                                     showCell(board,i,j);
156.                                     cursorLeft+=2;
157.                                     j++;
158.                                 }
159.                             break;
160.                 case 0x4b://button LEFT
161.                             if(cursorLeft>left+1)
162.                                 {
163.                                     gotoxy(cursorLeft,cursorTop);
164.                                     textbackground(BLACK);
165.                                     showCell(board,i,j);
166.                                     cursorLeft-=2;
167.                                     j--;
168.                                 }
169.                             break;
170.                 case 0x3b:/* button F1*/
171.                                 return 0;
172.
173.                 case 0x3e:/*button F4*/
174.                                 if(openBoard(board,i,j))
175.                                     {
176.                                         lose=1;
177.                                         death(board);
178.                                     }
179.                                 break;
180.
181.                 case 0x3f:/*button F5*/
182.                                 lockBomb(board,i,j);break;
183.
184.                 case 0x42:/*button F8*/
185.                                 lose=1; death(board); break;
186.
187.             }
188.     //move the cursor
189.     gotoxy(cursorLeft,cursorTop);
190.     textbackground(GREEN);
191.     showCell(board,i,j);
192.     textbackground(BLACK);
193.     gotoxy(1,1);
194.     return 1;
195. }
196.
197.
198. void frame(int color)
199. {
200.     register int i,j;
202.     textcolor(color);
203.     gotoxy(5,top-5);
204.     cprintf("Created by Chau Nguyen Thanh Vu~ T06-3546 K12T01");
205.
206.     flag=BombNumber;//Available flags
207.     textcolor(LIGHTCYAN);
208.     gotoxy(left+5,top-3);
209.     cprintf("Flags: %d",flag);
210.
211.     //Draw grid
212.     for(i=0; i<bot-top; i++)
213.         for(j=0; j<right-left-1; j++)
214.             {
215.                 gotoxy(left+1+j,top+1+i);
216.                 textcolor(LIGHTGRAY);
217.                 if(i%2!=0 && j%2!=0)cprintf("%c",197); //draw Å
218.                 else if(i%2!=0) cprintf("%c",196);//draw Ä
219.                 else if(j%2!=0) cprintf("%c",179);//draw ³
220.             }
221.
222.     textcolor(WHITE);
223.     // Ve ÉÍÍÍÍÍÍÍÍÍ»
224.     gotoxy(left,top);
225.     cprintf("%c",201); // Top left corner É
226.
227.     for(i=left+1; i<right; i++)
228.         {
229.           gotoxy(i,top);
230.           cprintf("%c",205);    //Top horizonal line Í
231.         }
232.
233.     cprintf("%c",187); // Top right corner »
234.
235.
236.     //Ve ÈÍÍÍÍÍÍÍÍÍÍ¼
237.     gotoxy(left,bot); //(10,40)
238.     cprintf("%c",200); // Bottom left corner È
239.
240.     for(i=left+1; i<right; i++)
241.         cprintf("%c",205);  // Bottom horizonal line  Í
242.
243.     cprintf("%c",188); //Bottom right corner ¼
244.
245.     for(i=top+1; i<bot; i++)
246.         {
247.           gotoxy(left,i);
248.           cprintf("%c",186); // Left vertical line º
249.
250.         }
251.
252.
253.     for(i=top+1; i<bot; i++)
254.         {
255.           gotoxy(right,i);
256.           cprintf("%c",186); // Right vertical line º
257.         }
258.
259.     //Number row
260.     for(i=0,j=1; i<bot-top; i+=2,j++)
261.         {
262.             gotoxy(left-2,top+1+i);
263.             cprintf("%2.d",j);
264.         }
265.
266.     //Alphabet column
267.     for(i=0,j=65; i<right-left; i+=2,j++)
268.         {
269.             gotoxy(left+i,top-1);
270.             cprintf("%2.c",j);
271.         }
272.
273.     //Instructions
274.     textcolor(WHITE);
275.     gotoxy(right+2,top+1); cprintf("F1: New Game (Choi lai)");
276.     gotoxy(right+2,top+3); cprintf("F4: Open cell (Mo o^)");
277.     gotoxy(right+2,top+5); cprintf("F5: Lock bomb (Kho'a bom)");
278.     gotoxy(right+2,top+7); cprintf("F8: Resign (chiu thua)");
279.     gotoxy(right+2,top+10); cprintf("Use ARROW keys to move");
280.     gotoxy(right+2,top+12); cprintf("Press ENTER to QUIT");
281.
282. }
283.
284.
285. int exist(int **bomb, int row, int x, int y)
286. {//check whether 2 bombs in 1 cell
287.     for(int i=0; i<row; i++)
288.         if(bomb[i][0]==x && bomb[i][1]==y) return 1;
289.     return 0;
290. }
291.
292.
293. void makeBomb(int **&board, int range, int BombQuantity)
294. {
295.     int i,j,x,y;
296.     randomize();
297.
298.     //Dynamic matrix
299.     int **bomb;
300.     bomb=(int**)calloc(BombQuantity,sizeof(int*));
301.     for(i=0; i<BombQuantity; i++)
302.         bomb[i]= (int*)calloc(2,sizeof(int));
303.
304.     for(i=0; i<BombQuantity;i++)
305.        {
306.            do
307.            {
308.                 //range from 0 -> (right-left)/2
309.                 x= random(range);
310.                 y= random(range);
311.            }
312.            while(exist(bomb,BombQuantity,x,y)==1);//2 bomb not 1 place
313.             bomb[i][0]=x;
314.            bomb[i][1]=y;
315.             board[x][y]=-9;// -9 : 1 bomb && closed
316.         }
317.
318.     //Free the matrix
319.     for(j=0; j<2; j++)
320.         free(bomb[j]);
321.     free(bomb);
322. }
323.
324.
325. void fillBoard(int **&board, int row, int col)
326. {
327.     int count,i,j;
328.     for(i=0; i<row; i++)
329.         for(j=0; j<col; j++)
330.             if(board[i][j]!=-9)
331.             {
332.                 count=0;
333.                 if(board[i-1][j]==-9) count++;
334.                 if(board[i+1][j]==-9) count++;
335.                 if(board[i][j-1]==-9) count++;
336.                 if(board[i][j+1]==-9) count++;
337.                 if(board[i-1][j-1]==-9) count++;
338.                 if(board[i-1][j+1]==-9) count++;
339.                 if(board[i+1][j-1]==-9) count++;
340.                 if(board[i+1][j+1]==-9) count++;
341.                 if(count==0) board[i][j]=-10; //-10: no bom && closed
342.                 else board[i][j]=-count;// count<0 means: closed
343.             }
344. }
345.
346.
347. void showBoard(int **board)
348. {
349.     for(int hang=0,i=0; i<(bot-top)/2;hang+=2,i++)
350.         for(int cot=0,j=0; j<(right-left)/2;cot+=2,j++)
351.             {
352.                 gotoxy(left+1+cot,top+1+hang);
353.                 showCell(board,i,j);
354.             }
355.
356. }
357.
358. void showCell(int **board, int row, int col)
359. {
360.     textcolor(LIGHTMAGENTA);
361.     if( (board[row][col]>=10 && lose==0)//lock selected cell
362.          ||(board[row][col]==11) )//locked bomb
363.             cprintf("%c",6);
364.
365.     else if(board[row][col]>=10 && board[row][col]!=11  && lose==1)
366.              { //locked, not bomb
367.                 textcolor(LIGHTRED);
368.                 cprintf("X");
369.              }
370.     else
371.         {
372.             textcolor(CYAN);
373.             switch(board[row][col])
374.                 {
375.                     case  -9: cprintf("?"); break; //-9: closed bomb
376.                     case -10: cprintf("?"); break; //-10: closed nothing
377.                     case   0: cprintf(" "); break; // 0: opened nothing
378.                     case   9:                      // 9: opened bomb
379.                               textcolor(LIGHTRED);
380.                               cprintf("*");
381.                               break;
382.                     default:
383.                               if(board[row][col]>0)
384.                                 { // >0 : opened number
385.                                     textcolor(LIGHTBLUE);
386.                                     cprintf("%d",board[row][col]);
387.                                     break;
388.                                 }
389.                               else//if(board[row][col]<0): closed
390.                                 {
391.                                     textcolor(CYAN);
392.                                     cprintf("?");
393.                                     break;
394.                                 }
395.                  }
396.         }
397. }
398.
399. void hideBoard()
400. {
401.     for(int i=top+1; i<bot; i+=2)
402.         for(int j=left+1; j<right; j+=2)
403.             {
404.                 gotoxy(j,i);
405.                 textcolor(CYAN);
406.                 cprintf("?");
407.             }
408. }
409.
410. int openBoard(int **board,int i, int j)
411. {
412.     int flag=0;
413.     if(board[i][j]==-9) return 1;//Open bomb, die!!
414.     else if(board[i][j]==-10)
415.         {
416.             openMass(board,i,j);//open all non-bomb cell
417.             flag=1;
418.         }
419.     else if(board[i][j]<0)  board[i][j]=-board[i][j];
420.     if(flag==1) showBoard(board);
421.     return 0;
422. }
423.
424. void openMass(int **board,int i, int j)
425. {
426.     if(board[i][j]==-10)// -10: non-bomb && closed
427.         board[i][j]=0;// 0: non-bomb && opened
428.
429.     if(board[i-1][j]==-10) openMass(board,i-1,j);
430.     if(board[i+1][j]==-10) openMass(board,i+1,j);
431.     if(board[i][j-1]==-10) openMass(board,i,j-1);
432.     if(board[i][j+1]==-10) openMass(board,i,j+1);
433.
434.     if(board[i-1][j]<0)/*If a numbered cell is next to
435.                                 a non-bomb cell, open that numbered cell */
436.             board[i-1][j]=-board[i-1][j];
437.
438.     if(board[i+1][j]<0)
439.             board[i+1][j]=-board[i+1][j];
440.
441.     if(board[i][j-1]<0)
442.             board[i][j-1]=-board[i][j-1];
443.
444.     if(board[i][j+1]<0)
445.             board[i][j+1]=-board[i][j+1];
446.
447.     return;
448. }
449.
450. void death(int **board)
451. {
452.     int hang,cot,i,j;
453.     for(i=0; i<(bot-top)/2;i++)
454.         for(j=0; j<(right-left)/2; j++)
455.             {
456.                 if(board[i][j]==-10) board[i][j]=0;//opend all non-bomb cells
457.                 if(board[i][j]<0) board[i][j]=-board[i][j];
458.                                         //opened all numbered cells
459.                                         //becase <0 : closed
460.                                         //       >0 : opened
461.             }
462.
463.     showBoard(board);
464.
465.     if(lose==1)// LOSE mode
466.         {
467.             gotoxy(left+16,top-3);
468.             textcolor(YELLOW);
469.             cprintf("BAN DA THUA ! NHAN F1 DE CHOI LAI.");
470.         }
471.     else// WIN mode
472.         {
473.             gotoxy(left+16,top-3);
474.             textcolor(YELLOW);
475.             cprintf("CHUC MUNG! BAN DA CHIEN THANG!");
476.         }
477.
478.     gotoxy(right+2, top+15);
479.     textcolor(LIGHTRED);
480.     cprintf("X");
481.     textcolor(WHITE);
482.     cprintf(": not a bomb (khong phai bom)");
483.
484.     gotoxy(right+2, top+17);
485.     textcolor(LIGHTRED);
486.     cprintf("*");
487.     textcolor(WHITE);
488.     cprintf(": a bomb (day la bom)");
489.
490.     gotoxy(right+2, top+19);
491.     textcolor(LIGHTMAGENTA);
492.     cprintf("%c",6);
493.     textcolor(WHITE);
494.     cprintf(": locked bomb (bom bi kho'a)");
495. }
496.
497. void lockBomb(int **&board,int i,int j)//locked or unlock selected cell
498. {
499.     if(board[i][j]<0 && flag>0)//only lock <0 cell (closed cell)
500.         {
501.             if(board[i][j]==-9) Quantity--; //if a bomb is locked
502.             /*Quantity of bomb is not shown
503.               it is the remaining bombs to defuse
504.               when it goes to 0, you win.*/
505. /* (1)*/ board[i][j]+=20;/*for example: board[i][j]=-1 -> board[i][j]=19
506.                                   19>0 : so it won't be opened by showCell()
507.                                   because showCell() only opens <0 cell*/
508.             flag--;
509.             textcolor(WHITE);
510.             gotoxy(left+12,top-3);
511.             cprintf("%2.1d",flag);
512.             if(Quantity==0)
513.                 {
514.                     lose=0;// you win
515.                     death(board);//show all cells in WIN mode
516.                 }
517.         }
518.     else if(board[i][j]>=10 && lose==0)
519.         {
520. /* (2)*/ board[i][j]-=20;
521.             /* In (1), board[i][j]=-1 -> board[i][j]=19;
522.                 In (2), board[i][j]=19 -> board[i][j]=-1;
523.                 => when the flag is removed,
524.                     board[i][j] returns to the previous value
525.             */
526.             if(board[i][j]==-9) Quantity++;//if a bomb is unlocked
527.             flag++;
528.             textcolor(WHITE);
529.             gotoxy(left+12,top-3);
530.             cprintf("%2.1d",flag);
531.         }
532. }

3. Thành viên mới
Ngày gia nhập
02 2007
Bài viết
27
Game Caro 2 người chơi,
Luật: 5 "con" là thắng, không cần phân biệt chặn đầu, bịt đuôi.

C Code:
1. /*
2.  * Game: CARO human v.s human
3.  * DHDL Van Lang
4.  * Class: K12T01
5.  * Total size: 7.62 KB
6. */
7.
8. #include <stdio.h>
9. #include <conio.h>
10. #include <stdlib.h>
11. #include <string.h>
12.
13. #define player1 -1
14. #define player2 1
15.
17. void showName();
18. void frame(int color);// Playing frame
19. void showCell(int **board, int i, int j);
20. int play(int **&board, char c,int &i,int &j,int &cursorLeft, int &cursorTop);
21. void newArea(int i,int j);
22. void check(int **board);//Win or lose
23.
24.
25. int top=7,left=5,bot=37,right=35,turn=player1, endGame=0;
26. int minTop=(bot-top)/2, maxRight=0;
27. int minLeft=(right-left)/2, maxBot=0;
28.      //Area in the matrix, which has been filled
29. char play1[30], play2[30];// players' name
30.
31. void main()
32. {
33.     int **board,i,j;
34.     char c=0;
36.
37.     beginning:
38.     clrscr();
39.     c=0;
40.     endGame=0;
41.
42.     //creat dynamic matrix
43.     board= (int**)calloc((bot-top)/2, sizeof(int*));
44.     for(i=0; i<bot-top; i++)
45.         board[i]= (int*)calloc((right-left), sizeof(int));
46.
47.     //Set value for **board, because calloc() works not perfectly
48.     for(i=0; i<(bot-top)/2; i++)
49.         for(j=0; j<(right-left)/2; j++)
50.             board[i][j]=0;
51.
52.     frame(WHITE);//Draw WHITE frame
53.
54.
55.     int cursorLeft=left+1, cursorTop=top+1;//Cursor
56.     i=0;
57.     j=0;
58.
59.     gotoxy(cursorLeft,cursorTop);
60.     textbackground(GREEN);
61.     showCell(board,cursorTop-top-1,cursorLeft-left-1);
62.
63.     do
64.       {
65.         flushall();
66.         showName();
67.         c=getch();
68.         if(play(board,c,i,j,cursorLeft,cursorTop)==0) goto beginning;
69.
70.       }
71.     while(c!=0xd);//play until button ENTER is pressed
72.
73.     //free the matrix
74.     for(j=0; j<(right-left)/2; j++)
75.         free(board[j]);
76.     free(board);
77.
78. }
79.
80.
82. {
83.     clrscr();
84.     textcolor(WHITE);
85.
86.     do
87.       {
88.             cprintf("Nhap ten nguoi choi thu 1 (toi da 20 ky tu): ");
89.             gets(play1);
90.       }
91.     while(strlen(play1)<=0 || strlen(play1)>20);
92.     do
93.       {
94.             cprintf("Nhap ten nguoi choi thu 2 (toi da 20 ky tu): ");
95.             gets(play2);
96.       }
97.     while(strlen(play2)<=0 || strlen(play2)>20);
98. }
99.
100.
101. void showName()
102. {
103.     textbackground(BLACK);
104.     textcolor(WHITE);
105.     gotoxy(right+2,top+2);
106.     cprintf("Luot di cua: ");
107.     for(int i=0; i<30; i++) printf(" ");//Erase last name
108.
109.     gotoxy(right+15,top+2);
110.     if(turn==player1)
111.         {
112.             textcolor(LIGHTRED);
113.             cprintf("%s (O)",play1);
114.         }
115.     else
116.         {
117.             textcolor(LIGHTCYAN);
118.             cprintf("%s (X)",play2);
119.         }
120. }
121.
122.
123. void frame(int color)
124. {
125.     register int i,j;
127.     textcolor(color);
128.     gotoxy(5,top-5);
129.     cprintf("Created by Chau Nguyen Thanh Vu~ T06-3546 K12T01");
130.
131.     //Draw grid
132.     for(i=0; i<bot-top; i++)
133.         for(j=0; j<right-left-1; j++)
134.             {
135.                 gotoxy(left+1+j,top+1+i);
136.                 textcolor(LIGHTGRAY);
137.                 if(i%2!=0 && j%2!=0)cprintf("%c",197); //draw Å
138.                 else if(i%2!=0) cprintf("%c",196);//draw Ä
139.                 else if(j%2!=0) cprintf("%c",179);//draw ³
140.             }
141.
142.     textcolor(WHITE);
143.     // Ve ÉÍÍÍÍÍÍÍÍÍ»
144.     gotoxy(left,top);
145.     cprintf("%c",201); // Top left corner É
146.
147.     for(i=left+1; i<right; i++)
148.         {
149.           gotoxy(i,top);
150.           cprintf("%c",205);    //Top horizonal line Í
151.         }
152.
153.     cprintf("%c",187); // Top right corner »
154.
155.
156.     //Ve ÈÍÍÍÍÍÍÍÍÍÍ¼
157.     gotoxy(left,bot); //(10,40)
158.     cprintf("%c",200); // Bottom left corner È
159.
160.     for(i=left+1; i<right; i++)
161.         cprintf("%c",205);  // Bottom horizonal line  Í
162.
163.     cprintf("%c",188); //Bottom right corner ¼
164.
165.     for(i=top+1; i<bot; i++)
166.         {
167.           gotoxy(left,i);
168.           cprintf("%c",186); // Left vertical line º
169.
170.         }
171.
172.
173.     for(i=top+1; i<bot; i++)
174.         {
175.           gotoxy(right,i);
176.           cprintf("%c",186); // Right vertical line º
177.         }
178.
179.     //Number row
180.     for(i=0,j=1; i<bot-top; i+=2,j++)
181.         {
182.             gotoxy(left-2,top+1+i);
183.             cprintf("%2.d",j);
184.         }
185.
186.     //Alphabet column
187.     for(i=0,j=65; i<right-left; i+=2,j++)
188.         {
189.             gotoxy(left+i,top-1);
190.             cprintf("%2.c",j);
191.         }
192.
193.     //Instructions
194.     textcolor(WHITE);
195.     gotoxy(right+2,top+5); cprintf("Ctrl-N: New Game (Choi lai)");
196.     gotoxy(right+2,top+11); cprintf("Use ARROW keys to move");
197.               gotoxy(right+2,top+13; cprintf("Press SPACE BAR to check");
198.     gotoxy(right+2,top+15); cprintf("Press ENTER to QUIT");
199.
200. }
201.
202.
203. int play(int **&board, char c,int &i,int &j,int &cursorLeft, int &cursorTop)
204. {
205.      switch(c)
206.             {
207.                 case 0x48://button UP
208.                             if(cursorTop>top+1)
209.                                 {
210.                                     gotoxy(cursorLeft,cursorTop);
211.                                     textbackground(BLACK);
212.                                     showCell(board,i,j);
213.                                     /* Because the cursor is GREEN
214.                                         before it leaves a cell, we must
215.                                         set textbackgound(BLACK)
216.                                     */
217.                                     cursorTop-=2;//set new position of the cursor
218.                                     i--;
219.                                 }
220.                             break;
221.
222.                 case 0x50://button DOWN
223.                             if(cursorTop<bot-1)
224.                                 {
225.                                     gotoxy(cursorLeft,cursorTop);
226.                                     textbackground(BLACK);
227.                                     showCell(board,i,j);
228.                                     cursorTop+=2;
229.                                     i++;
230.                                 }
231.                             break;
232.                 case 0x4d://button RIGHT
233.                             if(cursorLeft<right-1)
234.                                 {
235.                                     gotoxy(cursorLeft,cursorTop);
236.                                     textbackground(BLACK);
237.                                     showCell(board,i,j);
238.                                     cursorLeft+=2;
239.                                     j++;
240.                                 }
241.                             break;
242.                 case 0x4b://button LEFT
243.                             if(cursorLeft>left+1)
244.                                 {
245.                                     gotoxy(cursorLeft,cursorTop);
246.                                     textbackground(BLACK);
247.                                     showCell(board,i,j);
248.                                     cursorLeft-=2;
249.                                     j--;
250.                                 }
251.                             break;
252.                 case 0xe:/* hot key Ctrl-N*/
253.                                 return 0;
254.
255.                 case 0x20:/*button SPACE-BAR*/
256.                                 if(board[i][j]==0 && endGame!=1)
257.                                     {
258.                                         board[i][j]=turn;
259.                                         newArea(i,j);
260.                                         check(board);
261.                                         turn=-turn;
262.                                     }
263.                                 break;
264.
265.
266.             }
267.
268.     //move the cursor
269.     gotoxy(cursorLeft,cursorTop);
270.     textbackground(GREEN);
271.     showCell(board,i,j);
272.     textbackground(BLACK);
273.     return 1;
274. }
275.
276. //int minTop=(bot-top)/2, maxBot=0;
277. //int minLeft=(right-left)/2, maxRight=0;
278. void newArea(int i,int j)
279. {
280.     if(i<minTop) minTop=i;
281.     if(i>maxBot) maxBot=i;
282.
283.     if(j<minLeft) minLeft=j;
284.     if(j>maxRight) maxRight=j;
285.
286. }
287.
288.
289. void showCell(int **board, int i, int j)
290. {
291.     switch(board[i][j])
292.         {
293.             case -1: textcolor(LIGHTRED);
294.                         cprintf("O"); break;
295.
296.             case  0: cprintf(" ");
297.                         break;
298.             case  1:
299.                         textcolor(LIGHTCYAN);
300.                         cprintf("X");
301.                         break;
302.         }
303.
304. }
305.
306.
307. void check(int **board)//Win or lose
308. {
309.     int winner;
310.     for(int x= minTop; x<=maxBot; x++)
311.         for(int y= minLeft; y<=maxRight; y++)
312.             {
313.                 //Kiem tra doc
314.                 if(board[x][y]!=0 && board[x][y]==board[x+1][y])
315.                     {
316.                         int dem=2;
317.                         for(int z=x+2; z<=maxBot; z++)
318.                             if(board[z][y]==board[x][y])
319.                                 dem++;
320.                             else break;
321.
322.                         if(dem==5) { winner=turn; goto result; }
323.                         else winner=0;
324.                     }
325.
326.                 //Kiem tra ngang
327.                 else if(board[x][y]!=0 && board[x][y]==board[x][y+1])
328.                     {
329.                         int dem=2;
330.                         for(int z=y+2; z<=y+4; z++)
331.                             if(board[x][z]==board[x][y])
332.                                 dem++;
333.                         if(dem==5) { winner=turn; goto result; }
334.                         else winner=0;
335.                     }
336.
337.                 //Kiem tra cheo trai -> phai
338.                 else if(board[x][y]!=0 && board[x][y]==board[x+1][y+1])
339.                     {
340.                         int dem=2;
341.                         for(int z=2; z<=4; z++)
342.                             if(board[x+z][y+z]==board[x][y])
343.                                 dem++;
344.                         if(dem==5) { winner=turn; goto result; }
345.                         else winner=0;
346.                     }
347.
348.                 //Kiem tra cheo phai -> trai
349.                 else if(board[x][y]!=0 && board[x][y]==board[x-1][y+1])
350.                     {
351.                         int dem=2;
352.                         for(int z=2; z<=4; z++)
353.                             if(board[x-z][y+z]==board[x][y])
354.                                 dem++;
355.                         if(dem==5) { winner=turn; goto result; }
356.                         else winner=0;
357.                     }
358.             }
359.
360.     result:
361.     gotoxy(left+3,top-3);
363.     textbackground(BLACK);
364.     if(winner==player1)
365.         {
366.             cprintf("%s (O) DA CHIEN THANG!",strupr(play1));
367.             endGame=1;
368.         }
369.     else if(winner==player2)
370.                 {
371.                     cprintf("%s (X) DA CHIEN THANG!",strupr(play2));
372.                     endGame=1;
373.                 }
374. }

4. Ặc cái này tui viết lâu rồi , cái caro thì viết trên giấy vì lúc đó chưa có máy tính thầy bảo được rồi tui vứt cái code ở đâu mất nên không chuyển qua cái demo được , bi giờ đang cần để thử ứng dụng cái thuật toán tham lam nên chắc hôm nào ngồi viết lại , còn game con rắn tui viết dở ẹt tuy vậy còn nhiếu ý tưởng lắm , hôm nào U post cái file exe lên đây anh em đánh giá cho , còn cái exe của kid thì post lên lâu rồi hôm nào search thử góp ý lại nhé .

5. Thành viên mới
Ngày gia nhập
02 2007
Bài viết
27
Thuật toán tham lam là sao anh ?

6. ## Code game Con rắn trong Text mode

Đó còn là 1 tên khác của thuật toán vét cạn,... Bạn có thể lên google để tìm thêm thông tin về thuật toán này... ^_^

7. Awaiting Email Confirmation
Ngày gia nhập
02 2008
Bài viết
3
Cảm ơn nhiều

8. chrPress = getch();
cho mình hỏi cái hàm này là gì ?
nó có tương tự như getch(); k ?

9. Thành viên mới
Ngày gia nhập
08 2008
Bài viết
2
Mấy cái game trên lỗi tùm lum hết lun )
Coi lại đi mấy huynh

10. Thành viên mới
Ngày gia nhập
11 2008
Bài viết
3
sao mình paste vao borland c 5.02 thì nó báo là call to undefined function delay vậy, cái game con rắn đó

#### 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