博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows Mobile下猜数字游戏的TDD实现
阅读量:5117 次
发布时间:2019-06-13

本文共 5029 字,大约阅读时间需要 16 分钟。

背景

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

方案

强调需要TDD,所以我的实现方案也是TDD。

实现

使用NUintLite

测试代码需要使用NUintLite,NUintLite具体可以参考 。修改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,先写测试代码。测试代码的逻辑是按照写的,在实际使用中根据功能需求编写。

[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 1A0B num = 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 0A2B num = 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 1A2B num = 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 0A0B num = 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 0A4B num = 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 4A0B num = 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 3 num = new int[] { 1, 1, 2, 3 }; bingle.Match(num, out a, out b); //1 2 num = 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.0 Copyright 2007, Charlie Poole Runtime Environment -     OS Version: Microsoft Windows CE 5.2.21234   .NET Version: 2.0.7045.0 3 Tests : 0 Errors, 0 Failures, 0 Not Run

 

UI 处理

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

 

源代码:

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

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

你可能感兴趣的文章
在Server上得到数据组装成HTML后导出到Excel。两种方法。
查看>>
浅谈项目需求变更管理
查看>>
经典算法系列一-快速排序
查看>>
设置java web工程中默认访问首页的几种方式
查看>>
ASP.NET MVC 拓展ViewResult实现word文档下载
查看>>
jQuery Mobile笔记
查看>>
8、RDD持久化
查看>>
第二次团队冲刺--2
查看>>
VMware Tools安装
查看>>
Linux上架设boost的安装及配置过程
查看>>
[转载]加密算法库Crypto——nodejs中间件系列
查看>>
zoj 2286 Sum of Divisors
查看>>
OO5~7次作业总结
查看>>
如何判断主机是大端还是小端(字节序)
查看>>
Centos7 日志查看工具
查看>>
使用Xshell密钥认证机制远程登录Linux
查看>>
OpenCV之响应鼠标(三):响应鼠标信息
查看>>
python7 数据类型的相互转化 字符编码
查看>>
Android 画图之 Matrix(一)
查看>>
List<T>列表通用过滤模块设计
查看>>