五子棋对战+源码

一 介绍

hello,学习源码的最好方式就是带着兴趣去学,我淘到了五子棋源码,特意分享给你们,希望你们也能喜欢。

看这个介绍就知道了能有助于我们学习springboot框架,以及理解HTTP协议和websocket协议,到时候看着源代码不懂的完全可以去网上找,以便于理解那些协议,想当初我学的时候都是理论,都没实践过,特难受

 

 二 页面展示

 

 

三 部分源代码展示

WebSocketConfig

package com.qf.game.application;

import com.alibaba.fastjson.JSONObject;
import com.qf.game.application.entity.*;
import com.qf.game.application.service.IHappyBeanHistoryService;
import com.qf.game.application.service.IUserService;
import com.qf.game.application.utils.RoomManagerUtils;
import com.qf.game.application.utils.SessionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 创建一个WebSocket的对外开放的端点服务
 */
@Component
@ServerEndpoint("/gobank")
public class WebSocketConfig {

    //房间编号
    private static AtomicInteger number = new AtomicInteger(0);

    private static IHappyBeanHistoryService happyBeanHistoryService;

    private static IUserService userService;

    @Autowired
    public void setHappyBeanHistoryService(IHappyBeanHistoryService happyBeanHistoryService){
        WebSocketConfig.happyBeanHistoryService = happyBeanHistoryService;
    }

    @Autowired
    public void setUserService(IUserService userService) {
        WebSocketConfig.userService = userService;
    }

    /**
     * 当有一个客户端连接了服务器 就会触发该方法
     */
    @OnOpen
    public void onOpen(Session session){
        System.out.println("有一个客户端连接了服务器!");
    }

    /**
     * 当有一个客户端连接断开后,会触发该方法
     * @param session
     */
    @OnClose
    public void onClose(Session session){
        System.out.println("有一个客户端断开了连接!");
        //删除当前连接管理的房间
        RoomManagerUtils.removeRoom(session);
    }

    /**
     * 当有一个客户端发生异常时,会触发该方法
     */
    @OnError
    public void onError(Session session, Throwable t){
        System.out.println("有一个客户端发生了异常!");
        t.printStackTrace();
    }

    /**
     * 接收到一个客户端的消息
     */
    @OnMessage
    public void onMessage(String msg, Session session){
        System.out.println("接收到客户端的消息:" + msg);

        //解析json
        JSONObject jsonObject = JSONObject.parseObject(msg);
        //获取当前的消息类型
        int msgType = jsonObject.getIntValue("msgType");
        /*
           客户端 -> 服务器:
           200 - 创建房间
           201 - 加入房间
           202 - 落子信息
           203 - 聊天消息
           204 - 语音消息

           服务器 -> 客户端:
           300 - 房间未找到
           301 - 房间已经满人
           302 - 房间密码错误

           400 - 有人加入房间,游戏已经开始
           401 - 加入房间成功,游戏已经开始
           402 - 对手的落子信息
           403 - 自己落子成功
           404 - 对方的聊天消息
           405 - 发送给对方的音频消息
         */
        if (msgType == 200) {
            //创建房间
            createRoom(jsonObject, session);
        } else if(msgType == 201) {
            //有人加入房间
            addRoom(jsonObject, session);
        } else if(msgType == 202){
            //有人落子 落子信息
            drawGo(jsonObject, session);
        } else if(msgType == 203){
            //聊天消息
            infoHandler(jsonObject, session);
        } else if(msgType == 204){
            //语音消息
            audioHandler(jsonObject, session);
        }
    }

    /**
     * 语音消息处理
     * @param jsonObject
     * @param session
     */
    public void audioHandler(JSONObject jsonObject, Session session){
        //获得音频聊天文件
        String audio = jsonObject.getString("audio");

        //获取对手的session
        Room room = RoomManagerUtils.getRoom(session);
        Player otherPlayer = room.getOtherPlayer(session);
        //判断对手是否存在
        if (otherPlayer != null) {
            //将聊天信息 发送给对方
            Map result = new HashMap();
            result.put("msgType", 405);
            result.put("audio", audio);//对方发送的聊天内容
            SessionUtils.sendMsg(otherPlayer.getSession(), result);
        }
    }

    /**
     * 聊天消息处理
     */
    public void infoHandler(JSONObject jsonObject, Session session){
        //获得聊天的内容
        String info = jsonObject.getString("info");

        //获取对手的session
        Room room = RoomManagerUtils.getRoom(session);
        Player otherPlayer = room.getOtherPlayer(session);
        //判断对手是否存在
        if (otherPlayer != null) {
            //将聊天信息 发送给对方
            Map result = new HashMap();
            result.put("msgType", 404);
            result.put("info", info);//对方发送的聊天内容
            SessionUtils.sendMsg(otherPlayer.getSession(), result);
        }
    }

