一步一步学WF系列(五)——工作流模拟猜数游戏

1. 摘要

在上文中,我们用了IfElse去模拟了一个登录的过程。

在本文中,我们来用While来模拟一个猜数游戏。

在最近的几篇文章中,我都会有一些模拟的小例子去讲解具体活动控件的用法,但是只是一个小例子,在实际工程中,我们都是用WF去做一个整体的宏观的框架流程,而绝不是这种小例子,还希望大家熟知。

但是,就像题目所说,让我们一步一步去学WF。从小做起。

2. While

正如他的名字一样,他代表的是我们在常规语言中的while语义。

只要他的条件为true,那么while中的活动就会循环执行。

3. 猜数游戏

我们来新建一个控制台应用程序。

然后这个猜数游戏是随机产生一个1到10的随机数,然后让用户去输入,最终返回用户他猜数的次数。

首先,让我们先向设计界面拖入一个While控件和2个Code控件。

image

在工作流后台代码中去声明一个result属性,并指定他的set属性,这样,客户端可以动态传入这个数,这个数字可以是随机产生,也可以是从数据库里读取,从文件里读取。

记得,我们要竭尽全力将工作流与具体的实现细节相脱离。

接下来我们用声明式代码条件去约定while活动的条件:

image

这样我们就每次都去判断输入和结果是否相等。

然后我们通过OutputParemeter来获取工作流中传出的参数。

完整代码示例如下:

Workflow1.cs

public sealed partial class Workflow1 : SequentialWorkflowActivity
{
    private int input;
    private int result;
    private int count;

    public int Count
    {
        get { return count; }
    }


    public int Result
    {
        set { result = value; }
    }

    public Workflow1()
    {
        InitializeComponent();
    }

    private void CodeActivity1_ExcuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("请输入你要判断的数:");
        string s = Console.ReadLine();
        input = Convert.ToInt32(s);
        count++;
    }

    private void codeActivity2_ExecuteCode(object sender, EventArgs e)
    {
        Console.WriteLine("成功");
    }
}

Program.cs:

class Program
{
    static void Main(string[] args)
    {
        using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
        {
            AutoResetEvent waitHandle = new AutoResetEvent(false);
            object count = null;
            workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) {
                count = e.OutputParameters["Count"];
                waitHandle.Set();
            };
            workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
            {
                Console.WriteLine(e.Exception.Message);
                waitHandle.Set();
            };
            Random r = new Random();
            int result = r.Next(10);
            Dictionary<string, object> dic = new Dictionary<string, object>();
            dic.Add("Result", result);

            WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication5.Workflow1),dic);
            instance.Start();

            waitHandle.WaitOne();
            Console.WriteLine("您猜了" + count.ToString() + "次");
        }
    }
}

image

4.  提示

在这里,很多朋友都问我,我们用工作流究竟干吗?工作流究竟有什么用?之前的这些例子,用代码不也一样写得很好么?

因此,我觉得有必要再次重申工作流的意义和用途。

工作流为我们提供的一个宏观的框架,我们用工作流搭建出来的应该是一个复杂的业务流程,或者他们事件驱动,或者他们顺序执行。

他们的过程一般不会像登陆,猜数这样简单,而需要持久化,或者持久化到磁盘文件中,或者持久到数据库中。这些我们在后文中都会提及到。

我们在这里只要记得,工作流为我们解决的是一个宏观的时事件过程。

5. 总结

在本文中,我们主要介绍了While活动的用法,以及工作流与宿主程序之间的参数传递问题。

还是希望大家把代码自己敲一遍,加深记忆。

下文预告:《一步一步学WF系列(六)—— 工作流模拟投票程序》

转载于:https://www.cnblogs.com/kym/archive/2009/04/17/1438171.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
程序部 码农们的家乡 程序猿的部落 头发的战俘集中营 先说这个整个部门啊 程序游戏程序员 需要习什么语言呢 这要看是什么游戏 如果是页游 一般需要AS3或者是HTML6 如果是手游平台 那一般是JAVA 如果是PC和游戏机 那一般是C++ 我主要说的是另一个 我认为这个部门的所有职位都必须要非常了解游戏 可能很多人觉得 只要代码写得好就好啦 诶不是啊 这个部门的人懂不懂游戏游戏的整体品质有极大的影响 因为如果这个部门的人对游戏不熟悉 他们将很难抓住一些细节的东西 设计部或者技美还是会提出细节的需求 当然这个前提是这些人也有大量游戏经验 如果像国内很多团队那样 这个需求就算交货了 但就算他们能够提出更细节的需求 第一 如果每个细节都得说那么清楚 那工作量和沟通成本会呈指数放大 第二 这里面还是很多的东西是别人从表面看不出来的 甚至根本不知道怎么提出需求 比如如果这个图标拖出去的时候 这个技能刚好没了呢 比如这是个武器技能 刚好这个武器突然坏了呢 或者晚点把这个图标拖到了正在cd的技能上的 又或者把他的背包格子呢 又或者拖出来的的时候没有放左键情况下按了右键 我原本右键是可以触发技能的呢 等等这些情况到底应该发生什么事情 一个熟悉和不熟悉游戏的程序员 考虑到的是完全不同的情况 有些情况QA部门能够发现出来 但有些就很难发现 而这个时候就会留下BUG 同理 在战斗系统 升级系统等等各个系统都有这样的例子 比如战神一个按键回收斧头 这能提出一大堆问题 斧头在飞回来的路上碰到小屁孩怎么办 玩家松手了怎么办 放技能了怎么办 换武器了怎么办 播放过场了怎么办 等等一大堆问题 虽然如果出了BUG总会被抓出来 但是一批好的程序员 如果在一开始就能理清这些逻辑 那无疑让游戏整体品质大大提高 所以一个好的游戏程序员 不能什么事都靠设计提需求 靠QA反馈BUG 自己也需要经验和判断 这决定了游戏的成品品质 而想要成为这样的游戏员 只会写代码可不够啊 还需要大量的游戏经验以及 对这些细微之处的观察 观察好的游戏是怎么处理这些奇葩情节 思考他们是怎么编写这些复杂逻辑 方能成为一个好的程序员 那现在说说这个部门各个职位
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值