Windows Mobile下猜数字游戏的TDD实现

简介:

背景

早上看了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 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

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

 

UI 处理

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

bingle1

 

源代码:Bingle.rar

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



    本文转自Jake Lin博客园博客,原文链接:http://www.cnblogs.com/procoder/archive/2009/07/08/1519122.html,如需转载请自行联系原作者


相关文章
|
弹性计算 Linux 数据安全/隐私保护
教程:幻兽帕鲁联机服务器多人游戏专用服务器(Windows)
幻兽帕鲁联机服务器多人游戏专用服务器(Windows)搭建教程,玩转幻兽帕鲁服务器,幻兽帕鲁Palworld多人游戏专用服务器一键部署教程,阿里云推出新手0基础一键部署幻兽帕鲁服务器教程,傻瓜式一键部署,3分钟即可成功创建一台Palworld专属服务器,成本仅需26元,阿里云百科分享2024年新版基于阿里云搭建幻兽帕鲁服务器教程
223 1
|
消息中间件 安全 API
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
SendMessage/PostMessage API 可以实现发送系统消息,这些消息可以定义为常见的鼠标或键盘事件、数据的发送等各种系统操作......
7817 1
C#实现操作Windows窗口句柄:SendMessage/PostMessage发送系统消息、事件和数据【窗口句柄总结之二】
|
3月前
|
机器学习/深度学习 人工智能 图形学
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
341 9
|
开发者 C# Windows
WPF与游戏开发:当桌面应用遇见游戏梦想——利用Windows Presentation Foundation打造属于你的2D游戏世界,从环境搭建到代码实践全面解析新兴开发路径
【8月更文挑战第31天】随着游戏开发技术的进步,WPF作为.NET Framework的一部分,凭借其图形渲染能力和灵活的UI设计,成为桌面游戏开发的新选择。本文通过技术综述和示例代码,介绍如何利用WPF进行游戏开发。首先确保安装最新版Visual Studio并创建WPF项目。接着,通过XAML设计游戏界面,并在C#中实现游戏逻辑,如玩家控制和障碍物碰撞检测。示例展示了创建基本2D游戏的过程,包括角色移动和碰撞处理。通过本文,WPF开发者可更好地理解并应用游戏开发技术,创造吸引人的桌面游戏。
827 0
|
开发框架 JavaScript .NET
【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found
【Azure 应用服务】Azure Mobile App (NodeJS) 的服务端部署在App Service for Windows中出现404 Not Found
194 0
|
API C# Windows
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
本篇主要介绍一些与窗口句柄相关的一些API,比如设置窗口状态、当前激活的窗口、窗口客户区的大小、鼠标位置、禁用控件等,以及介绍Winform中的句柄属性,便于直接获取控件或窗体句柄,以及不推荐...
4740 0
C#实现操作Windows窗口句柄:常用窗口句柄相关API、Winform中句柄属性和Process的MainWindowHandle问题【窗口句柄总结之三】
|
Web App开发 数据可视化 JavaScript
动画墙纸:将视频、网页、游戏、模拟器变成windows墙纸——Lively Wallpaper
动画墙纸:将视频、网页、游戏、模拟器变成windows墙纸——Lively Wallpaper
609 0
|
算法 C语言 Windows
C语言实现2048游戏(Windows版)
C语言实现2048游戏(Windows版)
|
编译器 程序员 C语言
游戏编程之二 windows编程基础
游戏编程之二 windows编程基础
185 0
|
Ubuntu 安全 Linux
【过关斩将般的一步步实现】windows本机通过xftp/xshell连接Ubuntu虚拟机服务器
【过关斩将般的一步步实现】windows本机通过xftp/xshell连接Ubuntu虚拟机服务器
1495 1
【过关斩将般的一步步实现】windows本机通过xftp/xshell连接Ubuntu虚拟机服务器