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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
|
using System; using System.Collections.Generic;
using System.Linq; using System.Text;
using System.Threading.Tasks;
namespace 五子棋游戏.调试后
{
class Program
{
public static int left = 0; // +2 则光标向右移动一格, -2 则光标向左移动一格
public static int top = 18; // +1 则光标向下移动一个, -1 则光标向上移动一个
public static string[,] QP = new string[17, 17]; //定义棋盘大小
public static string[,] QZ = new string[17, 17]; //保存棋子
//绘制棋盘
public static void qp()
{
for (int i = 0; i < 17; i++)
{
for (int j = 0; j < 17; j++)
{
QP[i, j] = "┼"; //为数组QP每个元素赋初值 “┼“
}
}
for (int i = 0; i < 17; i++)
{
for (int j = 0; j < 17; j++)
{
Console.Write(QP[i, j]); //打印棋盘
}
Console.WriteLine();
}
}
//移动并落字
public static void move()
{
qp();
Console.SetCursorPosition(left, top); //设置光标位置
Console.WriteLine(" 双人PK,燃起来吧!\n");
Console.WriteLine(" 玩家1: W S A D 控制方向 空格键落子");
Console.WriteLine(" 玩家2:↑↓← → 控制方向 Enter键落子");
left = 16; top = 8;
bool M = true;
while (true)
{
Program program = new Program();
Console.SetCursorPosition(left, top); //设置光标位置
//接受输入并显示在控制台上, true表示隐藏输入
ConsoleKeyInfo info = Console.ReadKey(true);
//控制光标移动 一组“W”“S”“A”“D”,
//一组“↑”“↓”“←”“→”
switch (info.Key)
{
//"W" 和 "↑" 向上移动光标
case ConsoleKey.UpArrow:
case ConsoleKey.W: if (top > 0) { top--; } break;
//"S" 和 "↓" 向下移动光标
case ConsoleKey.DownArrow:
case ConsoleKey.S: if (top < 16) { top++; } break;
//"A" 和 "←" 向左移动光标
case ConsoleKey.LeftArrow:
case ConsoleKey.A: if (left > 0) { left -= 2; } break;
//"D" 和 "→" 向右移动光标
case ConsoleKey.RightArrow:
case ConsoleKey.D: if (left < 32) { left += 2; } break;
}
//落子
if (M)
{
//按 空格键 或 Enter键,落子
if (info.Key == ConsoleKey.Spacebar || info.Key == ConsoleKey.Enter)
{
Console.WriteLine("●");
QZ[left / 2, top] = "●";
M = false; //下一次落子为 ○
if (Judge() == true) //判断输赢
{
//设置光标位置
Console.SetCursorPosition(0, 22);
Console.WriteLine($"\n {QZ[left / 2, top]}方,胜利");
break;
}
}
}
else
{
//按 空格键或Enter键,下子
if (info.Key == ConsoleKey.Spacebar || info.Key == ConsoleKey.Enter)
{
Console.WriteLine("○");
QZ[left / 2, top] = "○";
M = true; //下一次落子为 ●
if (Judge() == true) //判断输赢
{
//设置光标位置
Console.SetCursorPosition(0, 22);
Console.Write($"\n {QZ[left / 2, top]}方,胜利");
break;
}
}
}
}
}
//判断游戏输赢
public static bool Judge()
{
int n1 = 1, n2 = 1, n3 = 1, n4 = 1;
// n1 表示一条 横线 上相邻的同色棋子数
// n2 表示一条 纵线 上相邻的同色棋子数
// n3 表示一条 左上斜线 上相邻的同色棋子数
// n4 表示一条 右下斜线 上相邻的同色棋子数
//第一种情况: 五子在一条横线
for (int j = 1; j < 5; j++)
{
if (left / 2 + j <= 16) //判断是否越界
{
//落子与相邻右边的4个棋子判断
if (QZ[left / 2, top] == QZ[left / 2 + j, top]) { n1++; }
else { break; }
}
}
for (int j = 1; j < 5; j++)
{
if (left / 2 - j >= 0) //判断是否越界
{
//落子与相邻左边的4个棋子判断
if (QZ[left / 2, top] == QZ[left / 2 - j, top]) { n1++; }
else { break; }
}
}
//第二种情况: 五子在一条纵线
for (int j = 1; j < 5; j++)
{
if ((top + j <= 16)) //判断是否越界
{
//落子与相邻上方的4个棋子判断
if (QZ[left / 2, top] == QZ[left / 2, top + j]) { n2++; }
else { break; }
}
}
for (int j = 1; j < 6; j++)
{
if (top - j >= 0) //判断是否越界
{
//落子与相邻下方的4个棋子判断
if (QZ[left / 2, top] == QZ[left / 2, top - j]) { n2++; }
else { break; }
}
}
//第三种情况:五子在一条右下斜线
for (int j = 1; j < 5; j++)
{
if ((left / 2 - j >= 0) && (top - j >= 0)) //判断是否越界
{
//落子与相邻左上斜的4个棋子判断
if (QZ[left / 2, top] == QZ[left / 2 - j, top - j]) { n3++; }
else { break; }
}
}
for (int j = 1; j < 5; j++)
{
if ((left / 2 + j <= 16) && (top + j <= 16)) //判断是否越界
{
//落子与相邻右下的4个棋子判断
if (QZ[left / 2, top] == QZ[left / 2 + j, top + j]) { n3++; }
else { break; }
}
}
//第四种情况: 五子在一条左下斜线
for (int j = 1; j < 5; j++)
{
if ((left / 2 + j <= 16) && (top - j >= 0)) //判断是否越界
{
// 落子与相邻右上的4个棋子判断
if (QZ[left / 2, top] == QZ[left / 2 + j, top - j]) { n4++; }
else { break; }
}
}
for (int j = 1; j < 5; j++)
{
if ((left / 2 - j >= 0) && (top + j <= 16)) //判断是否越界
{
// 落子与相邻左下的4个棋子判断
if (QZ[left / 2, top] == QZ[left / 2 - j, top + j]) { n4++; }
else { break; }
}
}
//游戏判断
if (n1 >= 5 || n2 >= 5 || n3 >= 5 || n4 >= 5) { return true; } //胜利,游戏结束
else { return false; } //游戏继续
}
static void Main(string[] args)
{
move();
Console.ReadKey();
}
}
}
|