MSN机器人(cardBean)

去年12月份,看到了举办MSN大赛。。。闲来无聊,也写了一个。由于是一次写完的。后来也没改过。。代码比较长,没有进行脚本化(游戏里常用)

简介
      机器人名字:扑克豆子,能进行很简单的对话,和游戏(21点),还能帮你查找歌曲(baidu)
       主要由2个模块构成
      net.gamewo.game.card ----- 游戏逻辑
      net.gamewo.robot ----- 对话处理逻辑
下面就列出主要实现类
package  net.gamewo.robot;

import  java.awt.Color;
import  java.util.ArrayList;
import  java.util.Date;
import  java.util.HashMap;
import  java.util.List;

import  net.gamewo.game.card.Card;
import  net.gamewo.game.card.CardManager;
import  net.gamewo.game.card.CardParam;

import  com.incesoft.botplatform.sdk.RobotException;
import  com.incesoft.botplatform.sdk.RobotHandler;
import  com.incesoft.botplatform.sdk.RobotMessage;
import  com.incesoft.botplatform.sdk.RobotServer;
import  com.incesoft.botplatform.sdk.RobotSession;

/**
 * 
 * 
@author andy
 *
 
*/

public   class  CardHandler  implements  RobotHandler {

    
//记录用户
    private class User{
        String ID;
//用户账号
        
        
int userWinCount = 0;//赢的次数
        
        
int robotWinCount = 0;//机器人赢的次数
        
        
int nudgeCount = 0;//震动发送次数
        
        
//int status = 1<<7 | 0;//准备开始游戏|正在游戏|准备结束游戏|游戏结束|正在查询信息
        
        
boolean isPreStart = false;//准备开始游戏
        
        
boolean onQuery = false;//正在查询信息(独立存在状态)
        
        
boolean onGame = false;//正在游戏
        
        
boolean isPreOver = false;//准备结束游戏
        
        
boolean isOver = false;//游戏结束
        
        
///暂停状态保存/
        boolean temp_isPreStart = false;//准备开始游戏
        
        
boolean temp_onGame = false;//正在游戏
        
        
boolean temp_isPreOver = false;//准备结束游戏
        
        
boolean temp_isOver = false;//游戏结束
        
        
void setTemp(){//保存临时状态
            temp_isPreStart = isPreStart;
            temp_onGame 
= onGame;
            temp_isPreOver 
= isPreOver;
            temp_isOver 
= isOver;
        }

        
        
void getTemp(){//恢复暂停状态
            isPreStart = temp_isPreStart;
            onGame 
= temp_onGame;
            isPreOver 
= temp_isPreOver;
            isOver 
= temp_isOver;
        }

        
//
        List<Card> cards = null;//存放玩家的扑克
        
        List
<Card> robotCards = null;//存放与玩家游戏的机器人的牌
        
        
//是否正准备开始
        boolean isPreStart(){
            
return isPreStart&!onGame&!isPreOver&!isOver;
        }

        
        
void setPreStart(){
            isPreStart 
= true;
            onGame 
= false;
            isPreOver 
= false;
            isOver 
= false;
        }

        
//开始阶段
        boolean isInit(){
            
return !isPreStart&!onGame&!isOver&!isPreOver&!onQuery;
        }

        
//游戏阶段
        boolean isOnGame(){
            
return (!isPreStart)&onGame&(!isOver);
        }

        
        
void setOnGame(){
            isPreStart 
= false;
            onGame 
= true;
            isPreOver 
= false;
            isOver 
= false;
        }

        
//准备结束
        boolean isPreOver(){
            
return (!isPreStart)&onGame&isPreOver&(!isOver);
        }

        
        
void setPreOver(){
            isPreStart 
= false;
            onGame 
= true;
            isPreOver 
= true;
            isOver 
= false;
        }

        
        
//结束阶段
        boolean isOver(){
            
return (!isPreStart)&(!onGame)&(!isPreOver)&isOver;
        }

        
        
void setOver(){
            isPreStart 
= false;
            onGame 
= false;
            isPreOver 
= false;
            isOver 
= true;
        }

        
        
//正在查询信息
        boolean isOnQuery(){
            
return !isPreStart&!onGame&!isOver&!isPreOver&onQuery;
        }

        
        
void setQuery(){//查询时暂停当前状态
            isPreStart = false;
            onGame 
= false;
            isPreOver 
= false;
            isOver 
= false;
            onQuery 
= true;
        }

        
        
