3. 象棋馬走法

Console.Write("馬目前位置和一些障礙物: ");
var d = Console.ReadLine().Split(" ").Select(int.Parse).ToList();

int y = d[0];
int x = d[1];
bool[,] obs = new bool[9, 9];
for (int i = 2; i < d.Count; i += 2)
{
    obs[d[i], d[i + 1]] = true;
}

var keys = """
    RRD
    RRU
    UUR
    UUL
    LLU
    LLD
    DDL
    DDR
    """.Split("\n");

while (true)
{
    Console.Write("輸入移動數字鍵: ");
    var c = Console.ReadKey().KeyChar - '0';
    if (c < 0 || c > 7)
    {
        Console.Write(" (結束此程式)");
        break;
    }

    int tx = x, ty = y;
    var s = keys[c];
    bool o = false;
    for (int i = 0; i < s.Length; i++)
    {
        char item = s[i];
        switch (item)
        {
            case 'U':
                ty--;
                break;
            case 'L':
                tx--;
                break;
            case 'R':
                tx++;
                break;
            case 'D':
                ty++;
                break;
        }

        if (tx < 1 || tx > 8 || ty < 1 || ty > 8)
        {
            Console.WriteLine($"\n馬移動至新位置: {y} {x} (因超出棋盤外而保持原座標)");
            o = true;
            break;
        }
        if (i == 0 && obs[ty, tx])
        {
            Console.WriteLine($"\n馬移動至新位置: {y} {x} (因馬腳捆住而保持原座標)");
            o = true;
            break;
        }
    }
    if (o) continue;
    x = tx;
    y = ty;
    obs[y, x] = false;

    Console.WriteLine($"\n馬移動至新位置: {y} {x}");
}

Last updated