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

简介:

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

目录
打赏
0
0
0
0
7
分享
相关文章
|
5月前
|
猜数游戏(实现) 后附源码
本文介绍了如何使用C语言实现一个猜数游戏,包括游戏的逻辑流程、代码实现以及如何通过随机数生成器和时间戳生成一个1到100之间的随机数。
127 2
猜数游戏(实现) 后附源码
|
9月前
|
C++
C++小练习:猜数游戏
C++小练习:猜数游戏
猜数游戏
【4月更文挑战第29天】
60 1
三子棋游戏的简单实现(C语言后附完整代码)(上)
三子棋游戏的简单实现(C语言后附完整代码)(上)
三子棋游戏的简单实现(C语言后附完整代码)(下)
三子棋游戏的简单实现(C语言后附完整代码)(下)
Java实现猜数游戏
Java实现猜数游戏
131 0
【C语言】飞机大战游戏还原,源码在文末,应用“循环”与“数组”实现游戏开发,一起玩一下经典小游戏吧
众所周知昂,飞机大战,重在大战嘛,你这一颗子弹一架敌机,打的那是一点儿激情也没有。所以我们这章内容,就来对前文做修改,运用上数组手法,给它盘圆咯 在二维数组中存储游戏画面数据,元素为0时输出“ (空格)”,元素为1时输出大灰机“ * ”,元素为2输出子弹“¥”元素为3时输出敌机“@”定义二维数组存储游戏画面中元素的数组暂且定为4.基础功能的实现在飞机大战中,用人类语言来描述相关内容,则有以下这些,积分计算(包括击毁敌机,未击毁,飞机升级子弹,多架敌机产生……)这些我们都要一一实现 多架敌机产生这块儿,
【C语言】飞机大战游戏还原,源码在文末,应用“循环”与“数组”实现游戏开发,一起玩一下经典小游戏吧