码迷,mamicode.com
首页 > 其他好文 > 详细

五子棋项目

时间:2019-04-10 23:23:30      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:bat   add   结构体   元素   break   turn   二维数组   main   def   

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<time.h>
  4 #include<easyx.h>
  5 
  6 #define ROW 15
  7 #define COL 15
  8 #define SIZE 40
  9 /*
 10 
 11     1. 五子棋的规则  棋盘上  黑白棋走    
 12 
 13       棋盘--->二维数组  旗子    黑-1  白1  空白0
 14 
 15       判断输赢  连成5个  判断落子附近有没有成5个就行
 16 
 17       下棋   先白 然后黑   写一个函数 鼠标点击的位置 转换成数组的下标
 18         对应的元素有没有值   不赋值 视为无效操作
 19                         否则   下棋 
 20 
 21 
 22 
 23      悔棋  记录每一步的操作  
 24      判断棋盘满--->步数>=棋盘大小
 25      记录当前棋盘  存档  读档
 26      认输  可以设置一个键  按下这个键就认输
 27 
 28 
 29     游戏结束  1.一方成了5
 30              2.格子满了 无法放新的棋
 31 
 32 
 33 
 34     返回值只能返回一个数据 --->返回多个  数组?堆内存可以  或者结构体
 35 
 36 */
 37 typedef struct coor
 38 {
 39     int x;
 40     int y;
 41 }COOR;
 42 
 43 void drawMap(int map[][COL]);
 44 COOR play(int map[][COL],int flag);
 45 int judge(int map[][COL], int x, int y);
 46 
 47 int main()
 48 {
 49     int map[ROW][COL] = { 0 };
 50 
 51     initgraph(COL * SIZE, ROW * SIZE);
 52     COOR add;//得到点击的位置
 53 
 54     int flag = 1;
 55     while (1)
 56     {
 57         drawMap(map);
 58         add=play(map,flag);
 59 
 60         //判断游戏是否结束
 61         if (judge(map, add.x, add.y) == 1)
 62         {
 63             drawMap(map);
 64             //游戏结束
 65             if (flag == 1) //白赢了
 66             {
 67                 MessageBox(0, L"白win", L"good", MB_OK);
 68                 break;
 69             }
 70             else
 71             {
 72                 MessageBox(0, L"黑win", L"good", MB_OK);
 73                 break;
 74             }
 75         }
 76 
 77 
 78 
 79         flag = -flag;
 80     }
 81     
 82     getchar();
 83     closegraph();
 84     return 0;
 85 }
 86 
 87 void  drawMap(int map[][COL])
 88 {
 89     BeginBatchDraw();
 90     setbkcolor(RGB(32, 178, 170));
 91     cleardevice();
 92     //  竖着 20,20     20,20+40*COL
 93     for (int i = 0; i < ROW; ++i)//画横线
 94     {
 95         line(SIZE / 2 , SIZE / 2+ i*SIZE, SIZE*ROW-  SIZE / 2 ,SIZE/2+i*SIZE);
 96     }
 97     for (int j = 0; j <= COL; ++j)
 98     {
 99         line(j*SIZE-SIZE/2, SIZE/2, j*SIZE-SIZE/2, SIZE*COL -SIZE/2);
100     }
101 
102     for (int i = 0; i < ROW; ++i)
103     {
104         for (int j = 0; j < COL; ++j)
105         {
106             switch (map[i][j])
107             {
108             case -1://黑棋
109                 setfillcolor(BLACK);
110                 solidcircle(j*SIZE+SIZE/2, i*SIZE+SIZE/2, SIZE / 3);
111                 break;
112             case 1://白棋
113                 setfillcolor(WHITE);
114                 solidcircle(j*SIZE + SIZE / 2, i*SIZE + SIZE / 2, SIZE / 3);
115                 break;
116             default:
117                 break;
118             }
119         }
120     }
121     EndBatchDraw();
122 }
123 
124 COOR play(int map[][COL], int flag)//如果是黑 -1  如果是白  1
125 {
126     MOUSEMSG msg;
127     while (1)
128     {
129         msg = GetMouseMsg();
130         switch (msg.uMsg)
131         {
132         case WM_LBUTTONDOWN:
133         //    msg.y/SIZE-->行下标
134         //    msg.x/SIZE-->列下标
135             if (map[msg.y / SIZE][msg.x / SIZE] == 0)
136             {
137                 map[msg.y / SIZE][msg.x / SIZE] = flag;
138                 COOR add = { msg.y / SIZE, msg.x / SIZE };
139                 return add;//返回点击的位置
140             }
141 
142             break;
143         }
144     }
145 }
146 
147 
148 int judge(int map[][COL], int x, int y)
149 {
150     //判断有没有成5的
151     int arr[4] = { 0 };//四个方向
152     //判断上下
153     int i = 1;
154     while (x - i >= 0 && map[x - i][y] == map[x][y]){ ++i, arr[0]++; }
155     i = 1;
156     while (x+i<ROW&&map[x + i][y] == map[x][y]){ ++i, arr[0]++; }
157 
158     //左右
159     i = 1;
160     while (y - i >= 0 && map[x][y - i] == map[x][y]){ ++i, arr[1]++; }
161     i = 1;
162     while (y + i<COL&&map[x ][y+ i] == map[x][y]){ ++i, arr[1]++; }
163 
164     //左上 右下
165     i = 1;
166     while (x - i >= 0&&y-i>=0&& map[x - i][y-i] == map[x][y]){ ++i, arr[2]++; }
167     i = 1;
168     while (x + i<ROW&&y+i<COL&&map[x + i][y+i] == map[x][y]){ ++i, arr[2]++; }
169 
170     //左下右上
171     i = 1;
172     while (x - i >= 0 && y + i <COL && map[x - i][y + i] == map[x][y]){ ++i, arr[3]++; }
173     i = 1;
174     while (x + i<ROW&&y - i>=0&&map[x + i][y - i] == map[x][y]){ ++i, arr[3]++; }
175 
176     for (int i = 0; i < 4; ++i)
177     {
178         if (arr[i] >= 4) return 1;//表示结束  赢
179     }
180     return 0;//没有赢
181 }

 

五子棋项目

标签:bat   add   结构体   元素   break   turn   二维数组   main   def   

原文地址:https://www.cnblogs.com/liugangjiayou/p/10686886.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!