-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathretract_stone.c
107 lines (99 loc) · 3.07 KB
/
retract_stone.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "gomoku.h"
// 悔棋
int retract_stone(int player_turn, int round, int game_mode)
{
int retract_player;
if (round <= 1) // 黑棋本来就啥都没下
{
printf("轮次过低,无法悔棋!\n");
return INPUT_WRONG;
}
// 人人模式选择是谁要悔棋
if (game_mode == PLAYER_PLAYER)
retract_player = mode_choose(RETRACT);
// 人机模式自动选择为玩家悔棋 (因为机器落子的时候玩家啥都干不了)
else
retract_player = player_turn;
if (retract_player == WHITE)
{
if (round == 2) // 白棋本来就啥都没下
{
printf("轮次过低,无法悔棋!\n");
return INPUT_WRONG;
}
if (retract_times_left_white == 0 || (player_turn == WHITE && retract_times_left_black == 0)) // 不够悔棋的了
{
printf("悔棋次数用尽!\n");
return INPUT_WRONG;
}
// 下面是可以悔棋时进行的悔棋操作
if (player_turn == WHITE)
{
retract_black();
retract_white();
return RETRACT_TWICE;
}
else
{
retract_white();
return RETRACT_ONCE;
}
}
else if (retract_player == BLACK)
{
if (retract_times_left_black == 0 || (player_turn == BLACK && retract_times_left_white == 0)) // 不够悔棋的了
{
printf("悔棋次数用尽!\n");
return INPUT_WRONG;
}
if (player_turn == BLACK)
{
retract_white();
retract_black();
return RETRACT_TWICE;
}
else
{
retract_black();
return RETRACT_ONCE;
}
}
else
{
printf("输入有误,请您重新选择!\n");
return INVALID_INPUT;
}
return INVALID_INPUT;
}
// 撤回一个黑子, 操作和落子时的操作类似
void retract_black(void)
{
int i;
place_stone_player(row_black_global, col_black_global, SPARE); // 把真棋盘上面的子给去掉
row_black_global = row_black_global_back[0];
col_black_global = col_black_global_back[0];
for (i = 0; i < MAX_RETRACT - 1; i++)
{
row_black_global_back[i] = row_black_global_back[i + 1];
col_black_global_back[i] = col_black_global_back[i + 1];
}
row_black_global_back[MAX_RETRACT - 1] = 0;
col_black_global_back[MAX_RETRACT - 1] = 0;
--retract_times_left_black;
}
// 撤回一个白子, 操作和落子时的操作类似
void retract_white(void)
{
int i;
place_stone_player(row_white_global, col_white_global, SPARE); // 把真棋盘上面的子给去掉
row_white_global = row_white_global_back[0];
col_white_global = col_white_global_back[0];
for (i = 0; i < MAX_RETRACT - 1; i++)
{
row_white_global_back[i] = row_white_global_back[i + 1];
col_white_global_back[i] = col_white_global_back[i + 1];
}
row_white_global_back[MAX_RETRACT - 1] = 0;
col_white_global_back[MAX_RETRACT - 1] = 0;
--retract_times_left_white;
}