文曲星猜数游戏的一个简单实现
2009-07-08 22:17 Anders Cui 阅读(1751) 评论(0) 编辑 收藏 举报最近比较希望能做一些敏捷开发的实践,昨晚向Nick Wang请教了一下,结合自己的体会,感觉应当从单元测试开始入手,逐步了解XP的相关内容。Nick刚刚出了个小题目,感觉这是学习TDD的一个好机会。
今天看到麒麟.NET的一个非TDD实现,一时手痒也尝试了一下。由于我没有玩过那个游戏,写完后才发现有问题,就偷懒把麒麟.NET生成随机数的方法给“借”了过来。

namespace GuessGame
{
public class GuessGame
{
public static readonly int NUMBER_COUNT = 4;
private int[] answers = null;
private int rightNumberCount;
private int wrongNumberCount;
private int wrongPositionCount;
public GuessGame()
{
Init();
GenerateDistinctRandomNumbers();
}
private void Init()
{
rightNumberCount = 0;
wrongNumberCount = 0;
wrongPositionCount = 0;
}
private void Reset()
{
Init();
}
private void GenerateDistinctRandomNumbers()
{
answers = new int[NUMBER_COUNT];
Random random = new Random();
bool allowZero = true;
for (int i = 0; i < NUMBER_COUNT; i++)
{
int n = random.Next(10);
if (n == 0 && allowZero)
{
answers[i] = n;
allowZero = false;
}
else
{
while (answers.Contains(n))
{
n = random.Next(10);
}
answers[i] = n;
}
}
}
public bool IsRight
{
get
{
return (rightNumberCount == NUMBER_COUNT);
}
}
public string Result
{
get
{
return string.Format("{0}A{1}B", rightNumberCount, wrongPositionCount);
}
}
public void Calculate(int[] inputs)
{
if (inputs == null || inputs.Length != NUMBER_COUNT)
{
throw new Exception("Invalid inputs.");
}
Reset();
for (int i = 0; i < NUMBER_COUNT; i++)
{
int index = Array.IndexOf(answers, inputs[i]);
if (index < 0)
{
wrongNumberCount++;
}
else if (index != i)
{
wrongPositionCount++;
}
else
{
rightNumberCount++;
}
}
}
}
class Program
{
private static readonly int GUESS_TIME = 6;
static void Main(string[] args)
{
PlayGuessGame();
Console.ReadLine();
}
private static void PlayGuessGame()
{
int[] inputs = null;
GuessGame game = new GuessGame();
int i = 1;
while (i <= GUESS_TIME)
{
inputs = GetInput();
game.Calculate(inputs);
Console.WriteLine(game.Result);
if (game.IsRight)
{
Console.WriteLine("Congratulations!");
break;
}
i++;
}
if (!game.IsRight)
{
Console.WriteLine("i think you are not very clever

}
}
private static int[] GetInput()
{
int numberCount = GuessGame.NUMBER_COUNT;
int[] inputs = new int[numberCount];
Console.WriteLine("Input {0} numbers: ", numberCount);
for (int i = 0; i < numberCount; i++)
{
Console.Write(" number {0}: ", i + 1);
inputs[i] = Convert.ToInt32(Console.ReadLine());
}
return inputs;
}
}
}
完成这些代码的过程采用了我在编写自文档化的代码介绍的方法,即从伪代码开始,期望写出比较具有可读性的代码。发现写这样的小程序还是不错的:)
作者:Anders Cui
出处:http://anderslly.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://anderslly.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端