posts - 18, comments - 67, trackbacks - 1, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

2008年9月8日

五子连珠是 一个同色相消类游戏。你可以移动小球, 使其从一个位置移动到另外一个位置,尽量使同一颜色的小球排成一横行、竖行或者斜行。只要在这些行上的小球达到5个或者多于5个,这些球就可以消去。直达棋盘上没有空格放置小球时,游戏就结束了。此游戏类似GNOME/Linux下的五子连珠游戏,但增加了炸弹、七彩球等元素 ,所以玩起来更有趣。
支持网站: http://www.colobu.com

下载

 

posted @ 2008-09-08 10:12 smallnest 阅读(471) | 评论 (0)编辑

2008年4月14日

物价在节节攀升,CPI居高不下,股市损失惨重,房贷似大山压顶......
除了提高我们微薄的收入以外,我们还应该从日常的点点滴滴做起,节约每一分Money。

流水记账软件就是帮助你提高理财水平,分析你每月的收入和支出,帮助你节省不必要的开支。
它使用简便,就像在普通便签本上记录一样简单,可以方便查看历史趋势,打印相应的财务报告。

并且,它是一个纯绿色的免费软件,无须联网便能运行。

下载


posted @ 2008-04-14 12:52 smallnest 阅读(837) | 评论 (21)编辑

2006年2月13日

拖拉机游戏是一个广泛流传的拖拉机游戏,有的地区又叫做升级或者双抠(也有人说升级和拖拉机有所不同),拖拉机游戏在基本的规则上改变,主要是增加游戏的趣味性,比如有的地区可以一J到底,将庄家从J一下拉到2,也有的可以从A拉到JQ6等玩法。

 

拖拉机大战是采用dotnet framework开发的一款拖拉机游戏,它实现了拖拉机游戏的基本规则,剔除了2是常主的功能,增加了一些亮主、流局的规则设置,还有一些扣底算法的选择、必打数字的设定、购到底的规则选择等,还可以使用机器人帮助您打牌,显示目前的进度情况等。

 

在界面方面,拖拉机大战提供了牌面牌背制作功能,您只需轻点几下鼠标,就可以将您机器中喜爱的数码照片制作成牌面牌背,也可以在打牌的时候享受音乐的乐趣。

 

对于dotnet程序开发者来说,您还可以利用拖拉机大战的插件机制,开发您自己的出牌算法插件。您只需实现一个算法接口,这个算法接口定义了两个方法,您只需实现这两个算法,就可以完成您自己的认为比较厉害的出牌算法。有趣的是,你还可以和其他人进行算法比赛,以决出谁的算法更为优秀。

 

下面将介绍这个接口,以及一个简单的而且不太合法的算法实现。

 

如果您要准备写一个拖拉机的算法,您就需要引入Kuaff.Tractor.Plugins.dll这个配件,它包含了Kuaff.Tractor.Plugins. IuserAlgorithm接口。

这个接口的定义为:

using System;

using System.Collections;

using System.Text;

 

namespace Kuaff.Tractor.Plugins

{

    public interface IUserAlgorithm

    {

        /// <summary>

        /// 算法作者

        /// </summary>

        string Author

        {

            get;

        }

        /// <summary>

        /// 算法作者的email地址

        /// </summary>

        string Email

        {

            get;

        }

        /// <summary>

        /// 算法名称

        /// </summary>

        string Name

        {

            get;

        }

        /// <summary>

        /// 算法介绍

        /// </summary>

        string Description

        {

            get;

        }

 

        /// <summary>

        /// 首先出牌的算法。

        /// </summary>

        /// <param name="who">当前用户是谁,1为南家,2为北家,3为西家,4为东家</param>

        /// <param name="suit">当前主牌的花色,1为红心,2为黑桃,3为方片,4为梅花,5为王(无主)</param>

        /// <param name="rank">当前打几,0为打21为打3,2为打4........11为打K12为打A,53为打王</param>

        /// <param name="master">当前谁为庄家,1为南家,2为北家,3为西家,4为东家</param>

        /// <param name="sendCards">当前一局各家已经出掉的牌,sendCards[0]为南家,sendCards[1]为北家,sendCards[2]为西家,sendCards[3]为东家</param>

        /// <param name="myCards">此用户手中的牌</param>

        /// <returns></returns>

        ArrayList ShouldSendCards(int who, int suit, int rank, int master, string[] sendCards, string myCards);

       

        /// <summary>

        /// 改自己出的牌时的算法(自己不是首家)

        /// </summary>

        /// <param name="who">当前用户是谁,1为南家,2为北家,3为西家,4为东家</param>

        /// <param name="suit">当前主牌的花色,1为红心,2为黑桃,3为方片,4为梅花,5为王(无主)</param>

