1 #include <stdio.h> 2 /* 3 项目:五子棋赢棋判断 4 思路:1.横向扫描判断是否有连续5颗相连的棋子 5 2.纵向扫描判断是否有连续5颗相连的棋子 6 3.扫描主对角线判断是否有连续5颗相连的棋子 7 4.斜线扫描主对角线上半面是否有连续5颗相连的棋子 8 5.斜线扫描主对角线下半面是否有连续5颗相连的棋子 9 6.扫描次对角线判断是否有连续5颗相连的棋子 10 7.斜线扫描次对角线上半面是否有连续5颗相连的棋子 11 8.斜线扫描次对角线下半面是否有连续5颗相连的棋子 12 13 9.1代表黑棋。2代表白棋。其他数字0代表未走棋 14 */ 15 #define M 10 //定义棋盘上下边界,上边界0 下边界10 16 #define N 10 //定义棋盘左右边界,左边界0 右边界10 17 18 int main(void) 19 { 20 int i,j,k,q; 21 // k = q = 0; 22 //初始化二维数组 23 int arr[M][N] = { 24 {0,1,1,0,1,1,0,0,2,0}, 25 {0,2,1,0,0,2,0,0,0,0}, 26 {0,0,2,0,2,0,1,0,0,0}, 27 {0,0,0,2,1,1,0,0,0,0}, 28 {0,0,2,0,2,1,0,0,0,0}, 29 {0,2,0,1,0,2,0,1,0,0}, 30 {0,0,1,0,0,0,0,0,0,0}, 31 {0,0,0,0,0,0,0,1,0,0}, 32 {0,0,0,0,0,0,0,1,0,0}, 33 {0,0,0,0,0,0,0,1,0,0} 34 }; 35 //1.横向扫描判断是否有连续5颗相连的棋子 36 for(k = 0,q = 0,i = 0;i<M;i++) 37 { 38 for(j = 0;j<N;j++) 39 { 40 if(arr[i][j] == 1) 41 k++; 42 else 43 k = 0; 44 if(arr[i][j] == 2) 45 q++; 46 else 47 q = 0; 48 if(k>=5) 49 { 50 printf("黑棋胜利 "); 51 return 0; 52 } 53 if(q>=5) 54 { 55 printf("白棋胜利 "); 56 return 0; 57 } 58 } 59 60 61 } 62 //2.纵向扫描判断是否有连续5颗相连的棋子 63 for(j = 0;j<N;j++) 64 { 65 k = q = 0; 66 for(i = 0;i<M;i++) 67 { 68 if(arr[i][j] == 1) 69 k++; 70 else 71 k = 0; 72 if(arr[i][j] == 2) 73 q++; 74 else 75 q = 0; 76 if(k>=5) 77 { 78 printf("黑棋胜利 "); 79 return 0; 80 } 81 if(q>=5) 82 { 83 printf("白棋胜利 "); 84 return 0; 85 } 86 } 87 88 } 89 //3.扫描主对角线判断是否有连续5颗相连的棋子 90 for(k = q = 0,i = 0;i<M;i++) 91 { 92 if(arr[i][i] == 1) 93 k++; 94 else 95 k = 0; 96 if(arr[i][i] == 2) 97 q++; 98 else 99 q = 0; 100 if(k>=5) 101 { 102 printf("黑棋胜利 "); 103 return 0; 104 } 105 if(q>=5) 106 { 107 printf("白棋胜利 "); 108 return 0; 109 } 110 } 111 //4.斜线扫描主对角线上半面是否有连续5颗相连的棋子 112 113 for(j = 1;j<N;j++) 114 { 115 k = q = 0; 116 for(i = 0;i<M-j;i++) 117 { 118 if(arr[i][i+j] == 1) 119 k++; 120 else 121 k = 0; 122 if(arr[i][i+j] == 2) 123 q++; 124 else 125 q = 0; 126 if(k>=5) 127 { 128 printf("黑棋胜利 "); 129 return 0; 130 } 131 if(q>=5) 132 { 133 printf("白棋胜利 "); 134 return 0; 135 } 136 } 137 } 138 //5.斜线扫描主对角线下半面是否有连续5颗相连的棋子 139 for(i = 1;i<M;i++) 140 { 141 k = q = 0; 142 for(j = 0;j<N-i;j++) 143 { 144 if(arr[j+i][j] == 1) 145 k++; 146 else 147 k = 0; 148 if(arr[j+i][j] == 2) 149 q++; 150 else 151 q = 0; 152 153 if(k>=5) 154 { 155 printf("黑棋胜利 "); 156 return 0; 157 } 158 if(q>=5) 159 { 160 printf("白棋胜利 "); 161 return 0; 162 } 163 } 164 165 } 166 //6.扫描次对角线判断是否有连续5颗相连的棋子 167 for(k = q = 0,i = 0;i<M;i++) 168 { 169 if(arr[i][9-i] == 1) 170 k++; 171 else 172 k = 0; 173 if(arr[i][9-i] == 2) 174 q++; 175 else 176 q = 0; 177 if(k>=5) 178 { 179 printf("黑棋胜利 "); 180 return 0; 181 } 182 if(q>=5) 183 { 184 printf("白棋胜利 "); 185 return 0; 186 } 187 } 188 189 //7.斜线扫描次对角线上半面是否有连续5颗相连的棋子 190 for(j = N-2;j>=0;j--) 191 { 192 k = q = 0; 193 for(i = 0;i<M-(N-j-1);i++) 194 { 195 if(arr[i][j-i] == 1) 196 k++; 197 else 198 k = 0; 199 if(arr[i][j-i] == 2) 200 q++; 201 else 202 q = 0; 203 204 if(k>=5) 205 { 206 printf("黑棋胜利 "); 207 return 0; 208 } 209 if(q>=5) 210 { 211 printf("白棋胜利 "); 212 return 0; 213 } 214 } 215 216 } 217 //8.斜线扫描次对角线下半面是否有连续5颗相连的棋子 218 219 for(i = 1;i<M;i++) 220 { 221 k = q = 0; 222 for(j = N-1;j>=i;j--) 223 { 224 if(arr[N-j+i-1][j] == 1) 225 k++; 226 else 227 k = 0; 228 if(arr[N-j+i-1][j] == 2) 229 q++; 230 else 231 q = 0; 232 233 if(k>=5) 234 { 235 printf("黑棋胜利 "); 236 return 0; 237 } 238 if(q>=5) 239 { 240 printf("白棋胜利 "); 241 return 0; 242 } 243 } 244 245 } 246 247 return 0; 248 }