    /**
     * 处理落子的消息
     */
    public void drawGo(JSONObject jsonObject, Session session){
        //获得落子的坐标系
        int x = jsonObject.getIntValue("x");
        int y = jsonObject.getIntValue("y");
        int goColor = jsonObject.getIntValue("goColor"); //0 - 黑子 1 - 白子

        //获取正在对局的房间
        Room room = RoomManagerUtils.getRoom(session);

        //获得当前房间的棋盘
        Gobang gobang = room.getGobang();
        //尝试给棋盘落子
        boolean isOk = gobang.go(x, y, goColor);
        if (isOk) {
            //当前落子成功

            //判断胜利
            boolean isWin = gobang.isWin(x,y,goColor);

            //如果已经胜利
            if(isWin){
                //当前的落子的用户 欢乐豆+1000
                Player player = room.getPlayer(session);
                //用户添加1000欢乐豆
                userService.addHappyBean(player.getUser().getId(), 1000);
                //生成一条欢乐豆的历史记录
                HappyBeanHistory happyBeanHistory = new HappyBeanHistory();
                happyBeanHistory.setuId(player.getUser().getId());//玩家用户id
                happyBeanHistory.setType(0);//新增
                happyBeanHistory.setBeanNumber(1000);
                happyBeanHistory.setCreateTime(new Date());
                happyBeanHistory.setSource(1);//对局游戏胜利
                happyBeanHistoryService.insertHistory(happyBeanHistory);

                //对手欢乐豆 -1000
                Player otherPlayer = room.getOtherPlayer(session);
                //用户扣减1000欢乐豆
                userService.addHappyBean(otherPlayer.getUser().getId(), -1000);
                //生成一条欢乐豆的历史记录
                HappyBeanHistory happyBeanHistory2 = new HappyBeanHistory();
                happyBeanHistory2.setuId(otherPlayer.getUser().getId());//玩家用户id
                happyBeanHistory2.setType(1);//扣减
                happyBeanHistory2.setBeanNumber(1000);
                happyBeanHistory2.setCreateTime(new Date());
                happyBeanHistory2.setSource(1);//对局游戏胜利
                happyBeanHistoryService.insertHistory(happyBeanHistory2);
            }

            //通过当前的session获得对手信息
            Player otherPlayer = room.getOtherPlayer(session);
            //获得对手的session信息
            Session otherSession = otherPlayer.getSession();
            //将落子信息告知对手
            Map result = new HashMap();
            result.put("msgType", 402);
            result.put("x", x);
            result.put("y", y);
            result.put("goColor", goColor);
            result.put("isWin", isWin);
            SessionUtils.sendMsg(otherSession, result);

            //将落子的信息再回传给自己
            Map result2 = new HashMap();
            result2.put("msgType", 403);
            result2.put("x", x);
            result2.put("y", y);
            result2.put("goColor", goColor);
            result2.put("isWin", isWin);
            SessionUtils.sendMsg(session, result2);
        }
    }

    /**
     * 创建房间
     */
    public void createRoom(JSONObject jsonObject, Session session){
        //创建房间的消息
        String info = jsonObject.getString("info");
        String pass = jsonObject.getString("pass");
        //用户信息 - 谁创建的房间
        int uid = jsonObject.getIntValue("uid");
        String nickname = jsonObject.getString("nickname");
        String header = jsonObject.getString("header");

        //封装到User对象
        User user = new User();
        user.setId(uid);
        user.setNickname(nickname);
        user.setHeader(header);

        //将User封装成一个Player对象
        Player player = new Player();
        player.setUser(user);//玩家的用户信息
        player.setSession(session);//玩家的session连接

        //创建一个房间对象
        Room room = new Room();
        room.setRid(number.incrementAndGet());//线程安全
        room.setPlayer1(player);
        room.setStatus(0);//待开始
        room.setInfo(info);//房间信息
        room.setPass(pass);//房间密码

        //房间放入一个管理器中
        RoomManagerUtils.putRoom(room.getRid(), room);
        RoomManagerUtils.putRoom(session, room);
    }