        /// <param name="rank">当前打几,0为打21为打3,2为打4........11为打K12为打A,53为打王</param>

        /// <param name="master">当前谁为庄家,1为南家,2为北家,3为西家,4为东家</param>

        /// <param name="whoIsFirst">谁首先出的牌,1为南家,2为北家,3为西家,4为东家</param>

        /// <param name="sendCards">当前一局各家已经出掉的牌,sendCards[0]为南家,sendCards[1]为北家,sendCards[2]为西家,sendCards[3]为东家</param>

        /// <param name="currentSendCards">首家以及自己的上家出的牌</param>

        /// <param name="myCards">此用户手中的牌</param>

        /// <returns></returns>

        ArrayList MustSendCards(int who, int suit, int rank, int master, int whoIsFirst, string[] sendCards, ArrayList[] currentSendCards, string myCards);

    }

}

它首先定义了几个属性,这几个属性分别代表算法作者的名称以及email,算法的名称以及简单介绍。

 

ShouldSendCards方法定义了首家出牌的算法。比如该东家首先出牌时,调用ShouldSendCards得到东家应该出的牌,接着调用MustSendCards得到北家应该出的牌,接着调用MustSendCards得到西家应该出的牌,接着调用MustSendCards得到南家应该出的牌,程序然后进行计算,得到下一次的首家,然后通过ShouldSendCards得到首家出的牌……周而复始,直到手中的牌出完。

 

通过上面一段的介绍,你也明白了MustSendCards方法的含义,就是非首家应该出牌的算法。

 

下面这个SampleUserAlgorithm类就是简单实现了这个接口的一个类。它的源代码可以在游戏的sources目录得到,编译好的配件放在plugins目录。您编译好的插件都必须放在plugins目录,游戏可以自行读取plugins文件下的dll文件,分析并得到编写的插件类。

 

这个SampleUserAlgorithm类之所以简单,是因为它的首家出牌算法是随便挑一张牌就出了,而随牌算法假定了首家出的是一张牌,自己随便出了一张此花色的牌。您可以在这个插件上进行完善。

 

游戏下载地址(包含了接口和一个简单的算法实现源代码)点击这里下载地址2下载地址三下载地址四,软件版本1.2.0.356.

 

将您编写的插件编译成dll放在游戏的plugins目录,在程序中设置某一方采用您编写的算法,您就可以和程序中内置的算法进行对战了。如果您的算法不合法(比如首家出拖拉机,您手中有拖拉机却不出),说明您的算法还不完善,程序会自动将此方的算法更改为程序中内置的算法。

posted @ 2006-02-13 10:03 smallnest 阅读(1670) | 评论 (6)编辑

 * 增强了自己制作牌面的功能
 * 增加了制作牌背的功能,游戏可以更换牌背图案
 * 增加了每圈完毕后赢家显示个小图标的功能
 * 增加了A勾到J的功能
 * 增加了插件机制,.net开发人员可以编写自己的出牌逻辑
 * 增加了一个简单的出牌逻辑的源代码

dotnet程序开发爱好者可以自己设计出牌算法了,无需考虑UI方面的设计。

posted @ 2006-02-13 09:12 smallnest 阅读(153) | 评论 (0)编辑

2006年1月24日

下载这两个文件,放到拖拉机大战的cards文件夹下,在玩拖拉机游戏时九可以直接使用这两套扑克图案了。

图案一         图案二

拖拉机大战游戏下载




posted @ 2006-01-24 10:36 smallnest 阅读(157) | 评论 (0)编辑

2006年1月23日

拖拉机大战1.1.0.320发布了,增加了更多的功能。下载    下载地址2
你可以制作自己的扑克牌了。只要你的机器上有图片,你只需点击两下鼠标,就可以完全制作出一套
你自己的扑克牌。“清纯美女”、“美女大头贴”、“小狗狗”、“自我写真”、“欢乐宝宝”,想怎么做,就怎么做。

其他新增的功能:
1. 背景音乐,随机播放和自选播放,(mid、mp3、wav格式的文件),可自己增加音乐文件

2. 一J到底和一Q到半的扩充规则

3. 设置必打数字

4. 流局设定,是流局还是揭底

5. 扣底规则,提供三种扣底算法

6. 亮主规则,允许设置无主,自反以及加固功能

7. 机器人罗伯特,它可代替您自动出牌




posted @ 2006-01-23 08:12 smallnest 阅读(1152) | 评论 (4)编辑

2006年1月18日

一直以来一直在玩世纪鼎点的拖拉机游戏,圣诞节前和朋友一起玩,朋友说为什么你不用.net开发一个呢,
至少游戏玩的不爽的时候自己可以调整一下。

现在赶在春节之前将其发布,愿能给大家在休闲娱乐的时候带来一点快乐,也祝大家新春快乐,万事大吉。

