我想问下各位老师
我的本科毕设是网络五子棋,我不想做C/S的,我准备用Ajax来写,但是我想不懂对弈的双方怎么通信,他们的数据是要放在一个他们都能访问的媒介里,可是我最终也没找到,APPLICATION对象好像能实现,可是这样很不妥。肯定有些方法能解决,这跟两个人网页私聊是一个道理怎么能放在一个只有他们两人能访问的媒介呢?不吝啬的老师,可以具体说说思路,这个课题我还没开始,也许您会启发我,谢谢

解决方案 »

  1.   

    哇,本科生,我是初中生.但我这里有个以前别人发的五指棋的代码
    package Test;import java.util.*;    //五子棋游戏1.0版本
    //不足:1.没有处理超出边界输入和异常输入
        //2.没有判断是否和棋(棋盘满,留了一个chesses可用于判断)
        //3.没有实现悔棋等
        public class Test6 {
    //程序入口
            public static void main(String args[]) {
                Test6 a = new Test6();
                a.startGame();
            }//棋盘构造器
            public Test6() {
                cb = new char[17][17];
                currX = 1;
                currY = 1;
                chesses = 0;
                initChessboard();
            }//开始游戏
            public void startGame() {
                System.out.println("=======Five In Row Game=======");
                System.out.println("黑子(先手):@");
                System.out.println("白子(后手):O");
    //轮黑子走为1
                int flag = 1;
                do {
                    showChessboard();
                    if (flag == 1) {
                        System.out.println("!现在轮到 [[黑子]] 走子!");
                    } else {
                        System.out.println("!现在轮到 [[白子]] 走子!");
                    }
                    System.out.print("输入下子的行号:");
                    char x = new Scanner(System.in).nextLine().charAt(0);
                    System.out.print("输入下子的列号:");
                    char y = new Scanner(System.in).nextLine().charAt(0);
                    String ans = moveChess((flag == 1 ? '@' : 'O'), x, y);
                    System.out.println(ans);
    //换手
                    if (ans.equals("====走子成功====")) {
                        flag = -flag;
                    }
                } while (!haveWinner()); //如果有人获胜,跳出循环
    //显示获胜后的棋盘
                showChessboard();
    //显示谁获胜
                if (flag == -1) {
                    System.out.println("黑方胜");
                } else {
                    System.out.println("白方胜");
                }
            }
    //显示棋盘
            public void showChessboard() {
                for (int i = 0; i < cb.length; i++) {
                    for (int j = 0; j < cb[i].length; j++) {
                        System.out.print(cb[i][j] + "  ");
                    }
                    System.out.println();
                }
            }//走子
            private String moveChess(char chess, char charPosX, char charPosY) {
                int tmpX = currX;
                int tmpY = currY;
                setCurrX(charPosX);
                setCurrY(charPosY);
    //判断越界
    //TODO:...
    //判断越界
                if (cb[currX][currY] != '*') {
                    currX = tmpX;
                    currY = tmpY;
                    return "====该位置已有子====";
                }
                cb[currX][currY] = chess;
                return "====走子成功====";
            }//判断是否有赢家
            private boolean haveWinner() {
                int x;
                int y;
                int sum;
    //判断左,右
                sum = 0;
                y = currY;
                while (y > 1 && cb[currX][--y] == cb[currX][currY]) {
                    ++sum;
                }
                y = currY;
                while (y < cb[0].length - 1 && cb[currX][++y] == cb[currX][currY]) {
                    ++sum;
                }
                if (sum >= 4) {
                    return true;
                }//判断上下
                x = currX;
                sum = 0;
                while (x > 1 && cb[--x][currY] == cb[currX][currY]) {
                    ++sum;
                }
                x = currX;
                while (x < cb.length - 1 && cb[++x][currY] == cb[currX][currY]) {
                    ++sum;
                }
                if (sum >= 4) {
                    return true;
                }//判断右下,左上
                x = currX;
                y = currY;
                sum = 0;
                while (x > 1 && y > 1 && cb[--x][--y] == cb[currX][currY]) {
                    ++sum;
                }
                x = currX;
                y = currY;
                while (x < cb.length - 1 && y < cb[0].length - 1 &&
                       cb[++x][++y] == cb[currX][currY]) {
                    ++sum;
                }
                if (sum >= 4) {
                    return true;
                }//判断右上,左下
                x = currX;
                y = currY;
                sum = 0;
                while (x > 1 && y < cb[0].length - 1 &&
                       cb[--x][++y] == cb[currX][currY]) {
                    ++sum;
                }
                x = currX;
                y = currY;
                while (x < cb.length - 1 && y > 1 &&
                       cb[++x][--y] == cb[currX][currY]) {
                    ++sum;
                }
                if (sum >= 4) {
                    return true;
                }
    //没人赢
                return false;
            }//初始化棋盘
            private void initChessboard() {
                cb[0][0] = ' ';
                char alpha = 'a';
                for (int i = 1; i < cb.length; i++) {
                    cb[0][i] = alpha;
                    cb[i][0] = alpha;
                    alpha++;
                }
                for (int i = 1; i < cb.length; i++) {
                    for (int j = 1; j < cb[1].length; j++) {
                        cb[i][j] = '*';
                    }
                }
            }
    //返回当前下子的行字符
            private char getCurrX() {
                return (char) (currX - 1 + 'a');
            }//返回当前下子的行字符
            private char getCurrY() {
                return (char) (currY - 1 + 'a');
            }//设置下子的行号
            private void setCurrX(char charPos) {
                currX = charPos - 'a' + 1;
            }//设置下子的列号
            private void setCurrY(char charPos) {
                currY = charPos - 'a' + 1;
            }
    //棋盘
            private char[][] cb;
    //当前步的坐标
            private int currX;
            private int currY;
    //下了多少步棋
            private int chesses;
        }
      

  2.   

    谢谢楼上  C/S的我会写  我现在想写个Ajax的 呵呵,就是WEB的,你给我的貌似是GUI
      

  3.   

    就像 CSDN的在线聊天 怎么实现的呢  各位不吝赐教下
      

  4.   

    我下自己的理解,你可以这么写
    GameServer.java//游戏服务器处理程序public class GameServer{
    //游戏逻辑,在这里
    //需要或其页面传过来的IP,游戏状态
    }gameServlet.java //servlet页,接受游戏jsp 的数据
    String rival = request.getParamter(rival);//获取对手IP
    GameServer gs = new GameServer();//在servlet中调用GameServer的逻辑
    game.jsp//游戏页面
    <script>
    function onChange(){
    //这里是当下棋页面的数据发生改变时,调用的方法
    //提交
    document.form1.submit();
    }
    </scrpt><script>
    //在这个脚本里,写下你的页面的限制,游戏的许多规则,比如下棋什么情况下开始(选择对手后,得到返回的对手Ip);
    //比如没人必须一步一步下,这些可以在页面上处理的规则,都放到脚本里
    </scrpt><select name = "rival"></select>//填充在线人员IP,选择下棋的对手,选择后提交,到servlet
    <form name ="form1">
    <!--在这里提交游戏相关的数据-->
    </form>大概就这些了,有个思路就可以了,最好不要问别人详细的代码,那就不是你在做了,而是别在做,没有意义;另外你用的ajax,局部提交和我这样是有区别的,
    但应该更简单,你问我为什么不用AJAX,我也在学,就不献丑了
      

  5.   

    5楼的同学您还是没解决本质问题,因为访问者是在不同线程里的,所以service类是不能作为媒介的,我今天早晨想了一会,跟7楼差不多,只是觉得放在数据库里会不会效率很低,当然我毕设是肯定不在乎效率的,呵呵,谢谢7楼,我没想到定时扫描,您的回答很棒!goog job