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

简介:

最近比较希望能做一些敏捷开发的实践,昨晚向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,如需转载请自行联系原作者。

目录
相关文章
|
人工智能 数据安全/隐私保护
AI Agent是大模型落地业务场景的主流形式
【1月更文挑战第5天】AI Agent是大模型落地业务场景的主流形式
566 2
AI Agent是大模型落地业务场景的主流形式
|
存储 编解码 数据安全/隐私保护
cdr2023永久免费版下载安装CorelDRAW23安装步骤
CorelDRAW2023最新版是我比较用的比较好的一款软件,因为其作为一款优秀的矢量设计软件,兼具功能和性能,它是由Corel公司出品的矢量设计工具,被广泛应用于排版印刷、矢量图形编辑、网页设计等行业。cdr2023下载如下:http://t.csdn.cn/aQZrm
6756 0
|
11月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
401 0
|
人工智能 自然语言处理 安全
Gemini 人工智能:谷歌AI重磅来袭!好消息,国内可用
Gemini 是 Google 🧠 开发的革命性人工智能模型,旨在打造一个功能强大的多模态 AI 系统。
|
11月前
|
安全 网络安全 数据安全/隐私保护
WAF防护功能的实现方案
WAF防护功能的实现方案
229 0
|
数据采集 大数据
大数据实战项目之电商数仓(二)
大数据实战项目之电商数仓(二)
323 0
|
SQL Java 数据处理
实时计算 Flink版产品使用合集之怎么热加载Java和Python的UDF
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
187 1
|
存储 传感器 SQL
influxdb 中得 fields 与 tag 区别总结
influxdb 中得 fields 与 tag 区别总结
1147 1
|
监控 测试技术 Linux
性能工具之 Apache Bench 入门使用
ab 全称为:apache bench,ab 为小型压力工具,对于在 Linux 中简单压测 HTTP 接口轻巧灵活。
349 1
|
消息中间件 缓存 关系型数据库
云计算|OpenStack|社区版OpenStack安装部署文档(二---OpenStack运行环境搭建)
云计算|OpenStack|社区版OpenStack安装部署文档(二---OpenStack运行环境搭建)
1073 0