希望提出您的宝贵的意见和建议。



点击此处下载

需.net framework 2.0

posted @ 2006-01-18 08:24 smallnest 阅读(2078) | 评论 (13)编辑

2006年1月4日

最近因为要翻译一个开源项目,里面有大量的英文需要翻译。
考虑到google的翻译不错,所以特地做了一个小工具,用来将中文文本
翻译成多国语言的文本。


你可以在此处下载。

源代码

posted @ 2006-01-04 17:21 smallnest 阅读(2158) | 评论 (13)编辑

2005年12月15日

总喜欢拿visual studio 2005和eclipse做对比,eclipse的帮助文件中多各个类型的图标都做了归纳介绍,
在MSDN中没有找到相应的文档,所以我在这里做了一个简单的总结,包括了大部分的类型。
 

posted @ 2005-12-15 16:54 smallnest 阅读(1631) | 评论 (2)编辑

在上一篇文章中介绍了mono的中文问题,不管怎样,我们总算可以让mono编译的程序显示汉字了。如果你要开发国际化的程序或者组件,你就应该使用Mono的国际化方法,处理相关的国际化文本。

 

在本篇文章中国际化专指程序中设计的字符串,不会讨论日期、货币等国际化问题。

 

现在,Mono利用gettext进行程序中字符串的翻译,你也可以采用gettext#进行国际化,但它不是Mono推荐的方式。

 

Mono.Posix配件中的Mono.Unix命令空间下,有一个Catalog类,它包装了libintl提供国际化服务。

 

本文以一个控制台程序演示如果进行国际化处理。

 

先看一个不进行国际化的控制台程序:

using System;

class MainClass

{

       public static void Main(string[] args)

       {

              Console.WriteLine("Hello everyone!My name is smallnest");

              int i = 32;

              Console.WriteLine("I'm {0} years old.",i);

       }

}

 

其中涉及到两个字符串:

"Hello everyone!My name is smallnest"

"I'm {0} years old."

 

其中第二个字符串涉及到单复数的问题,作为一个友好的字符串,如果年龄是1的话,字符串应该为"I'm {0} year old.",其中的year应该为单数形式。

 

下面我们处理国际化:

首先在monodevelop中引入Mono.Posix.dll(如果手工编译,需要加-t: Mono.Posix),

然后Main.cs文件中加入

using Mono.Unix;

 

Main方法中初始化Catalog类:

Catalog.Init("i18n","./locale");

程序在运行时将在. locale/zh_CN/ LC_MESSAGES/目录下查找i18n.mo文件,如果文件存在,并且含有国际化的文本,将使用国际化的文本替换,否则不替换。

 

最后,Main.cs文件如下:


Catalog.GetString方法是采用普通的方式替换文本。

Catalog.GetPluralString将根据条件选择单数形式的文本还是复数形式的文本,如果第三个参数是1,将采用单数形式的文本,否则采用复数形式的文本。

 

Main.cs文件所在的目录下,运行生成Main.exe文件:

mcs –codepage:utf8 Main.cs

 

 

使用xgettext导出需要国际化的po文件:

xgettext --from-code=UTF-8 Main.cs -o zh_CN.po

 

翻译zh_CN.po文件:

# a sample for Internationalization

# smallnest <smallnest@gmail.com>

#  http://www.kuaff.com

#

 

msgid ""

msgstr ""

"Project-Id-Version: PACKAGE VERSION\n"

"Report-Msgid-Bugs-To: \n"

"POT-Creation-Date: 2005-12-15 11:32+0800\n"

"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"

"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"

"Language-Team: LANGUAGE <LL@li.org>\n"

"MIME-Version: 1.0\n"

"Content-Type: text/plain; charset=gb2312\n"

"Content-Transfer-Encoding: 8bit\n"

"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"

 

#: Main.cs:10

msgid "Hello everyone!My name is smallnest"

msgstr "大家好,我叫晁岳攀."

 

#: Main.cs:12

#, csharp-format

msgid "I'm {0} year old."

msgid_plural "I'm {0} years old."

msgstr[0] "我今年{0}岁了"

msgstr[1] "岁月不饶人,兄弟今年{0}岁了."

 

注意将其中Content-Type: text/plain; charset=charset修改为

Content-Type: text/plain; charset=gb2312

 

zh_CN.po转化为zh_CN.mo文件:

mkdir -p locale\zh_CN\LC_MESSAGES

msgfmt zh_CN.po -o locale/zh_CN/LC_MESSAGES/i18n.mo

 

因为我们的locale设置zh_CN.gb2312,所以运行Main.exe程序将会显示中文输出,如下图所示:

posted @ 2005-12-15 13:57 smallnest 阅读(1263) | 评论 (3)编辑