你已经有了一个第三方的库“ChessLib”,它可以计算出一个骑士可以做的合法动作
在8×8棋盘上的一个位置。该库已被用来创建一个程序,其中移动的骑士随机周围
给定初始起始位置和要进行的总步数。
问题:
= = = = = = = =
扩展这个程序来设置一个8 * 8的方块游戏板,包含几个不同的棋子在预定的位置。
对于游戏的每一步,程序都会随机选择一个棋子,并将其移动到一个随机选择的有效位置
的位置。
您不允许更改任何ChessLib代码。
根据需要扩展程序。
适当地使用面向对象设计和建模来实现可扩展性。
请在SampleProgram项目的Answer.cs文件中提供您的解决方案的所有代码。
请在示例程序的testanswerto .cs文件中提供您的解决方案的所有测试。测试项目。
游戏规则:
*在给定的时间内,只有一个棋子可以占据棋盘上的任何位置。
*所有棋子可以“跳”到任意位置。
注:虽然这款游戏与国际象棋有着惊人的相似之处,但这完全是巧合。不要假设他人
国际象棋规则适用。
游戏支持件:
- Knight -由ChessLib实现的移动
*主教-对角线移动,在董事会边界内的任何距离
*皇后-斜向移动,水平或垂直移动,在板的边界内的任何距离
using System;
using System.Collections.Generic;
using System.Linq;
using ChessLib;
using NUnit.Framework;
namespace SampleProgram.Test
{
[TestFixture]
public class TestFixture1
{
[Test]
public void TestKnightMoveFromInsideBoard()
{
var pos = new Position(8, 8);
var knight = new KnightMove();
var moves = knight.ValidMovesFor(pos).ToArray();
Assert.IsNotNull(moves);
Assert.AreEqual(8, moves.Length);
foreach (var move in moves)
{
switch (Math.Abs(move.X - pos.X))
{
case 1:
Assert.AreEqual(2, Math.Abs(move.Y - pos.Y));
break;
case 2:
Assert.AreEqual(1, Math.Abs(move.Y - pos.Y));
break;
default:
Assert.Fail();
break;
}
}
}
[Test]
public void TestKnightMoveFromCorner()
{
var pos = new Position(1, 1);
var knight = new KnightMove();
var moves = new HashSet<Position>(knight.ValidMovesFor(pos));
Assert.IsNotNull(moves);
Assert.AreEqual(2, moves.Count);
var possibles = new[] {new Position(2, 3), new Position(3, 2)};
foreach (var possible in possibles)
{
Assert.IsTrue(moves.Contains(possible));
}
}
[Test]
public void TestPosition()
{
var pos = new Position(1, 1);
Assert.AreEqual(1, pos.X);
Assert.AreEqual(1, pos.Y);
var pos2 = new Position(1, 1);
Assert.AreEqual(pos, pos2);
}
}
}