背景

早上看了TDD by example (1) -- 挑战,觉得有趣,实现一个Windows Mobile版本。很多年前我也有一台文曲星,也常常玩这个猜数字游戏,所以尝试在Windows Mobile下实现。

方案

Nick Wang (懒人王) 强调需要TDD,所以我的实现方案也是TDD。

实现

使用NUintLite

测试代码需要使用NUintLite,NUintLite具体可以参考 .NET Compact Framework下的单元测试。修改Main函数如下,把结果写到SD卡上。

static void Main(string[] args)        {            System.IO.TextWriter writer = new System.IO.StreamWriter("\\Storage Card\\TestResult.txt");new NUnitLite.Runner.TextUI(writer).Execute(args);            writer.Close();

Application.Run(new MainForm());        }

编写测试代码

TDD,先写测试代码。测试代码的逻辑是按照TDD by example (1) -- 挑战写的,在实际使用中根据功能需求编写。

[TestFixture]class BingleTest{private Bingle bingle;

        [SetUp]public void SetUp()        {            bingle = new Bingle();        }

        [TearDown]public void TearDown()        {        }

        [Test]public void BuildAnswersTest()        {            bingle.BuildAnswers();Assert.True(bingle.Answers[0] != bingle.Answers[1]                    && bingle.Answers[0] != bingle.Answers[2]                    && bingle.Answers[0] != bingle.Answers[3]                    && bingle.Answers[1] != bingle.Answers[2]                    && bingle.Answers[1] != bingle.Answers[3]                    && bingle.Answers[2] != bingle.Answers[3]);        }

        [Test]public void MatchTest()        {            bingle.Answers = new int[] { 1, 2, 3, 4 };

int a;int b;int[] num;

//1 5 6 7      1A0Bnum = new int[] { 1, 5, 6, 7 };            bingle.Match(num, out a, out b);Assert.That(a, Is.EqualTo(1));Assert.That(b, Is.EqualTo(0));

//2 4 7 8      0A2Bnum = new int[] { 2, 4, 7, 8 };            bingle.Match(num, out a, out b);Assert.That(a, Is.EqualTo(0));Assert.That(b, Is.EqualTo(2));

//0 3 2 4      1A2Bnum = new int[] { 0, 3, 2, 4 };            bingle.Match(num, out a, out b);Assert.That(a, Is.EqualTo(1));Assert.That(b, Is.EqualTo(2));

//5 6 7 8      0A0Bnum = new int[] { 5, 6, 7, 8 };            bingle.Match(num, out a, out b);Assert.That(a, Is.EqualTo(0));Assert.That(b, Is.EqualTo(0));

//4 3 2 1      0A4Bnum = new int[] { 4, 3, 2, 1 };            bingle.Match(num, out a, out b);Assert.That(a, Is.EqualTo(0));Assert.That(b, Is.EqualTo(4));

//1 2 3 4      4A0Bnum = new int[] { 1, 2, 3, 4 };            bingle.Match(num, out a, out b);Assert.That(a, Is.EqualTo(4));Assert.That(b, Is.EqualTo(0));        }

        [Test]        [ExpectedException(typeof(ArgumentException))]public void MatchTest2()        {int a;int b;int[] num;

//1 1 2 3num = new int[] { 1, 1, 2, 3 };            bingle.Match(num, out a, out b);

//1 2num = new int[] { 1, 2 };            bingle.Match(num, out a, out b);        }    }

我把对Match测试的代码写在一起,我喜欢一个Test函数对应一个功能函数。而把异常处理分开出来写了,怕前面的测试抛出异常,导致测试通过了。

功能代码

功能代码的目的就是通过所以单元测试。

public class Bingle{public int[] Answers { set; get; }private int attemptTimes;

public int AttemptTimes         {get{return attemptTimes;            }        }

public Bingle()        {            Answers = new int[4];        }

public void BuildAnswers()        {Random r = new Random();while(true)            {int i = r.Next(9999);                Answers[0] = i / 1000;                Answers[1] = i % 1000 / 100;                Answers[2] = i % 100 / 10;                Answers[3] = i % 10;

if (Answers[0] != Answers[1]                    && Answers[0] != Answers[2]                    && Answers[0] != Answers[3]                    && Answers[1] != Answers[2]                    && Answers[1] != Answers[3]                    && Answers[2] != Answers[3])                {return;                }            }        }

public bool Match(int[] attemptNum, out int bingle, out int match)        {            bingle = 0;            match = 0;if (attemptNum.Length != 4)            {throw new ArgumentException("Should be 4 digits.");            }if(!(attemptNum[0] != attemptNum[1]                    && attemptNum[0] != attemptNum[2]                    && attemptNum[0] != attemptNum[3]                    && attemptNum[1] != attemptNum[2]                    && attemptNum[1] != attemptNum[3]                    && attemptNum[2] != attemptNum[3]))            {throw new ArgumentException("Should be non repeating 4 digits.");            }

            ++attemptTimes;for(int i=0; i<4; ++i)            {if (attemptNum[i] == Answers[i])                {                    ++bingle;                }else{for (int j = 0; j < 4; ++j)                    {if (attemptNum[i] == Answers[j])                        {                            ++match;                        }                    }                }            }return (bingle == 4);        }    }

单元测试结果

如果通过所有单元测试,说明功能代码编写完毕,每次修改都有run单元测试。

NUnitLite version 0.2.0Copyright 2007, Charlie Poole

Runtime Environment -    OS Version: Microsoft Windows CE 5.2.21234  .NET Version: 2.0.7045.0

/Files/procoder/Bingle.rar3 Tests : 0 Errors, 0 Failures, 0 Not Run

UI 处理

功能代码写完以后,可以写UI了,具体UI代码见源代码,下面是执行效果。

源代码:Bingle.rar

环境: VS 2008 + WM 6 professional SDK + NUnitLite

转载于:https://www.cnblogs.com/procoder/archive/2009/07/08/1519122.html

Windows Mobile下猜数字游戏的TDD实现相关推荐

  1. Windows Mobile下使用CppUnitLite输出测试结果

    背景 TDD测试驱动开发是当前流行的开发方法及模式.遵循TDD的方法对开发程序库(Library)特别有用,因为Library就是为第三方提供一定功能接口的实现,使用TDD的方法可以预先为定义的接口提 ...

  2. 【查找】临近省赛,Alan邀请emoji玩起了猜数字游戏活跃一下大脑。游戏规则如下:首先Alan写下几个数字让emoji猜,当emoji猜完之后,Alan会给他一个提示(java)

    临近省赛,Alan邀请emoji大佬玩起了猜数字游戏活跃一下大脑.游戏规则如下: 首先Alan写下几个数字让emoji大佬猜,当emoji大佬猜完之后,Alan会给他一个提示,这个提示包含两部分:全对 ...

  3. 用python做C语言的猜数字游戏,[Python3 练习] 007 简单的猜数字小游戏

    题目:简单的猜数字小游戏 (1) 描述 程序随机生成一个数字,玩家用键盘输入所猜数字,在规定次数内猜对为胜. (2) 要求 程序随机生成一个 1 到 100 的自然数 有 7 次机会去猜 机会用尽之前 ...

  4. python猜数字1001untitled_如何利用Matlab GUI制作猜数字游戏

    第二堂课布置了一个Mission Impossible:如何利用Matlab GUI制作猜数字游戏 这个任务对很多人来说会非常困难,首先要面对的是 Matlab GUI的机制,这是完全未知的机制,在面 ...

  5. java猜数字游戏课程设计报告_Java程序设计课程设计-猜数字游戏设计.doc

    Java程序设计课程设计-猜数字游戏设计.doc 还剩 23页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 课 程 设 计 报 告课程设计名称 Jav ...

  6. c语言课程设计猜数字游戏报告,C语言课程设计-猜数字游戏报告.doc

    C语言课程设计-猜数字游戏报告 摘要 该软件在Windows系统上为玩家提供猜数字游戏的基本功能,游戏用户可以选择开始游.排行榜查看.帮助等主要功能.当用户选择开始游戏时,系统会提示用户排行榜上猜数字 ...

  7. c语言课程设计猜数字游戏报告,C语言课程设计猜数字游戏报告

    C语言课程设计猜数字游戏报告 C 语言课程设计----猜数字1摘 要该 软 件 在 Windows 系 统 上 为 玩 家 提 供 猜 数 字 游 戏的 基 本 功 能 , 游 戏 用 户 可 以 选 ...

  8. Windows Mobile下访问Sqlite的Native C++封装

    背景 当前移动设备开发领域,在本地数据存储方面,Sqlite几乎成了事实标准,Andriod (android.database.sqlite),iPhone (SQLite for iPhone S ...

  9. python猜数字游戏简单-python猜数字游戏快速求解解决方案

    python猜数字游戏快速求解解决方案.使用方法: 1. 保存代码为guessall.py 2. 执行python guessall.py > result.txt 3. 打开result.tx ...

最新文章

  1. 中科曙光携手甘肃酒泉,积极构建新型智慧城市
  2. Mysql入门实战中
  3. 千千静听歌词秀歌词搜不到_还在用QQ音乐、网易云?这个不到2M的听歌软件,美到炸!...
  4. exports、module.exports和export、export default到底是咋回事
  5. JDBC--Java Database Connectivity
  6. springMVC问题XXX is not mapped [from XX]或者Unknown entity: com.spring.main.pojo.Person
  7. Cachegrind:缓存和分支预测分析器
  8. Oracle/MySQL/PostgreSQL考题等你挑战(附假期活动获奖名单)
  9. 计算机图形学E1——OpenGL 方中有圆,圆中有方,无穷尽焉
  10. (73)FPGA模块调用(VHDL调用system Verilog)
  11. 任正非华为为什么暂不推出鸿蒙,任正非表示,华为的鸿蒙系统已经上网?惊喜吗...
  12. Hdu 1794 【二维成段更新】.cpp
  13. MariaDB数据库用户创建/删除及权限授权/撤回
  14. 大学入学计算机基础考试考什么,大学入学考试计算机基础考试.docx
  15. python自动化中使用unittestreport输出测试报告
  16. 墨刀怎么注册_墨刀的使用
  17. PowerDesigner16.5 生成MySQL 数据库模型
  18. python中的self
  19. python按照号段生成手机号接收验证码,「 python 」 python 实现短信验证码
  20. 【故障诊断】基于粒子群和多元宇宙算法优化最大相关峭度解卷积(MCKD)实现信号处理附matlab代码

热门文章

  1. python单元测试教程_Python单元测试框架unittest使用方法讲解
  2. android仿微信图片编辑器,electron/vue可编辑框contenteditable|仿微信截图
  3. linux中csh怎么运行,bash csh 设置环境变量 方法例子
  4. mysql long varchar2_案例:Oracle数据库long查询结果转换为varchar2类型方法的操作步骤...
  5. java 任务栏程序_如何在任务栏显示java程序图标
  6. ubuntu中的大小写
  7. 大学java怎么算学得好_为什么现在大学里很多计算机系的大学生,学编程的时候总学不好...
  8. java json clone_再谈java clone 以及 浅/深拷贝
  9. 百度图神经网络——论文节点比赛baseline代码注解
  10. opencv如何读取仪表中的指针刻度