浏览模式 : 普通 | 列表
1 | 

数独源码下载

[ 2008-9-12 16:49:28 | 作者 : Conanlwl ]

数独是一种源自18世纪末的瑞士,后在美国发展、并在日本得以发扬光大的数学智力拼图游戏。拼图是九宫格(即3格宽×3格高)的正方形状,每一格又细分为一个九宫格。在每一个小九宫格中,分别填上1至9的数字,让整个大九宫格每一列、每一行的数字都不重复。

当我拿到某报纸看到上面有数独的时候,我都会拿起一支铅笔和一只珠笔来填写,首先先用铅笔在空格上填上所有可能的数字..然后再根据全局的逻辑推理来确定某一个格上的数字,再用珠笔填上去.所以本程序也是本着玩家的角度,实现了在格子上注释的功能.并在填写以后,自动对相应的格子去除注释.

在新页面里试玩: http://www.flex3.net/demo/sudoku/sudoku.html  

源码下载:下载

对对碰游戏,相信大家也并陌生了.游戏规则也很简单,就是随意转换地图中的相邻的两个图案,只要转换后,能够使得某一种图形在横排或竖排相邻并且个数超过三个,即可消除这几个图形.不过今天研究的不是怎样玩游戏,而是如何来写游戏.先试玩一下就游戏先吧 点击试玩  源码下载

根据流程,我们就可以一步一步的来完成游戏的编写了.在连连看设计思路与源码那里我已经介绍了一些基本的前期工作,例如,生成地图,显示,还有地图的一些操作如洗牌等的一些讲解,所以这里就略过了介绍,主要讲一下几个主要算法.

第一个,就是遍历整个地图,寻找符合消除条件的所有方块.

由于消除条件是有横排跟竖排之分,所以我们也必须对这两种情形,进行检测.

首先判断相连的三个图形(例如第1,2,3个)是否相同,不是则右移一位再判断另三个图形(此时应是第2,.3,4个)是否相同,如果第1,2,3个图形相同,则继续尝试判断第4个,第5个....是否也相同,直到找到不相同的为止.然后下次另找一对进行比较时就不用再从2,3,4开始了,而是从可消除的方块之后开始判断了,如前次1,2,3,4,5图形相同,则本次判断就从,6,7,8三个开始判断,再判断成功后,我们用一个数组cancelArray来存放这些可消除的方块的位置,..然后一直遍历整个地图..以下是该算法的代码:

//检测地图中的可消除元素并存于数组cancelArray里面.
        public ...


源代码下载

地图有了,算法也有了.那么现在就是如何把这些给结合起来并显示出来了.

我们游戏中的每一个图案,我们可以把他抽象为一个方块类 Block类.因为他是可以被点击的,所以我们可以直接用一个SimpleButton来实现,SimpleButton它有四个属性可以设置按钮各种状态的显示对象.

我们的算法在什么时候调用呢?什么每点一次Block就得调用一次呢?其实是没有必要的,必须得上次已经有点过一次图案了,那么再点击另外一个图案时才需要调用算法来进行寻路检测,因此我们必须要记录上一次到底是点了哪一个按钮,以及本次到底点了哪个按钮?我在程序里分别使用了两个数组来记录这两个数据,上一次按下的记录为lastClick:Array,本次按的为nowClick:Array,如果游戏刚开始还没有点击过任何一个图案或者刚消完一对图案,那么此时的上一个点击就为空了,所以就设为[-1,-1],所以只要判断上一次点击的不是[-1,-1],而且现在按的不跟上一次按的一样,就是调用算法的时候了.

本人对数组有种特别的感情,因为数组有一个好处,就是他的副本跟他本身在内存中指的都是同一个地址,这有点类似于C++中的指针,所以,我们只需要修改其中的一个,就可以全部都修改到,所以我们在实例化一个Block实例的时候,传了一个nowClick的副本给他,然后在每一次点击图案的时候,对副本进行改值,此时,nowClick本身的值也跟着给改了.

以下是Block类的全代码.

