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 }