码迷,mamicode.com
首页 > 编程语言 > 详细

Java的事件自定义事件学习

时间:2015-12-12 13:52:23      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:

课程设计要做一个游戏,由于对C++不是很熟悉,老师也准许使用java 或者其他的语言,在.net我学过事件,一种委托回调,但是在java 我不是很了解,应该原理都相同吧!

 

 

游戏大致是这样的,现在这在写成功判断!于是我自己加了一个事件\

package com.zhaojun.base;

import org.w3c.dom.events.Event;

import java.util.*;

/**
 * 游戏类
 *
 * @author Coder-Jun
 */
public class Game {

    /* 地图枚举 */
    public enum MAP_USER {
        Red, Black, Null,
    }

    /* 记录错误日志 */
    private StringBuilder errorStringBuilder;

    /* 记录日志 */
    private StringBuilder arrivedBuilderLog;

    /* 游戏地图 */
    private MAP_USER[][] map;

    public int getCount() {
        return this._count;
    }

    public int getAllCount() {
        return this._all_count;
    }

    private int _xcount;
    private int _ycount;

    /* 记录胜利人 */
    private MAP_USER winUser = MAP_USER.Null;

    private Dictionary<MAP_USER, String> _userMsg;
    private int _count;// 走了多少
    private int _all_count;// 一共可以走多少

    private Collection winlistener;

    /**
     * 添加成功事件
     *
     * @param listener
     */
    public void addWinListener(WinEvent listener) {
        if (winlistener == null) {
            winlistener = new HashSet();
        }
        this.winlistener.add(listener);
    }


    private void notifyDoEvent() {
        Iterator iter = winlistener.iterator();
        while (iter.hasNext()) {
            WinEvent listener = (WinEvent) iter.next();
            listener.DoEvent();
        }
    }


    /**
     * 成功接口
     */
    public interface WinEvent extends EventListener {
        public void DoEvent();
    }

    /**
     * 初始化地图大小
     *
     * @param xCount
     * @param yCount
     */
    private Game(int xCount, int yCount) {
        /* 初始化地图 */

        errorStringBuilder = new StringBuilder();
        arrivedBuilderLog = new StringBuilder();
        arrivedBuilderLog.append("1.初始化地图成功!\n");
        _userMsg = new Hashtable<MAP_USER, String>();
        this.initMap(xCount, yCount);
        this.initUser();

    }

    public static void Start(int x, int y) {

        //初始化地图
        Game game = new Game(x, y);
        Scanner scanner = new Scanner(System.in);
        game.addWinListener(new WinEvent() {
            @Override
            public void DoEvent() {
                System.out.println("我成功拉!");
            }
        });
        //存用户
        byte userint = 1;
        /*下棋*/
        for (int i = 0; i < game.getAllCount(); ++i) {

            //下棋 Start
            MAP_USER user;
            int var11;
            int var12;
            while (true) {

                    /*用户 判断Start*/
                user = MAP_USER.Null;
                switch (userint) {
                    case 1:
                        user = MAP_USER.Red;
                        System.out.println("红方先走X,Y:");
                        break;
                    case 2:
                        user = MAP_USER.Black;
                        System.out.println("黑方先走X,Y:");
                }
                    /*End*/

                String string = scanner.next();

                    /*解析路径*/
                try {
                    String[] e = string.split(",");
                    if (e.length >= 2) {
                        var11 = Integer.parseInt(e[0]);
                        var12 = Integer.parseInt(e[1]);
                    } else {
                        System.err.println("您下棋有误,重新修正!");
                        continue;
                    }
                } catch (Exception var10) {
                    System.err.println("您下棋有误,重新修正!");
                    continue;
                }
                //下棋失败
                if (!game.inputGo(var11, var12, user)) {
                    System.err.println(game.getError());
                    continue;
                } else {
                    game.showMap();
                    if (userint == 1) {
                        userint = 2;
                        break;
                    }

                    if (userint == 2) {
                        userint = 1;
                        break;
                    }
                }
            }
            //下棋 Start
        }
    }


    /**
     * @return
     */
    private MAP_USER checkWin() {
        return MAP_USER.Black;
    }

    /**
     * 加载地图
     *
     * @param xCount
     * @param yCount
     */
    private void initMap(int xCount, int yCount) {
        // 记录能下的总步
        this.map = new MAP_USER[xCount][yCount];
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[i].length; j++) {
                map[i][j] = MAP_USER.Null;
            }
        }
        this._xcount = xCount;
        this._ycount = yCount;
        this._all_count = xCount * yCount;
    }

    /**
     * 初始化用户
     */
    private void initUser() {
        System.out.println("请输入黑方名字:");
        Scanner canScanner = new Scanner(System.in);
        String heiNameString = canScanner.next();
        System.out.println("请输入红方名字:");
        String hongNameString = canScanner.next();
        _userMsg.put(MAP_USER.Black, heiNameString);
        _userMsg.put(MAP_USER.Red, hongNameString);

    }

    /**
     * 地图
     */
    private void showMap() {
        for (int i = 0; i < map.length; i++) {
            /* 输出头 */
            if (i == 0) {
                System.out.print("Map\t");
                for (int j = 0; j < map[i].length; j++) {
                    System.out.print("  [" + j + "]\t");
                }
                System.out.println("");
            }
            System.out.print("[" + i + "]\t");
            /* 地图输出 */
            for (int j = 0; j < map[i].length; j++) {
                System.out.print("{" + map[i][j] + "}\t");
            }
            System.out.println("");
        }
    }

    /**
     * 下棋
     *
     * @param x
     * @param y
     * @param user
     * @return
     */
    private boolean inputGo(int x, int y, MAP_USER user) {
        boolean tag = false;
        /*越界检查*/
        if (x > this.map[0].length - 1) {
            errorStringBuilder.append("下棋越界X犯规!");
            return false;
        }
        if (y > this.map.length - 1) {
            errorStringBuilder.append("下棋越界Y犯规!");
            return false;
        }
        if (map[y][x] == MAP_USER.Null) {
            map[y][x] = user;
            tag = true;
        } else {
            /* 添加错误信息 */
            errorStringBuilder.append("X:" + x + "Y:" + y + "已经有人在这个地方下了!!");
            return false;
        }

		/* 用户下了棋 是否成功! */
        if (this.checkWin() == MAP_USER.Null) {

        } else {

        }
        this._count++;
        return tag;
    }

    /**
     * 获取错误信息
     *
     * @return 错误信息
     */
    private String getError() {
        String resString = errorStringBuilder.toString();
        this.errorStringBuilder.delete(0, errorStringBuilder.length() - 1);
        return resString;

    }
}

 

 

1.首先要使用事件,自己就必须写一个接口 继承EventListener  然后里面写一个需要实现的接口方法

/**
* 成功接口
*/
public interface WinEvent extends EventListener {
public void DoEvent();
}
private Collection winlistener;

/**
* 添加成功事件
*
* @param listener
*/
public void addWinListener(WinEvent listener) {
if (winlistener == null) {
winlistener = new HashSet();
}
this.winlistener.add(listener);
}

private void notifyDoEvent() {
Iterator iter = winlistener.iterator();
while (iter.hasNext()) {
WinEvent listener = (WinEvent) iter.next();
listener.DoEvent();
}
}

 

2.实现基本的添加事件和通知就可以了;;;接下来就是使用了

 

技术分享 哈哈,成功了!技术分享

 学习来源: http://www.cnblogs.com/atyou/archive/2013/01/07/2850321.html

Java的事件自定义事件学习

标签:

原文地址:http://www.cnblogs.com/xiaojunzi/p/5041073.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!