【AS3代码】翻牌游戏源码
文档类:
package
{
import com.ui.Card;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.Timer;
import flash.utils.getTimer;
public class Main extends Sprite
{
private static const boardWidth:uint = 6; //卡片列数
private static const boardHeight:uint = 5; //行数
private static const cardHorizontalSpacing:Number = 62; //卡片水平间隔
private static const cardVerticalSpacing:Number = 62; //垂直间隔
private static const boardOffsetX:Number = 10; //卡片左上角横坐标
private static const boardOffsetY:Number = 85; //卡片左上角纵坐标
private static const pointsForMatch:int = 100; //游戏分数,匹配+100
private static const pointsForMiss:int = -5; //游戏分数,不匹配-5
//两个临时Card变量
private var firstCard:Card;
private var secondCard:Card;
private var cardsLeft:uint; //用于卡片计数,为0则结束游戏
private var gameScore:int; //分数
private var gameStartTime:uint; //初始化时间
private var gameTime:uint; //获取游戏时间
//声明两文本
private var gameScoreField:TextField;
private var gameTimeField:TextField;
//卡片自动翻转时间变量
private var flipBackTimer:Timer;
//声音变量
private var theFirstCardSound:FirstCardSound = new FirstCardSound();
private var theMissSound:MissSound = new MissSound();
private var theMatchSound:MatchSound = new MatchSound();
//卡片数组
var cardlist:Array;
public function Main():void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.stageWidth = 550;
stage.stageHeight = 400;
init();
}
private function init():void
{
var ym:YingMu = new YingMu();
this.addChild(ym);
//舞台上生成15对卡片列表的索引值,并存入到数组cardlist中
cardlist = new Array();
for(var i:uint=0; i<(boardWidth*boardHeight) / 2; i++)
{
cardlist.push(i);
cardlist.push(i);
}
//把30张卡片添加到舞台
cardsLeft = 0;
for(var x:uint=0; x<boardWidth; x++)
{
for(var y:uint=0; y<boardHeight; y++)
{
var c:Card = new Card(); //卡片副本
c.x = x * cardHorizontalSpacing + boardOffsetX; //卡片在屏幕上的左上角坐标
c.y = y * cardVerticalSpacing +boardOffsetY;
//得到一个随机卡片索引值
var r:uint = Math.floor(Math.random() * cardlist.length);
c.cardface = cardlist[r]; //把卡片索引值赋给card
cardlist.splice(r,1); //从数组中移除卡片
c.buttonMode = true;
this.addChild(c); //卡片添加到屏幕
cardsLeft++ //生成卡片数自动+1
//点击卡片侦听函数
c.addEventListener(MouseEvent.CLICK, clickCard);
}
}
//设置文本格式
var format:TextFormat = new TextFormat();
format.size = 16;
format.font = "宋体";
format.bold = true;
//设置游戏分数文本并复制
gameScoreField = new TextField();
this.addChild(gameScoreField);
gameScoreField.defaultTextFormat = format;
gameScoreField.selectable = false;
gameScoreField.width = 200;
gameScoreField.height = 50;
gameScoreField.x = 400;
gameScoreField.y = 110;
gameScore = 0;
//调用计分函数
showGameScore();
//设置时钟文本
gameTimeField = new TextField();
this.addChild(gameTimeField);
gameTimeField.defaultTextFormat = format;
gameTimeField.selectable = false;
gameTimeField.width = 200;
gameTimeField.height = 50;
gameTimeField.x = 400;
gameTimeField.y = 85;
gameTimeField.text = String(getTimer());
gameTime = 0;
//调用计时函数
this.addEventListener(Event.ENTER_FRAME, showTime);
}
//点击卡片函数
public function clickCard(event:MouseEvent):void
{
//当第一张牌和第二张牌都翻开时,其余牌点击无效
if(firstCard != null && secondCard != null)
{
return;
}
//把点击的卡片对象赋值给它的实例
var thisCard:Card = (event.currentTarget as Card);
//翻开第一张牌
if(firstCard == null)
{
firstCard = thisCard;
//翻转到对应的牌面上,thisCard.cardface + 2表示所在的哪一帧
//因为cardlist保存着0-14,Card的第一帧是牌背面,所以0和1帧都无效,所以+2才是第一张牌的正面
thisCard.startFlip(thisCard.cardface + 2);
//播放翻牌声音
playSound(theFirstCardSound);
}
//重复翻开第一张牌
else if(firstCard == thisCard)
{
//第二次点击后,牌翻转回去,参数1表示Card的第一帧
firstCard.startFlip(1);
firstCard = null;
playSound(theMissSound);
}
//翻开第二张牌
else if(secondCard == null)
{
secondCard = thisCard;
thisCard.startFlip(thisCard.cardface + 2);
//播放翻牌声音
playSound(theFirstCardSound);
//开始比较两个卡片
if(firstCard.cardface == secondCard.cardface)
{
showScoreText(secondCard, 0);
//如果匹配,都移除屏幕
this.removeChild(firstCard);
this.removeChild(secondCard);
//两个变量值复位
firstCard = null;
secondCard = null;
//计算分数,匹配+100
gameScore += pointsForMatch;
//调用显示分数文本函数
showGameScore();
playSound(theMatchSound);
//若匹配一次,总数量-2
cardsLeft -= 2;
//通过cardsLeft检测游戏是否结束
if(cardsLeft == 0)
{
trace("恭喜!游戏成功通关!");
trace("--------------------------");
trace("游戏分数:" + gameScore);
trace("游戏时间:" + clockTime(gameTime));
trace("--------------------------");
}
}
//两个卡片不同
else
{
showScoreText(secondCard, 1);
//匹配错误,-5分
gameScore += pointsForMiss;
showGameScore();
//两张不匹配,0.8秒后自动翻转回去
flipBackTimer = new Timer(800,1);
flipBackTimer.addEventListener(TimerEvent.TIMER_COMPLETE, returnCards);
flipBackTimer.start();
}
}
else
{
returnCards(null);
firstCard = thisCard;
firstCard.startFlip(thisCard.cardface + 2);
}
}
//匹配或不匹配时飘出的得分文字.type =0匹配,1不匹配
public function showScoreText(secondCard:Card, type:uint):void
{
var sTxt:MovieClip;
if(type == 0)
{
sTxt = new FanOk();
}
else if(type == 1)
{
sTxt = new FanEroor();
}
sTxt.x = secondCard.x;
sTxt.y = secondCard.y;
this.addChild(sTxt);
}
//卡片自动翻转回去函数
public function returnCards(event:String):void
{
firstCard.startFlip(1); //第1张牌翻回到背面
secondCard.startFlip(1); //第2张牌翻回到背面
firstCard = null;
secondCard = null;
flipBackTimer.removeEventListener(TimerEvent.TIMER_COMPLETE,returnCards);
}
//显示分数文本函数
public function showGameScore():void
{
gameScoreField.text = "游戏得分:" + String(gameScore);
}
//显示游戏时间毫秒数函数
public function showTime(event:Event):void
{
gameTime = getTimer() - gameStartTime;
gameTimeField.text = "已用时间:" + clockTime(gameTime);
}
//时间转换函数
public function clockTime(ms:int):String
{
var seconds:int = Math.floor(ms/1000);
var minutes:int = Math.floor(seconds/60);
seconds -= minutes * 60;
var timeString:String = minutes + ":"+String(seconds+100).substr(1,2);
return timeString;
}
//播放声音函数
public function playSound(soundObject:Sound):void
{
soundObject.play();
}
}
}
import com.ui.Card;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.StageScaleMode;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.events.TimerEvent;
import flash.media.Sound;
import flash.media.SoundChannel;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.Timer;
import flash.utils.getTimer;
public class Main extends Sprite
{
private static const boardWidth:uint = 6; //卡片列数
private static const boardHeight:uint = 5; //行数
private static const cardHorizontalSpacing:Number = 62; //卡片水平间隔
private static const cardVerticalSpacing:Number = 62; //垂直间隔
private static const boardOffsetX:Number = 10; //卡片左上角横坐标
private static const boardOffsetY:Number = 85; //卡片左上角纵坐标
private static const pointsForMatch:int = 100; //游戏分数,匹配+100
private static const pointsForMiss:int = -5; //游戏分数,不匹配-5
//两个临时Card变量
private var firstCard:Card;
private var secondCard:Card;
private var cardsLeft:uint; //用于卡片计数,为0则结束游戏
private var gameScore:int; //分数
private var gameStartTime:uint; //初始化时间
private var gameTime:uint; //获取游戏时间
//声明两文本
private var gameScoreField:TextField;
private var gameTimeField:TextField;
//卡片自动翻转时间变量
private var flipBackTimer:Timer;
//声音变量
private var theFirstCardSound:FirstCardSound = new FirstCardSound();
private var theMissSound:MissSound = new MissSound();
private var theMatchSound:MatchSound = new MatchSound();
//卡片数组
var cardlist:Array;
public function Main():void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.stageWidth = 550;
stage.stageHeight = 400;
init();
}
private function init():void
{
var ym:YingMu = new YingMu();
this.addChild(ym);
//舞台上生成15对卡片列表的索引值,并存入到数组cardlist中
cardlist = new Array();
for(var i:uint=0; i<(boardWidth*boardHeight) / 2; i++)
{
cardlist.push(i);
cardlist.push(i);
}
//把30张卡片添加到舞台
cardsLeft = 0;
for(var x:uint=0; x<boardWidth; x++)
{
for(var y:uint=0; y<boardHeight; y++)
{
var c:Card = new Card(); //卡片副本
c.x = x * cardHorizontalSpacing + boardOffsetX; //卡片在屏幕上的左上角坐标
c.y = y * cardVerticalSpacing +boardOffsetY;
//得到一个随机卡片索引值
var r:uint = Math.floor(Math.random() * cardlist.length);
c.cardface = cardlist[r]; //把卡片索引值赋给card
cardlist.splice(r,1); //从数组中移除卡片
c.buttonMode = true;
this.addChild(c); //卡片添加到屏幕
cardsLeft++ //生成卡片数自动+1
//点击卡片侦听函数
c.addEventListener(MouseEvent.CLICK, clickCard);
}
}
//设置文本格式
var format:TextFormat = new TextFormat();
format.size = 16;
format.font = "宋体";
format.bold = true;
//设置游戏分数文本并复制
gameScoreField = new TextField();
this.addChild(gameScoreField);
gameScoreField.defaultTextFormat = format;
gameScoreField.selectable = false;
gameScoreField.width = 200;
gameScoreField.height = 50;
gameScoreField.x = 400;
gameScoreField.y = 110;
gameScore = 0;
//调用计分函数
showGameScore();
//设置时钟文本
gameTimeField = new TextField();
this.addChild(gameTimeField);
gameTimeField.defaultTextFormat = format;
gameTimeField.selectable = false;
gameTimeField.width = 200;
gameTimeField.height = 50;
gameTimeField.x = 400;
gameTimeField.y = 85;
gameTimeField.text = String(getTimer());
gameTime = 0;
//调用计时函数
this.addEventListener(Event.ENTER_FRAME, showTime);
}
//点击卡片函数
public function clickCard(event:MouseEvent):void
{
//当第一张牌和第二张牌都翻开时,其余牌点击无效
if(firstCard != null && secondCard != null)
{
return;
}
//把点击的卡片对象赋值给它的实例
var thisCard:Card = (event.currentTarget as Card);
//翻开第一张牌
if(firstCard == null)
{
firstCard = thisCard;
//翻转到对应的牌面上,thisCard.cardface + 2表示所在的哪一帧
//因为cardlist保存着0-14,Card的第一帧是牌背面,所以0和1帧都无效,所以+2才是第一张牌的正面
thisCard.startFlip(thisCard.cardface + 2);
//播放翻牌声音
playSound(theFirstCardSound);
}
//重复翻开第一张牌
else if(firstCard == thisCard)
{
//第二次点击后,牌翻转回去,参数1表示Card的第一帧
firstCard.startFlip(1);
firstCard = null;
playSound(theMissSound);
}
//翻开第二张牌
else if(secondCard == null)
{
secondCard = thisCard;
thisCard.startFlip(thisCard.cardface + 2);
//播放翻牌声音
playSound(theFirstCardSound);
//开始比较两个卡片
if(firstCard.cardface == secondCard.cardface)
{
showScoreText(secondCard, 0);
//如果匹配,都移除屏幕
this.removeChild(firstCard);
this.removeChild(secondCard);
//两个变量值复位
firstCard = null;
secondCard = null;
//计算分数,匹配+100
gameScore += pointsForMatch;
//调用显示分数文本函数
showGameScore();
playSound(theMatchSound);
//若匹配一次,总数量-2
cardsLeft -= 2;
//通过cardsLeft检测游戏是否结束
if(cardsLeft == 0)
{
trace("恭喜!游戏成功通关!");
trace("--------------------------");
trace("游戏分数:" + gameScore);
trace("游戏时间:" + clockTime(gameTime));
trace("--------------------------");
}
}
//两个卡片不同
else
{
showScoreText(secondCard, 1);
//匹配错误,-5分
gameScore += pointsForMiss;
showGameScore();
//两张不匹配,0.8秒后自动翻转回去
flipBackTimer = new Timer(800,1);
flipBackTimer.addEventListener(TimerEvent.TIMER_COMPLETE, returnCards);
flipBackTimer.start();
}
}
else
{
returnCards(null);
firstCard = thisCard;
firstCard.startFlip(thisCard.cardface + 2);
}
}
//匹配或不匹配时飘出的得分文字.type =0匹配,1不匹配
public function showScoreText(secondCard:Card, type:uint):void
{
var sTxt:MovieClip;
if(type == 0)
{
sTxt = new FanOk();
}
else if(type == 1)
{
sTxt = new FanEroor();
}
sTxt.x = secondCard.x;
sTxt.y = secondCard.y;
this.addChild(sTxt);
}
//卡片自动翻转回去函数
public function returnCards(event:String):void
{
firstCard.startFlip(1); //第1张牌翻回到背面
secondCard.startFlip(1); //第2张牌翻回到背面
firstCard = null;
secondCard = null;
flipBackTimer.removeEventListener(TimerEvent.TIMER_COMPLETE,returnCards);
}
//显示分数文本函数
public function showGameScore():void
{
gameScoreField.text = "游戏得分:" + String(gameScore);
}
//显示游戏时间毫秒数函数
public function showTime(event:Event):void
{
gameTime = getTimer() - gameStartTime;
gameTimeField.text = "已用时间:" + clockTime(gameTime);
}
//时间转换函数
public function clockTime(ms:int):String
{
var seconds:int = Math.floor(ms/1000);
var minutes:int = Math.floor(seconds/60);
seconds -= minutes * 60;
var timeString:String = minutes + ":"+String(seconds+100).substr(1,2);
return timeString;
}
//播放声音函数
public function playSound(soundObject:Sound):void
{
soundObject.play();
}
}
}
Card类:
package com.ui
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.text.TextField;
public dynamic class Card extends MovieClip
{
private var flipStep:uint;
private var isFlipping:Boolean = false;
private var flipToFrame:uint;
private var c:Card_FF;
public function Card()
{
c = new Card_FF();
c.stop(); //停在第一帧
this.addChild(c);
}
public function startFlip(flipToWhichFrame:uint):void
{
isFlipping = true;
flipStep = 10;
flipToFrame = flipToWhichFrame;
this.addEventListener(Event.ENTER_FRAME, flip);
}
//需要10帧完成卡片翻转
public function flip(event:Event):void
{
flipStep--; //帧数递减
//前5帧翻转时放大状态
if(flipStep > 5)
{
this.scaleX = 0.2 * (flipStep - 6);
}
else
{
this.scaleX = 0.2 * (5 - flipStep);
}
c.gotoAndStop(flipToFrame);
//反转完后移除侦听
if(flipStep == 0)
{
this.removeEventListener(Event.ENTER_FRAME,flip);
}
}
}
{
import flash.display.MovieClip;
import flash.events.Event;
import flash.text.TextField;
public dynamic class Card extends MovieClip
{
private var flipStep:uint;
private var isFlipping:Boolean = false;
private var flipToFrame:uint;
private var c:Card_FF;
public function Card()
{
c = new Card_FF();
c.stop(); //停在第一帧
this.addChild(c);
}
public function startFlip(flipToWhichFrame:uint):void
{
isFlipping = true;
flipStep = 10;
flipToFrame = flipToWhichFrame;
this.addEventListener(Event.ENTER_FRAME, flip);
}
//需要10帧完成卡片翻转
public function flip(event:Event):void
{
flipStep--; //帧数递减
//前5帧翻转时放大状态
if(flipStep > 5)
{
this.scaleX = 0.2 * (flipStep - 6);
}
else
{
this.scaleX = 0.2 * (5 - flipStep);
}
c.gotoAndStop(flipToFrame);
//反转完后移除侦听
if(flipStep == 0)
{
this.removeEventListener(Event.ENTER_FRAME,flip);
}
}
}
}