分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
转眼间2009年又过了六分之五,一年间里面发生很多事情。在这些事情里面,让我了解很多,失去很多也得到一些经验。在这一年期间,认识了很多好友,他们都是一群热爱flash 的好友,走在一起也算是一种缘分。
话说回头,我们都知道flash和flex的内容方向有许多,一个人再厉害精力也是有限,只能选择性去找一些方向来进行学习。曾经过去一次偶然机会,帮大学的一个同学制作个一个As2的抽奖程序,当时我什么项目经验都没有,仅仅会一点As2的编程语法,就这样答应了同学制作了一个抽奖程序,当时没有收过一分钱,当时制作出这个也非常兴奋,心情难以表达成功感。后来,我就喜欢上制作了这些抽奖程序。一口气制作手机抽奖,选号抽奖等几个小应用程序。不过,说到抽奖程序,里面涉及的东西还是很多。最近做了一个小的抽奖程序,现在把最近的笔记都记录一下。
游戏抽奖程序需求说明:
一、需求背景:
为了一项活动进行一个游戏抽奖活动,需要制作一个flash应用程序完成这一次官方的活动。
二、需求功能说明:
游戏当中,有四个礼物区,每一个礼物区里面有125份礼物(125x4=500)。在抽象过程中,随机抽选四个区,同一个区的礼物是相同的。抽奖的过程中,抽奖完一个区的时候,这个区就不可以进行抽取,直到完成了抽奖形式的时候。四个区都变成了不能继续抽取,就结束了抽奖。
注意:
为了防止礼物数被误操作,采取到礼物数更改的策略进行礼物数修正。并且可以选那个区为标记不可以再抽取。以做到更加灵活。
制作时间:9天内进行交户使用。
三、制作平台:
Flash cs3 制作
四、制作方案:
初步方案一:
随机抽取四个区,假设是分别代号为1,2,3,4 。
第一次 抽取为1的时候,这时候减去第一区的礼物数()
第二次 抽取为 2 的时候,这时候减去第二区的礼物数()
第三次 抽取为3 的时候,这时候减去第三区的礼物数()
第四次 抽取为4的时候,这时候减去第四区的礼物数()
。。。。。。。
………………..
……………………..
当第一区礼物数为0的时候,则随机抽取的数组长度变为3,同时标记1区为灰色,不可以进行抽取。
当第二个 区礼物数为 0的时候,则随机抽取数组长度变为2,同时标记2区为灰色,不可以进行抽取
四个区设计的时候,可以让用户选中和不选中两种状态,根据礼物数的设定判断该区是否纳入随机抽取的范围当中。
这个是第一方案做法比较灵活,假设错误了都可以 进行重新设定来进行礼物重新抽取。
五、程序设计
在这次程序设计当中,主要使用了三个类,第一个是礼物类,第二个是移动框类,第三个就是文档类
礼物类:Gigt.as
移动框:DrawAnimation.as
主程序: Main.as
礼物类当中:初步功能构想如下:
1.可以设置和获取礼物数,可以输出礼物数
2.可以设置和获取礼物总数(暂定)
3.可以设置礼物的代号(暂定)
4. 克隆对象
这个类里面,目的用于存储礼物数。
移动框类: 初步构想如下:
1. 移动框坐标更改
主程序类:
1.在这个主要程序类当中,我们使用时间计算器来随机抽取数组当中的号码。
2.其次我们需要进行对键盘监听,设置键盘相应的控制,如开始,抽取等一些动作。
3.同样在这个类当中,我们要处理界面的GUI里面的组件和文本。这样我们通过礼物类绑定在文本里面,当数据更改的时候,则文本也会进行相应更改。
4.处理相应的逻辑关系和动画显示过程
5.处理checkbox组件的选种和不选中两种状态
6.结合一些动画缓冲类处理一些元件的动画 效果
抽奖原理:
说到抽奖的原理,每一个人的做法都不一样,比较常见的做法是采用随机数进行选取数组的内容,当选取了就对其数据进行删除操作。这样就能够确保抽奖的时候不重复。不过为了确保原本数组不影响,在开始程序的时候,可以对原本的数组进行深度复制,Copy一份出来进行操作。这样也是一种方案。
代码清单:
礼物类Gift.as:
- package
- {
- //礼物的基础类
- public class Gift
- {
- private var gifts:int;//礼物数
- private var totals:int;//礼物总数
- private var temp:int;//临时礼物数
- private var giftid:String;
- public function Gift()
- {
- }
- // 创建新对象
- public function clone():Gift
- {
- return new Gift ;
- }
- //设置礼物对应的ID值
- public function set id(value:String):void
- {
- giftid=value;
- }
- //获取礼物对应的ID值
- public function get id():String
- {
- return giftid;
- }
- /*
- 设置礼物的数
- */
- public function set Gifts(num:int):void
- {
- gifts=num;
- }
- //获取礼物数
- public function get Gifts():int
- {
- return gifts;
- }
- //让礼物数变成字符串
- public function toString():String
- {
- return String(this.Gifts);
- }
- //获取最大的礼物数
- public function get total():int
- {
- return totals;
- }
- //设置最大的礼物数
- public function set total(totals:int):void
- {
- totals=totals;
- }
- }
- }
DrawAnimation.as 类 用于移动框使用
- package
- {
- //抽奖时候的动画类
- import flash.display.MovieClip;
- import flash.events.*;
- public class DrawAnimation extends MovieClip
- {
- private var mc_circle:MovieClip;
- public function DrawAnimation(mc:MovieClip)
- {
- this.mc_circle=mc;
- }
- //改变动画光圈位置
- public function changeXY(x:int,y:int):void
- {
- this.mc_circle.x=x;
- this.mc_circle.y=y;
- }
- }
- }
主程序Main.as:
- package
- {
- //抽奖程序 version 版本1.0
- import flash.display.MovieClip;
- import flash.events.*;
- import flash.net.*;
- import flash.ui.Keyboard;
- import flash.text.*;
- import flash.utils.Dictionary;
- import flash.utils.Timer;
- import fl.controls.NumericStepper;
- import fl.controls.CheckBox;
- import flash.display.Bitmap;
- import flash.display.BitmapData;
- import flash.display.Loader;
- import flash.system.fscommand;
- import flash.media.*;
- import caurina.transitions.*;
- public class Main extends MovieClip
- {
- private var array:Array;//随机存取数
- private var data:Array=[11,22,33,44];//随机存取数
- private var gift_num1:Gift=new Gift();//第一区礼物数
- private var gift_num2:Gift=gift_num1.clone();//克隆对象
- private var gift_num3:Gift=gift_num1.clone();//克隆对象
- private var gift_num4:Gift=gift_num1.clone();//克隆对象
- private var time:Timer;//计时器
- private var num:int=0;
- private var temp:Array;//用于临时的数组存放
- private var xArray:Array = [118,342,580,860];//记录移动框的位置
- private var yArray:Array = [353,268,218,225];
- private var currentID:uint = 0;//当前的号码值
- private var speed:int = 5;//用于控制移动框的速度
- private var start:Boolean = false;//是否开始
- private var maxNum:int=500;//默认开始最大礼物数值
- private var IsEnd:Boolean=false;//判断抽奖是否结束,如果结束了就启动这个
- private var sound:MySound=new MySound();//库链接的抽奖的声音
- private var channel:SoundChannel=new SoundChannel();
- private var key:Boolean=true;
- private var animation:DrawAnimation;//移动框
- public function Main()
- {
- init();
- }
- //初始化应用程序
- private function init():void
- {
- fscommand("fullscreen", "true");//全屏
- array=data.concat();//复制一个数组副本
- temp=data.concat();
- gift1.addEventListener(Event.CHANGE,onChange);
- gift2.addEventListener(Event.CHANGE,onChange);
- gift3.addEventListener(Event.CHANGE,onChange);
- gift4.addEventListener(Event.CHANGE,onChange);
- checkbox1.addEventListener(Event.CHANGE,box_onChange);
- checkbox2.addEventListener(Event.CHANGE,box_onChange);
- checkbox3.addEventListener(Event.CHANGE,box_onChange);
- checkbox4.addEventListener(Event.CHANGE,box_onChange);
- Mymc.configTxt.addEventListener(Event.CHANGE,onconfigTxt);
- gift_init();//礼物数初始化
- people_txt.mouseEnabled=false;//人数禁止鼠标交互
- Mymc.configTxt.text=String(maxNum);
- animation=new DrawAnimation(kuang);//移动框动画
- time=new Timer(200);
- time.addEventListener(TimerEvent.TIMER,onTimer);
- stage.addEventListener(KeyboardEvent.KEY_DOWN,onkeyDown);
- }
- //礼物显示初始化
- private function gift_init():void
- {
- gift_num1.Gifts = int(maxNum/4);
- gift_num2.Gifts = int(maxNum/4);
- gift_num3.Gifts = int(maxNum/4);
- gift_num4.Gifts = int(maxNum/4);
- gift1.text=String(gift_num1.Gifts);
- gift2.text=String(gift_num2.Gifts);
- gift3.text=String(gift_num3.Gifts);
- gift4.text=String(gift_num4.Gifts);
- people_txt.text = getPeoples(); // 获取总的人数
- }
- //修改配置
- private function onconfigTxt(e:Event):void
- {
- maxNum = int( Mymc.configTxt.text);
- gift_init();
- }
- //获取人数
- private function getPeoples():String
- {
- return String(maxNum -(gift_num1.Gifts + gift_num2.Gifts + gift_num3.Gifts + gift_num4.Gifts) + 1);
- }
- //是否被激活
- private function Isactive(checkbox:CheckBox,n:int,value:int):void
- {
- if (checkbox.selected)
- {
- array[n]=value;
- }
- else
- {
- array[n]=0;
- }
- temp=getNewArray(array);
- }
- //改变选择框
- private function box_onChange(event:Event):void
- {
- switch (event.currentTarget)
- {
- case checkbox1 :
- Isactive(checkbox1,0,11);
- break;
- case checkbox2 :
- Isactive(checkbox2,1,22);
- break;
- case checkbox3 :
- Isactive(checkbox3,2,33);
- break;
- case checkbox4 :
- Isactive(checkbox4,3,44);
- break;
- }
- }
- //修改礼物数值,并显示
- private function ChangeGifts(mygift:Gift,txt:TextField,n:int,vaule:int,checkbox:CheckBox):void
- {
- mygift.Gifts=int(txt.text);
- stage.focus=txt;
- txt.text=mygift.toString();
- if (mygift.Gifts>0)
- {
- array[n]=vaule;
- temp=getNewArray(array);
- if (!checkbox.selected)
- {
- checkbox.selected=true;
- checkbox.mouseEnabled=true;
- }
- }
- else if (mygift.Gifts==0)
- {
- array[n]=0;
- temp=getNewArray(array);
- checkbox.selected=false;
- checkbox.mouseEnabled=false;
- trace("你来了这里了");
- }
- else
- {
- }
- people_txt.text = getPeoples();
- }
- private function onChange(event:Event):void
- {
- switch (event.currentTarget)
- {
- case gift1 :
- ChangeGifts(gift_num1,gift1,0,11,checkbox1);
- break;
- case gift2 :
- ChangeGifts(gift_num2,gift2,1,22,checkbox2);
- break;
- case gift3 :
- ChangeGifts(gift_num3,gift3,2,33,checkbox3);
- break;
- case gift4 :
- ChangeGifts(gift_num4,gift4,3,44,checkbox4);
- break;
- }
- }
- //获取每次抽奖后选取的结果处理
- private function ResultHandler(mygift:Gift,giftNum:TextField,n:int,checkbox:CheckBox):void
- {
- if (mygift.Gifts>0)
- {
- mygift.Gifts-=1;
- giftNum.text=mygift.toString();//礼物的数目
- if (mygift.Gifts==0)
- {
- array[n]=0;
- temp=getNewArray(array);
- giftNum.text=mygift.toString();
- checkbox.selected=false;
- checkbox.mouseEnabled=false;
- }
- }
- }
- //抽取随机号码
- private function randomArray(n:int):void
- {
- switch (temp[n])
- {
- case 11 :
- ResultHandler(gift_num1,gift1,0,checkbox1);
- break;
- case 22 :
- ResultHandler(gift_num2,gift2,1,checkbox2);
- break;
- case 33 :
- ResultHandler(gift_num3,gift3,2,checkbox3);
- break;
- case 44 :
- ResultHandler(gift_num4,gift4,3,checkbox4);
- break;
- default :
- trace("结束");
- break;
- }
- }
- //抽奖的操作:
- private function onkeyDown(event:KeyboardEvent):void
- {
- switch (event.keyCode)
- {
- case Keyboard.SPACE :
- StopTime();
- break;
- case Keyboard.ENTER :
- if (time.running)
- {
- return;
- }
- startTime();
- break;
- case 65 :
- if (key)
- {
- key=false;
- show();
- }
- else
- {
- key=true;
- unshow();
- }
- break;
- case 82 :
- restgame();//系统复位
- break;
- default :
- trace("错误按键");
- break;
- }
- }
- private function startTime():void
- {
- time.start();
- start = true;
- stage.focus=textinput;
- }
- private function StopTime():void
- {
- start = false;
- speed = 5;
- }
- private function stopgame():void
- {
- time.stop();
- time.delay=200;
- randomArray(currentID);
- people_txt.text = getPeoples();//获取人数
- }
- //加快时间和当抽奖完的时候 出现一种缓冲效应
- private function SlowTime():void
- {
- if (start && time.delay >60)
- {
- time.delay -=speed;
- speed++;
- }
- if (!start)
- {
- time.delay +=speed;
- speed++;
- }
- if (time.delay > 200)
- {
- stopgame();
- }
- }
- private function onTimer(event:TimerEvent):void
- {
- var n:int=Math.floor((temp.length)*Math.random());//长度变更
- showgift(n);//显示选择区,判断是否存在数据否则就不进行选择
- currentID = n;
- channel=sound.play(0,1);
- SlowTime();
- }
- //获取新数组
- private function getNewArray(myarray:Array):Array
- {
- var Temp:Array=new Array();
- for (var i:int=0; i<myarray.length; i++)
- {
- if (myarray[i]!=0)
- {
- Temp.push(myarray[i]);
- }
- }
- return Temp;
- }
- //抽奖进行复位
- private function restgame():void
- {
- trace("进行复位");
- IsEnd=false;
- gift_init();//初始化
- }
- //游戏结束了
- private function GameEnd():Boolean
- {
- return IsEnd;
- }
- private function showgift(n:int):void
- {
- var temps:Array=getNewArray(temp);
- switch (temps[n])
- {
- case 11 :
- animation.changeXY(xArray[0],yArray[0]);//移动坐标
- break;
- case 22 :
- animation.changeXY(xArray[1],yArray[1]);//移动坐标
- break;
- case 33 :
- animation.changeXY(xArray[2],yArray[2]);//移动坐标
- break;
- case 44 :
- animation.changeXY(xArray[3],yArray[3]);//移动坐标
- break;
- }
- }
- //显示移动配置框
- private function show():void
- {
- Tweener.addTween(Mymc,{x:800,time:1, transition:"easeOut"});
- }
- //不显示移动配置框
- private function unshow():void
- {
- stage.focus=textinput;
- people_txt.text = getPeoples();
- Tweener.addTween(Mymc,{x:1400,time:1, transition:"easeOut"});
- }
- }
- }