Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
zmx0142857
GitHub Repository: zmx0142857/mini-games
Path: blob/master/c/go/test/test.c
366 views
1
#include <stdbool.h>
2
#include <assert.h>
3
#include <stdio.h>
4
#define INF 999999
5
6
int board[] = { 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2 };
7
8
// 问题: 1 1 0 0 1, 1 0 1 0 1 等也被算作活三?
9
10
bool bounded(int x)
11
{
12
return x >= 0 && x <= 10;
13
}
14
15
int gomoku_line_type(int x) {
16
int count = 1, offset, xx;
17
int color = 1, rival_color = 2;
18
bool blank_l = false, blank_r = false;
19
int block_l = 0, block_r = 0;
20
// 沿正方向看
21
for (offset = 1; offset <= 5; ++offset) {
22
xx = x + offset;
23
if (!bounded(xx) || board[xx] == rival_color) {
24
block_r = offset;
25
break;
26
} else if (board[xx] == 0) {
27
blank_r = true;
28
} else { // board[xx] == color
29
blank_r = false;
30
++count;
31
}
32
}
33
// 沿反方向看
34
for (offset = -1; offset >= -5; --offset) {
35
xx = x + offset;
36
if (!bounded(xx) || board[xx] == rival_color) {
37
block_l = offset;
38
break;
39
} else if (board[xx] == 0) {
40
blank_l = true;
41
} else { // board[xx] == color
42
blank_l = false;
43
++count;
44
}
45
}
46
47
bool dead_l = block_l && !blank_l;
48
bool dead_r = block_r && !blank_r;
49
if (block_l == 0) block_l = -INF;
50
if (block_r == 0) block_r = INF;
51
52
int type = 0;
53
if (count <= 4) {
54
type += (count - 1) * 4;
55
if (block_r - block_l > 5) {
56
if (dead_l || dead_r) {
57
printf("rush %d\n", count);
58
type += 1; // RUSH
59
} else {
60
printf("live %d\n", count);
61
type += 0; // LIVE
62
}
63
} else {
64
if (blank_l || blank_r) {
65
printf("sleep %d\n", count);
66
type += 2; // SLEEP
67
} else {
68
printf("dead %d\n", count);
69
type += 3; // DEAD
70
}
71
}
72
} else if (count == 5) {
73
puts("= 5");
74
type = 16;
75
} else { // count > 5
76
puts("> 5");
77
type = 17;
78
}
79
return type;
80
}
81
82
int main()
83
{
84
gomoku_line_type(5);
85
return 0;
86
}
87
88