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

简介:

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

目录
相关文章
|
5G 网络架构 索引
安装一个开源虚拟路由器VPP-20.09
安装一个开源虚拟路由器VPP-20.09
|
10月前
|
存储 算法 Linux
【c++】STL简介
本文介绍了C++标准模板库(STL)的基本概念、组成部分及学习方法,强调了STL在提高编程效率和代码复用性方面的重要性。文章详细解析了STL的六大组件:容器、算法、迭代器、仿函数、配接器和空间配置器,并提出了学习STL的三个层次,旨在帮助读者深入理解和掌握STL。
384 0
|
11月前
|
人工智能 自然语言处理 安全
Gemini 人工智能:谷歌AI重磅来袭!好消息,国内可用
Gemini 是 Google 🧠 开发的革命性人工智能模型,旨在打造一个功能强大的多模态 AI 系统。
|
10月前
|
安全 网络安全 数据安全/隐私保护
WAF防护功能的实现方案
WAF防护功能的实现方案
213 0
|
Ubuntu Linux Windows
如何在WSL中的ubuntu编译Linux内核并且安装使用ebpf?
请注意,在WSL1中可能会由于内核架构限制而无法成功进行以上过程,WSL2对于Linux内核的完整支持更为合适。此外,部分步骤可能因不同的Linux发行版或内核版本而异。
550 4
|
Linux 编译器 测试技术
探索Linux中的objcopy命令:数据处理与分析的得力助手
`objcopy`是GNU工具集中的实用程序,用于复制和转换二进制目标文件,如ELF到S-record。它支持格式转换、内容提取和修改,如移除调试信息。命令参数包括指定输入/输出格式和复制特定段。示例用途有:`objcopy -O binary input.elf output.bin`(ELF转二进制)和`objcopy -j .text input.elf output.o`(复制.text段)。使用时注意文件格式、备份原始文件并查阅文档。对于处理和分析二进制数据,`objcopy`是不可或缺的工具。
|
SQL Java 数据处理
实时计算 Flink版产品使用合集之怎么热加载Java和Python的UDF
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
186 1
|
机器学习/深度学习 人工智能 Linux
中科院团队推出开源神经形态芯片「文曲星」(附源代码)
中科院团队推出开源神经形态芯片「文曲星」(附源代码)
396 0
|
存储 算法 机器学习/深度学习
JPEG图像压缩算法流程详解
JPEG图像压缩算法流程详解 JPEG是Joint Photographic Exports Group的英文缩写,中文称之为联合图像专家小组。该小组隶属于ISO国际标准化组织,主要负责定制静态数字图像的编码方法,即所谓的JPEG算法。
4034 0
|
开发工具 Windows C语言
Windows驱动开发工具 WDK 学习笔记(1)
<div>目标:能够把电脑当作一个集成有高性能处理器的开发板用起来,当然,还自带了一个高级的操作系统Windows(必须的)。总之,就是在一个带了操作系统的高性能开发板上的驱动程序开发。</div> <div>性质:纯属业余爱好</div> <div></div> <div>1、昨天下载了WDK 7.1.0 Free版(From MS的正版,需要注册一个Windows Live ID
2247 0