        User(String id)
{
            
this.ID = id;
            cards 
= new ArrayList<Card>();
            robotCards 
= new ArrayList<Card>();
        }

        
    }
//内部类定义结束
    
    
private HashMap<String,String> type = null;
    
    
private RobotMessage msg = null;
    
    
private RobotServer server = null;
    
    
private volatile List<User> userList = null;
    
    
private CardManager manager = null;
    
    
private String mp3 = "http://mp3.baidu.com/m?ct=134217728&rn=&f=ms&tn=baidump3&lf=&lm=-1&word=";
    
    
public CardHandler(RobotServer s) {
        server 
= s;
        userList 
= new ArrayList<User>();
        type 
= new HashMap<String,String>();
        type.put(CardParam.TYPES[
0],"黑桃");
        type.put(CardParam.TYPES[
1],"红桃");
        type.put(CardParam.TYPES[
2],"梅花");
        type.put(CardParam.TYPES[
3],"方片");
    }

    
    
//处理会话开始状态
    private void onOpen(RobotSession session){
        msg 
= session.createMessage();
        msg.setFontColor(Color.BLUE);
        
/*
         * 分时间段相映
         * 8-22:hi~~~~;)
         * 22-3:这么晚还不睡啊。。。。(瞌睡表情)
         * 3-8:传说中有一个强人难道是你.......(大笑表情)
         
*/

         
try {
                
if (RobotSession.OPEN_MODE_CONV_OPEN == session.getOpenMode()){
                    Date d 
= new Date();
                    
int time = d.getHours();
                    
if((time>8)&&(time<22)){
                        msg.setString(
"hi~~~~~~"+Faces.ZHAYAN);
                    }

                    
if((time>22)||(time<3)){
                        msg.setString(
"这么晚还不睡啊...."+Faces.KESHUI);
                    }

                    
if((time>3)&&(time<8)){
                        msg.setString(
"传说中有一个强人难道是你......."+Faces.DAXIAO);
                    }

                        
                    session.send(msg);
                }

                    
            }
 catch (RobotException e) {
                e.printStackTrace();
            }

    }

    

    
public void sessionOpened(RobotSession session) {
        System.out.println(
"EVENT: sessionOpened (" + session.getUser().getClientID() + "," + session.getUser().getStatus() + ")");
       
this.onOpen(session);
    }



    
public void sessionClosed(RobotSession session) {
        System.out.println(
"EVENT: sessionClosed");
        String id 
= session.getUser().getID();
        
this.clear(id);
        
    }

    
    
//析构函数
    private void clear(String id){
        User user 
= null;
        
for(int i=0;i<userList.size();i++){
            user 
= userList.get(i);
            
if(user.ID.equals(id)){
                userList.remove(user);
            }

        }

    }


    
public void messageReceived(RobotSession session, RobotMessage message) {
        User user 
= null;
         msg 
= session.createMessage();
         msg.setFontColor(Color.BLUE);
         String command 
= message.getString();
        System.out.println(
"EVENT: messageReceived");
        
boolean exist = false;
         
for(int i=0;i<userList.size();i++){
                user 
= userList.get(i);
                
if(user.ID.equals(session.getUser().getID())){
                    exist 
= true;
                    
break;
                }

            }

         
         
if(!exist){
              userList.add(
new User(session.getUser().getID()));
         }

        
        
try {
            
if(!exist){//第一次对话
                msg.setString("呵呵。。。。找我玩游戏呀。。。我现在只学会了21点"+Faces.HAIXIU+"....玩不?");
                session.send(msg);
            }
else if(command.indexOf("")!=-1||command.indexOf("")!=-1
                    
||command.indexOf("")!=-1||command.indexOf("")!=-1){//查找歌曲。。
                msg.setString("找啥呢?我只帮你找歌哦。。。。。你要找歌的话给我说(mp3 歌名),不影响游戏的。。");
                user.setTemp();
                user.setQuery();
                session.send(msg);
                
            }
else
            
if(user.isInit()){//开始阶段
                if (command.startsWith(""|| command.startsWith("")||
                    command.indexOf(
"")!=-1 || command.indexOf("y")!=-1||
                    command.indexOf(
"o")!=-1 || command.startsWith("")||
                    command.startsWith(
"")||command.startsWith("") ) {
                    
                    user.setPreStart();
//同意游戏后准备开始游戏
                    
                    msg.setString(Faces.DAXIAO
+"嘿嘿.....规则知道吧?知道的话就开始了哦,对了。。如果你想听歌的话给我说(找歌听),我帮你找找(边听边玩很爽吧)"+Faces.ZHAYAN);
                    session.send(msg);
                }
else if(command.startsWith(""|| command.startsWith("n")||
                         command.indexOf(
"")!=-1 || command.indexOf("")!=-1){
                    msg.setString(
"真地???那我闪了。。。别人还有饭局呢。。");
                    session.send(msg);
                    
this.clear(session.getUser().getID());//清除ID
                }
else {
                    msg.setString(
"......什么嘛。。。玩不玩嘛"+Faces.KESHUI);
                    session.send(msg);
                }

            }
else
            
///准备开始游戏
            if(user.isPreStart()){//准备开始游戏
                if(command.indexOf("")!=-1 ||command.indexOf("y")!=-1 ||
                   (command.indexOf(
"知道")!=-1&&!(command.indexOf("")!=-1))|| command.startsWith("明白")||
                   command.indexOf(
"")!=-1){
                    
                    Date d 
= new Date();
                    
int time = d.getHours();
                    
/*
                     * 分时间段相映
                     * 8-18:今天又有人要败在我的手下了。。。。(大笑表情)
                     * 18-24:今晚又要有一场大战了。。。。。。。
                     * 0-8:半夜我是最清醒的,你死定了...捏哈哈哈哈.......(大笑表情)
                     
*/

                    
if(time>8 && time<18)
                        msg.setString(
"那就开始了。。。。HOHO。。。"+" "+"今天又有人要败在我的手下了。。。。"+Faces.ZHAYAN);
                    
if(time>18 && time<24)
                        msg.setString(
"那就开始了。。。。HOHO。。。"+" "+"今晚又要有一场大战了。。。。。。。"+Faces.TUSHETOU);
                    
if(time>0 && time<8)
                        msg.setString(
"那就开始了。。。。HOHO。。。"+" "+"半夜我是最清醒的,你死定了...捏哈哈哈哈......."+Faces.DAXIAO);
                    
                    session.send(msg);
                    
                    Thread.sleep(
1000);//停顿1秒
                    
                    msg.setString(
"洗牌中。。。。。。等等先");//重置标签
                    session.send(msg);
                    
                    
/*
                     * 这里调入扑克模块
                     
*/

                    manager 
= CardManager.getInstance();
                    
                    
for(int i=0;i<4;i++)
                        
if(i%2==0)user.cards.add(manager.getNextCard());
                        
else user.robotCards.add(manager.getNextCard());
                    
                    Thread.sleep(
2000);//停顿2秒
                    
                    
//发牌
                    
//if(user.cards.get(0).getType()){}
                    StringBuilder sb = new StringBuilder();
                    sb.append(
"你的牌: ").
                        append(type.get(user.cards.get(
0).getType())).
                        append(user.cards.get(
0).getFace()).append(" ").
                        append(type.get(user.cards.get(
1).getType())).
                        append(user.cards.get(
1).getFace()).append(" 还要的话你就说,还要不了?");
                    msg.setString(sb.toString());
                    
                    user.setOnGame();
//进行游戏
                    
                    session.send(msg);
                }

                
else if(command.indexOf("?")!=-1 || command.indexOf("")!=-1 ||
                   command.indexOf(
"什么")!=-1 || command.indexOf("")!=-1){
                    msg.setString(
"规则很简单:我来发牌,每人先发2张,然后你就看你牌的点数和(例如:红桃4就是4点,黑桃J就是11点,没有花色的区分) " +
                                  
"如果你的点数离21点很远(比如11点),你就可以继续向我要牌,直到你觉得合适。然后比较咱俩的点数谁更接近21点," +
                                  
"如果相同的话就是平局拉。。。嘿嘿。。。如果你输的了的话。。。。HOHO。。。。会有大礼包哦。。。"+Faces.DAXIAO);
                    session.send(msg);
                }

                
else{
                    msg.setString(
"。。。你在搞虾米东东??到底知道不知道...??"+Faces.KESHUI);
                    session.send(msg);
                }

            }
else
            
///进行游戏
            if(user.isOnGame()){
                
                
if(!user.isPreOver()){
                    
if(command.indexOf("")!=-1 ||command.startsWith(""||
                       command.startsWith(
""|| command.indexOf("y")!=-1){//需要加牌
                        
                        user.cards.add(manager.getNextCard());
                        StringBuilder sb 
= new StringBuilder();
                        
/*
                         * 出牌逻辑,是否需要加牌
                         
*/

                        
//
                        int sum = 0;
                        
int size = user.robotCards.size();
                        
for(int i=0;i<size;i++){
                            sum 
+= user.robotCards.get(i).getValue();
                        }

                        
                        
int check = 21 - sum;
                        
if(check < 0){}
                        
if(check > 8){
                            user.robotCards.add(manager.getNextCard());
                            sb.append(
"我也要了一张 ");
                        }
else if(check > 5){
                            
if(user.userWinCount < 2){
                                user.robotCards.add(manager.getNextCard());
                                sb.append(
"我也要了一张");
                            }

                        }

                        
                        
                        
//
                        int csize = user.cards.size();
                        sb.append(
" 你的牌: ");
                        
                        
for(int i=0;i<csize;i++){
                            sb.append(type.get(user.cards.get(i).getType())).
                                append(user.cards.get(i).getFace()).append(
" ");
                        }

                        
                        sb.append(
" 还要不?");
                        msg.setString(sb.toString());
                        session.send(msg);
                    }

                    
else if(command.indexOf("")!=-1 ||command.indexOf("")!=-1 ||
                       command.indexOf(
"n")!=-1){//不需要加牌
                        msg.setString("呵呵。。。够了??够了你就说嘛。。你不说我怎么知道你够了。。 " +
                                    
"不可能你说不够我不给你发,你说够了我硬要给你发。。。大家讲道理嘛。。 " +
                                    
"你真的要开??不是真的要开吧??难道你真的要开?? "+Faces.DAXIAO+"那准备开牌吧。。看看你能收到那个大礼不。。"+Faces.DAXIAO+",开不开?");
                        user.setPreOver();
//准备结束
                        session.send(msg);
                    }

                }
else
                
准备结束
                if(user.isPreOver()){
                    
if(command.indexOf("")!=-1 ||command.indexOf("y")!=-1 ||
                       command.indexOf(
"")!=-1||command.indexOf("")!=-1){//开牌
                        
                        
int userSum = 0;
                        
int robotSum = 0;
                        StringBuilder sb 
= new StringBuilder();
                        
//显示玩家所有牌
                        int csize = user.cards.size();
                        sb.append(
" 你的牌: ");
                        
                        
for(int i=0;i<csize;i++){
                            sb.append(type.get(user.cards.get(i).getType())).
                                append(user.cards.get(i).getFace()).append(
" ");
                            userSum 
+= user.cards.get(i).getValue();
                        }

                        sb.append(
" 总点数:"+userSum);
                        
                        csize 
= user.robotCards.size();
                        sb.append(
" 我的牌: ");
                        
for(int i=0;i<csize;i++){
                            sb.append(type.get(user.robotCards.get(i).getType())).
                                append(user.robotCards.get(i).getFace()).append(
" ");
                            robotSum 
+= user.robotCards.get(i).getValue();
                        }

                        sb.append(
" 总点数:"+robotSum);
                        msg.setString(sb.toString());
                        
                        session.send(msg);
//显示结束信息并停顿2秒
                        
                        Thread.sleep(
2000);
                        
                        
int check = Math.abs(21-userSum) - Math.abs(21-robotSum);
                        
if(check == 0){//平局
                            msg.setString("竟然跟我平手。。。。"+Faces.FENGCI);
                        }

                        
else 
                            
if(check > 0){
                                msg.setString(
"不好意思。。。我又赢了。。。。(为什么要加个'又'呢)"+Faces.ZHAYAN);
                                user.robotWinCount
++;
                            }

                        
else 
                            
if(check < 0){
                                
if(user.userWinCount > 2){
                                    msg.setString(
"你太强了。。。。"+Faces.BEISHANG);
                                    user.userWinCount
++;
                                }

                                
if(user.userWinCount == 0){
                                    msg.setString(
"才赢了一把。。再来。。。"+Faces.ZHAYAN);
                                    user.userWinCount
++;
                                }

                            }

                        session.send(msg.setString(msg.getString()
+"还玩不玩??"));
                        user.setOver();
//结束当前游戏局
                    }

                    
else if(command.indexOf("")!=-1 ||command.indexOf("")!=-1 ||
                            command.indexOf(
"")!=-1){
                        msg.setString(
"哦。。。。");
                        session.send(msg);
                    }
else{
                        msg.setString(
"郁闷。。。开不开啊。。。。。??");
                        session.send(msg);
                    }

                }

            }
else
            
///游戏结束
            if(user.isOver()){
                
if(command.startsWith(""||command.indexOf("y")!=-1 ||
                    command.indexOf(
"")!=-1 || command.startsWith("")){//是否重新游戏
                    this.reset(user);
                    msg.setString(
"那就开始了哦。。。。");
                    session.send(msg);
                }

                
if(command.indexOf("")!=-1 ||command.indexOf("n")!=-1 ||
                         command.indexOf(
"")!=-1){//是否重新游戏
                        
                         msg.setString(
"那我找别人玩去拉。。。888");
                         session.send(msg);
                         
//清楚该用户信息
                         this.clear(user.ID);
                     }

            }
else if(user.isOnQuery()){//查询时保存现有状态,查询完毕恢复
                if(command.indexOf("mp3")!=-1){//是否查询歌曲
                         
                         msg.setString(
"正在帮你找。。。等下。。。");
                         session.send(msg);
                         String word 
= command.substring(command.indexOf("3")+1,command.length());
                         Thread.sleep(
2000);//等待2秒查询
                         msg.setString("找到好多。。。给你发个页面。。你点接受");
                         session.sendActivity(mp3.concat(word));
                         session.send(msg);
                 }
else{
                     msg.setString(
"窝 特 啊 有 读 应???"+Faces.FENGCI+"......不给你找了");
                     session.send(msg);
                     
//重设暂停状态
                     user.getTemp();//恢复状态
                 }

            }
else{
                msg.setString(command
+"?? 啥东西。。不懂。。"+Faces.BEISHANG);
                
this.clear(session.getUser().getID());
                session.send(msg);
            }

        }
 catch (RobotException e) {
            e.printStackTrace();
        }
 catch (InterruptedException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    
    
//重置游戏
    private void reset(User user){
        user.cards.clear();
//清除刚才所有牌
        user.isOver = false;
        user.isPreOver 
= false;
        user.isPreStart 
= true;
        user.onGame 
= false;
        user.onQuery 
= false;
        user.robotCards.clear();
    }


    
    
private String onNudge(User user){
        String back 
= null;
        
        
int c = user.nudgeCount;
        
switch(c){
            
case 0:
                back 
= user.onGame?"........快点游戏拉":"........";
                
break;
            
case 1:
                back 
= user.onGame?"玩不过我也不要震我嘛。。。"+Faces.DAXIAO:Faces.FENGCI+"还来??";
                
break;
            
case 2:
                back 
= user.onGame?"你再震我可就不玩了哦。。。"+Faces.KESHUI:"我要开始反击了。。。。";
                
break;
            
case 3:
                back 
= user.onGame?"不理你。。。"+Faces.BEISHANG:Faces.KESHUI+"啥都不说了。。。先扔俩震过去。。。";
                
break;
        }

        
return back;
    }


    
public void nudgeReceived(RobotSession session) {
        System.out.println(
"EVENT: nudgeReceived");
        User user 
= null;
        
try {
            
for(int i=0;i<userList.size();i++){
                user 
= userList.get(i);
                
if(user.ID.equals(session.getUser().getID())){
                    user.nudgeCount
++;
                    session.send(onNudge(user));
                    
if(user.nudgeCount ==3)
                        session.sendNudge();
                    
else
                        
return;
                }

            }

            userList.add(
new User(session.getUser().getID()));
        }
 catch (RobotException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }



    
public void activityAccepted(RobotSession session) {
        System.out.println(
"EVENT: activityAccepted");
    }



    
public void activityRejected(RobotSession session) {
        System.out.println(
"EVENT: activityRejected");
        
try {
            session.send(
"不听算了。。。");
        }
 catch (RobotException e) {
            
// TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    
public void exceptionCaught(RobotSession session, Throwable cause) {
        System.out.println(
"SERVER ERROR: " + cause.getMessage());
    }

    
    
public void userAdd(String robot,String user) {
        System.out.println(
"EVENT: userAdd (" + user + ")");
    }


    
public void userRemove(String robot, String user) {
        System.out.println(
"EVENT: userRemove (" + user + ")");
    }



}

实际上这个类完成了所有的交互工作,他的工作方式类似EJB。实际上也是如此,由于代码比较多,我就不一一列出来了,这里奉上SRC

大家可以加andy_yukun@hotmail.com来体验

有什么问题联系我:andyyukun@hotmail.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值