/*
Author: Alan.Lin
Blog:http://www.conanlwl.net
连连...


在第一节中,我们已经知道了如何生成一个初始地图,那么接下来就是必须对此地图中对被点击到的两个图案进行连接测试,当然,首先必须要求两个点击的图案必须一样,否则就无需做连接测试了

那么连接的情况就有:

  • 直线相连
  • 一个折点的相连
  • 二个折点的相连

那么我们先来实现直线相连测试的算法.直线相连,分为两种情总,一种是两个目标图案处于同一行,另一种就是处于同一列.

以下是判断的代码:

c为列,r为行,所以c1,r1为第一个图案的坐标,c2,r2为第二个图案的坐标.我们将他抽像为一个点吧.那么第一个图案设为点P,第二个图案设为点Q

//判断同一直线上的两个点是否通畅
        private function lineCheck(c1:uint,r1:uint,c2:uint,r2:...


一.地图的生成

在上一篇文章中,我们已经试玩了本连连看的DEMO了.而地图是由一个由M*N个的矩形图案组成的.因此我们可以设定地图的行数为ROWS,列数为COLS,然后用一个二维数组来存储地图元素MapArray[ROWS][COLS],其中每个数字代表一种图案.而0则为通路,也即无图.所以,我们的地图数组可能是以下这样的一组数据

[[0,0,0,0,0,0],
 [0,1,2,1,3,0],
 [0,4,4,2,5,0],
 [0,6,5,6,3,0],
 [0,0,0,0,0,0]]

想想为何要在周围的一圈加上0?答案在以后的寻路代码中解答.

那么,这样的地图有什么特点呢?

  1. 地图中的每一个数字的个数都是偶数,也即都是成对的出现
  2. 地图的排列必须是随机排列的.
  3. 地图中的每一个数字的种类不能大于已有的图案的个数

那么一共有多少对大于0的数字呢?一共是(ROWS-2)*(COLS-2)/2对.那么初始地图的设计思路便是,先用一个一维的临时数组,tempArray,成对的往这个数组里推一个随机的大于0的数字进去,一共推(ROWS-2)*(COLS-2)/2次,则此时的tempArray的元素可能为,[2,2,3,3,1,1,6,6,4,4,5,5],接着再通过数组的自定义排序函数将数组打乱最后再将此数组转化为二维的数组并同时在周围加多一圈的0以后,即为我们的初始地图了.以下是生成初始地图的代码:

        public static const COLS:uint...


RPG游戏设计之逍遥的房间

[ 2008-4-24 22:16:48 | 作者 : Conanlwl ]

没做LOADING提示,所以需要等一下加载完以后才可以看到画面. 点击预览

首先看一下整个工程的结构.

由于是一个小DEMO.所以很多东西都没有抽象出来.例如角色类Role就必须得抽象出一个人物的基类出来..等

LoadImage.as 主要是加载图片,然后存为BitmapData类型以备调用.

代码:

package net.conanlwl
{
 import flash.display.Sprite;
 import flash.display.Loader;
 import flash.net.URLRequest;
 import flash.net.URLLoaderDataFormat;
 import flash.net.URLLoader;
 import flash.display.Bitmap;
 import flash.display.BitmapData;
 import flash.geom.Point;
 import flash.events.Event; 
 
 public class LoadImage extends Sprite
 {  
  //var
  private var _picSrc:String;  
  private var _bitmapdata:BitmapData;  
  
  public function LoadImage(PicSrc:String){
   _picSrc = PicSrc;  &n...


RPG人物行走以及模仿跟踪

[ 2008-4-11 15:17:40 | 作者 : Conanlwl ]

首个AS3游戏DEMO.实现了人物八方向的行走,以及2DRPG游戏中经常看到的,就是我们的主角,身后带着一帮人一起遨游整个游戏世界.如图: 

  ...


[源码]猜数字算法[二]

[ 2008-3-23 14:42:14 | 作者 : Conanlwl ]

刚实现了计算机出题,让我们猜,那可以让我们出题,让计算机来猜吗?当然可以,而且也可以验证一下计算机是不是都能在七次以内完成数字的猜测..首先先看一下算法的演示.[点进预览]

算法的原理,还是使用网上较为普遍的枚举排除法,因为原理简单,所以也较容易理解与实现.

从0~9随便取出四位组成一个互不相同的四位数,按照组合的算法,一共有10*9*8*7=5040个.也就是无论你想的是哪一个数,一定是在这5040个里面.所以我们每一步就必须枚举出这5040个可能组合,并存于一个数组中,我们称这个数组为字典,我们的答案就存在这个字典里面,每一次我们都从字典里取出一个来猜测,并排除一切不符合判断结果的项,从字典里删除,一直排除到只剩一项的时候,就是我们的正确答案了.

.我们可以先通过一个函数来检测这个四位数是否是各个位置上都不相同的.

var dictArray ;//当前可能枚举的数组

function chkSameNum(num)//检查数字中是否有相同的数字
{
 num = parseInt(num,10);//保证如0123这样的数能够正确的被转化为10进制的数
 var a=parseInt(num/1000)%10; 
 var b=parseInt(num/100)%10;
 var c=parseInt(num/10)%10;
 var d=parseInt(num)%10;
 
 if(a==b || a==c || a==d || b==c || b==d || c==d) return true;
 return false;
}

接着我们可以通过一个循环来存储整个初始枚举字典.

 dictArray = new Array();
 for(var i=123;i<=9876;i++)
 {
  if(!chkSameNum(i))
  {
   if(i<1000)dictArray.push("0"+i);
   el...


[源码]猜数字算法[一]

[ 2008-3-23 12:24:36 | 作者 : Conanlwl ]

猜数字是我初中时在课堂上最喜欢玩的游戏....游戏平台嘛.........我的文曲星PC260........

这个游戏的规则比较简单,一般两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4位数,不能让猜得人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。

如正确答案为5234,而猜的人猜5346,则是1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为2B,合起来就是1A2B。

接着猜的人再根据出题者的几A几B继续猜,直到猜中为止。

次数限制
有的时候,这个游戏有猜测次数上的限制。根据计算机测算,这个游戏,如果以最严谨的计算,任何数字可以在7次之内猜出。而有些地方把次数限制为6次或更少,则会导致有些数可能猜不出来。而有些地方考虑到人的逻辑思维难以达到计算机的那么严谨,故设置为8次甚至10次。也有的没有次数上的限制。

首先我们先来完成对游戏的实现,反过来再为游戏完成算法反猜...[游戏预览]

游戏的实现必没有什么难度,只是一些简单的算法而已,首先生成一个各不相同的四位数,可以向用一个项为0~9的数组,然后每次从数组里随机取出一个数字并删除该位置的数字,这样便可以保证四位数在各个位上互不相同..代码实现为:

function getRandomNum()//生成四位不相同數字
{
	var strArray = new Array(0,1,2,3,4,5,6,7,8,9);
	var s="";
	for(var i=0;i<4;i++)
	{
		s += strArray.splice(parseInt(strArray.length *Math.random()...


1 |