C# 控制檯實現的五子棋遊戲
阿新 • • 發佈:2019-01-05
今天用到陣列在控制檯做了一個五子棋遊戲,實現如下:
static void Main(string[] args)
{
string[,] QP = new string[17, 17]; //定義二維陣列QP同時設定棋盤大小
while (true)
{ Console.Clear();
int left = 16;
int top = 8;
for (int i = 0; i < QP.GetLength(0); i++)
{
for (int j = 0; j < QP.GetLength(1); j++) //為陣列QP每個元素賦初值 用“□”代替棋盤網格
{
QP[i, j] = "□";
}
}
for (int i = 0; i < QP.GetLength(0); i++)
{
for (int j = 0; j < QP.GetLength(1); j++)
{
Console.Write(QP[i, j]); //遍歷陣列QP 並將其列印在窗體 使介面看起來像是網格狀
}
Console.WriteLine();
} bool mark = true;
bool Jmark = true;
while (Jmark)
{
Console.SetCursorPosition(left, top); //設定游標初始位置
ConsoleKey key = Console.ReadKey(true).Key; //讀取輸入值 switch (key) //switch語句控制游標的移動,上下左右共4個方向 可同時由方向鍵和“W”“S”“A”“D”2組組合鍵控制
{
case ConsoleKey.UpArrow:
case ConsoleKey.W:
if (top > 0)
{
top--;
}
break;
case ConsoleKey.DownArrow:
case ConsoleKey.S:
if (top < 16)
{
top++;
}
break;
case ConsoleKey.LeftArrow:
case ConsoleKey.A:
if (left > 0)
{
left = left - 2;
}
break;
case ConsoleKey.RightArrow:
case ConsoleKey.D:
if (left < 32)
{
left = left + 2;
}
break;
default: //預設值設定 當按件不為定義的2組組合鍵時,若當前游標位置不是“□”,則不能操作,
if (QP[top, left / 2] != "□") //若是“□”,則判斷mark值,為ture則列印"●",否則列印"○",同時陣列相應位置的值發聲替換
{
continue; //以實現兩種棋子交替出現
} if (mark)
{
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("●");
QP[top, left / 2] = "●";
}
else
{
Console.Write("○");
QP[top, left / 2] = "○";
}
if (SF(QP, top, left / 2)) //呼叫SF方法 判斷輸贏
{
Jmark = false;
Console.Beep();
System.Threading.Thread.Sleep(2000);
}
mark = !mark;
break;
}
}
} }
static bool SF(string[,] strarr, int x, int y) //自定義SF方法 判斷獲勝玩家
{
int xx = x;
int yy = y;
string ActChe = strarr[x, y];
int i = 1; //i表示目前相連的同色棋子數 預設為1 //第一種情況,x不動,y在變化 即判斷y方向上是否獲勝
while (true)
{
if (--yy >= 0)
{
if (ActChe == strarr[xx, yy])
{
i++; if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
xx = x;
yy = y;
while (true)
{
if (++yy < 17)
{
if (ActChe == strarr[xx, yy])
{
i++;
if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
//第二種情況,y不動,x在變化
i = 1;
xx = x;
yy = y; while (true)
{
if (--xx >= 0)
{
if (ActChe == strarr[xx, yy])
{
i++; if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
xx = x;
yy = y;
while (true)
{
if (++xx < 17)
{
if (ActChe == strarr[xx, yy])
{
i++;
if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
} //第三種情況,x,y同增同減
i = 1;
xx = x;
yy = y; while (true)
{
if (--xx >= 0 && --yy >= 0)
{
if (ActChe == strarr[xx, yy])
{
i++; if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
xx = x;
yy = y;
while (true)
{
if (++xx < 17 && ++yy < 17)
{
if (ActChe == strarr[xx, yy])
{
i++;
if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
//第四種情況 x加,y減,或y加,x減
i = 1;
xx = x;
yy = y; while (true)
{
if (--xx >= 0 && ++yy < 17)
{
if (ActChe == strarr[xx, yy])
{
i++; if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
xx = x;
yy = y;
while (true)
{
if (++xx < 17 && --yy > 0)
{
if (ActChe == strarr[xx, yy])
{
i++;
if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
return false;
}
{
string[,] QP = new string[17, 17]; //定義二維陣列QP同時設定棋盤大小
while (true)
{ Console.Clear();
int left = 16;
int top = 8;
for (int i = 0; i < QP.GetLength(0); i++)
{
for (int j = 0; j < QP.GetLength(1); j++) //為陣列QP每個元素賦初值 用“□”代替棋盤網格
{
QP[i, j] = "□";
}
}
for (int i = 0; i < QP.GetLength(0); i++)
{
for (int j = 0; j < QP.GetLength(1); j++)
{
Console.Write(QP[i, j]); //遍歷陣列QP 並將其列印在窗體 使介面看起來像是網格狀
}
Console.WriteLine();
} bool mark = true;
bool Jmark = true;
while (Jmark)
{
Console.SetCursorPosition(left, top); //設定游標初始位置
ConsoleKey key = Console.ReadKey(true).Key; //讀取輸入值 switch (key) //switch語句控制游標的移動,上下左右共4個方向 可同時由方向鍵和“W”“S”“A”“D”2組組合鍵控制
{
case ConsoleKey.UpArrow:
case ConsoleKey.W:
if (top > 0)
{
top--;
}
break;
case ConsoleKey.DownArrow:
case ConsoleKey.S:
if (top < 16)
{
top++;
}
break;
case ConsoleKey.LeftArrow:
case ConsoleKey.A:
if (left > 0)
{
left = left - 2;
}
break;
case ConsoleKey.RightArrow:
case ConsoleKey.D:
if (left < 32)
{
left = left + 2;
}
break;
default: //預設值設定 當按件不為定義的2組組合鍵時,若當前游標位置不是“□”,則不能操作,
if (QP[top, left / 2] != "□") //若是“□”,則判斷mark值,為ture則列印"●",否則列印"○",同時陣列相應位置的值發聲替換
{
continue; //以實現兩種棋子交替出現
} if (mark)
{
Console.ForegroundColor = ConsoleColor.Blue;
Console.Write("●");
QP[top, left / 2] = "●";
}
else
{
Console.Write("○");
QP[top, left / 2] = "○";
}
if (SF(QP, top, left / 2)) //呼叫SF方法 判斷輸贏
{
Jmark = false;
Console.Beep();
System.Threading.Thread.Sleep(2000);
}
mark = !mark;
break;
}
}
} }
static bool SF(string[,] strarr, int x, int y) //自定義SF方法 判斷獲勝玩家
{
int xx = x;
int yy = y;
string ActChe = strarr[x, y];
int i = 1; //i表示目前相連的同色棋子數 預設為1 //第一種情況,x不動,y在變化 即判斷y方向上是否獲勝
while (true)
{
if (--yy >= 0)
{
if (ActChe == strarr[xx, yy])
{
i++; if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
xx = x;
yy = y;
while (true)
{
if (++yy < 17)
{
if (ActChe == strarr[xx, yy])
{
i++;
if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
//第二種情況,y不動,x在變化
i = 1;
xx = x;
yy = y; while (true)
{
if (--xx >= 0)
{
if (ActChe == strarr[xx, yy])
{
i++; if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
xx = x;
yy = y;
while (true)
{
if (++xx < 17)
{
if (ActChe == strarr[xx, yy])
{
i++;
if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
} //第三種情況,x,y同增同減
i = 1;
xx = x;
yy = y; while (true)
{
if (--xx >= 0 && --yy >= 0)
{
if (ActChe == strarr[xx, yy])
{
i++; if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
xx = x;
yy = y;
while (true)
{
if (++xx < 17 && ++yy < 17)
{
if (ActChe == strarr[xx, yy])
{
i++;
if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
//第四種情況 x加,y減,或y加,x減
i = 1;
xx = x;
yy = y; while (true)
{
if (--xx >= 0 && ++yy < 17)
{
if (ActChe == strarr[xx, yy])
{
i++; if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
xx = x;
yy = y;
while (true)
{
if (++xx < 17 && --yy > 0)
{
if (ActChe == strarr[xx, yy])
{
i++;
if (i == 5)
{
return true;
}
}
else
{
break;
}
}
else
{
break;
}
}
return false;
}