文曲星猜数游戏的一个简单实现

简介:

最近比较希望能做一些敏捷开发的实践,昨晚向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;
        }
    }
}
复制代码


完成这些代码的过程采用了我在编写自文档化的代码介绍的方法,即从伪代码开始,期望写出比较具有可读性的代码。发现写这样的小程序还是不错的:)


本文转自一个程序员的自省博客园博客,原文链接:http://www.cnblogs.com/anderslly/archive/2009/07/08/guess-game-without-tdd.html,如需转载请自行联系原作者。

目录
相关文章
|
机器学习/深度学习 编解码 人工智能
|
JavaScript Java 测试技术
基于SpringBoot+Vue的视频网站系统的的设计与实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的视频网站系统的的设计与实现(源码+lw+部署文档+讲解等)
438 0
|
消息中间件 缓存 关系型数据库
云计算|OpenStack|社区版OpenStack安装部署文档(二---OpenStack运行环境搭建)
云计算|OpenStack|社区版OpenStack安装部署文档(二---OpenStack运行环境搭建)
1232 0
|
Java
电脑玩诺基亚手机jar游戏java-涂鸦地带举例
电脑玩诺基亚手机jar游戏java-涂鸦地带举例
408 0
|
SQL 关系型数据库 数据库
Oracle11g中数据的倒库和入库操作以及高版本数据导入低版本数据可能引发的问题
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/。 1.前言 在10g之前,传统的导出和导入分别使用EXP工具和IMP工具,从10g开始,不仅保留了原有的EXP和IMP工具,还提供了数据泵导出导入工具EXPDP和IMPDP。
1527 0
|
JSON 前端开发 Java
javaweb实训第六天上午——JSON&SpringMVC进阶(2)
5.SpringMVC拦截器 5.1.创建拦截器
179 0
|
Linux 网络安全
rsync的用法以及与scp和cp的比较
rsync的用法以及与scp和cp的比较
1227 0
16HUI - 多功能菜单(hui.actionSheet)
16HUI - 多功能菜单(hui.actionSheet)
162 0
|
计算机视觉
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
《一文搞懂IoU发展历程》GIoU、DIoU、CIoU、EIoU、αIoU、SIoU
|
自然语言处理 算法 测试技术
思维链如何释放语言模型的隐藏能力?最新理论研究揭示其背后奥秘
思维链如何释放语言模型的隐藏能力?最新理论研究揭示其背后奥秘
469 0