    /**
     * 加入房间
     */
    public void addRoom(JSONObject jsonObject, Session session){

        //获得加入的房间id
        int rid = jsonObject.getIntValue("rid");
        //获取玩家2 输入的房间密码
        String pass = jsonObject.getString("pass");

        //用户信息 - 谁加入的房间
        int uid = jsonObject.getIntValue("uid");
        String nickname = jsonObject.getString("nickname");
        String header = jsonObject.getString("header");

        //封装到User对象
        User user = new User();
        user.setId(uid);
        user.setNickname(nickname);
        user.setHeader(header);

        //保证添加房间的线程安全
        synchronized ((rid + "").intern()) {
            //获取房间
            Room room = RoomManagerUtils.getRoom(rid);
            //判断房间状态
            if (room == null) {
                //返回给前端 - 房间信息不存在
                Map result = new HashMap<>();
                result.put("msgType", 300);//房间未找到
                SessionUtils.sendMsg(session, result);
                return;
            }

            if (room.getStatus() == 1) {
                //返回给前端 - 有人抢先一步加入房间
                Map result = new HashMap<>();
                result.put("msgType", 301);//房间人数已满
                SessionUtils.sendMsg(session, result);
                return;
            }

            if (!StringUtils.isEmpty(room.getPass()) && !room.getPass().equals(pass)) {
                //房间密码错误
                Map result = new HashMap<>();
                result.put("msgType", 302);//密码错误
                SessionUtils.sendMsg(session, result);
                return;
            }

            //加入房间
            Player player = new Player();
            player.setUser(user);
            player.setSession(session);
            room.setPlayer2(player);//将玩家2设置到房间中
            room.setStatus(1);//修改房价状态 为游戏进行中

            //将玩家2的Session 与 Room关联保存起来
            RoomManagerUtils.putRoom(session, room);

            //交换两个玩家的信息
            //给玩家1发送玩家2的信息
            Map result1 = new HashMap();
            result1.put("msgType", 400);//有人加入房间
            result1.put("uid", room.getPlayer2().getUser().getId());
            result1.put("nickname", room.getPlayer2().getUser().getNickname());
            result1.put("header", room.getPlayer2().getUser().getHeader());
            SessionUtils.sendMsg(room.getPlayer1().getSession(), result1);

            //给玩家2发送玩家1的信息
            Map result2 = new HashMap();
            result2.put("msgType", 401);//加入房间成功
            result2.put("uid", room.getPlayer1().getUser().getId());
            result2.put("nickname", room.getPlayer1().getUser().getNickname());
            result2.put("header", room.getPlayer1().getUser().getHeader());
            SessionUtils.sendMsg(room.getPlayer2().getSession(), result2);
        }
    }
}

四 源码

最后附上源码地址,有需要的同学可以下载哦,最重要的是免费哦

JavaEE+五子棋对战项目.zip-Java文档类资源-CSDN文库icon-default.png?t=M7J4https://download.csdn.net/download/qq_45181103/86437551

刚学习vc++,下载了些源码,这是我下载到的最好的一个版本啦~~~~~~~~~ 不好意思,发的是原文件,有点小问题: 首先声明这是VC.net 的解决方案(所以楼上有朋友说没有看见VC++6.0的的WorkSpace(.dsw……) 原文件是老版本的,打开的时候可能会提醒你转换~~ +作者设置了只读属性,建议先把只读属性去除…… 据说是 vc2005 的语法检查更加的严格了,所以会有一些 warning ~~~~~可以忽略的…… 另外还是会有一个错误……如下: 如果直接打开的话我这里的vc.net2005 提示: “ --- 已启动生成: 项目: Pente, 配置: Debug Win32 ------ 正在编译... StdAfx.cpp WINVER not defined. Defaulting to 0x0502 (Windows Server 2003) 正在编译... SetupDlg.cpp RecordDlg.cpp PenteDlg.cpp c:\documents and settings\kjl801\桌面\vc.net 五子棋源码\pentedlg.cpp(45) : warning C4101: 'szVer' : unreferenced local variable Pente.cpp c:\documents and settings\kjl801\桌面\vc.net 五子棋源码\pente.cpp(53) : error C3861: 'Enable3dControls': identifier not found HelperAPI.cpp c:\documents and settings\kjl801\桌面\vc.net 五子棋源码\helperapi.cpp(14) : warning C4996: 'strcat' was declared deprecated e:\visual studio 2005\vc\include\string.h(78) : see declaration of 'strcat' Message: 'This function or variable may be unsafe. Consider using strcat_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.' Dib.cpp c:\documents and settings\kjl801\桌面\vc.net 五子棋源码\dib.cpp(537) : warning C4244: '=' : conversion from 'ULONGLONG' to 'DWORD', possible loss of data BestDlg.cpp AboutDlg.cpp Generating Code... 生成日志保存在“file://c:\Documents and Settings\kjl801\桌面\vc.net 五子棋源码\Debug\BuildLog.htm” Pente - 1 个错误,3 个警告 ========== 生成: 0 已成功, 1 已失败, 0 最新, 0 已跳过 ========== ” 我的解决方法是把下面这一段注释掉就Ok了: /* #ifdef _AFXDLL Enable3dControls(); // Call this when using MFC in a shared DLL #else Enable3dControlsStatic(); // Call this when linking to MFC statically #endif */ // 这一部分在vc6.0 的MFC新建的工程里面 经常看见……可能是版本不支持的原因导致的…… 修改后可能会提示你 原文件是只读的……点击“ 改写” 就是了 ……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值