本帖最后由 gjt19910817 于 2012-11-12 09:58:12 编辑

解决方案 »

  1.   

    不要使用while循环。可以这样写
    function Human_move();
    {
       ....onclick(funcion(){
           ....
           turn();
       });
    }function turn(){
       if(step%2==0){ 
           Human_move();
       }
       else{
            AI_move();
            turn();
       }
    }
      

  2.   

    2个 control 当前只有一个control 再起作用这个思路 合具体 语言没关系
      

  3.   

    不懂瞎扯淡:定个变量 初值为1 判断唯一人能走 走完改为2 AI才能走 AI走完再改1  想AI先走直接把初值改为2就好了
      

  4.   


    onclick事件函数在 human_move()函数里面??不是很理解啊
    还有那个turn()那样写的话不就是递归了???这样写逻辑好像不是很好吧。
      

  5.   


    嗯。这个和我那个while循环的思路差不多。就是不知道怎么控制唯一人能走。因为人走棋 是onclick事件触发的。AI走棋是 AI_move() 函数,不知道怎么控制 人走完之后,AI才能走,AI走完之后,才允许 onclick事件发生。
      

  6.   


    您能否讲得具体一些呢???我的最大的疑问就是:
    人走棋 是onclick事件触发的。AI走棋是 AI_move() 函数,不知道怎么控制 人走完之后,AI才能走,AI走完之后,才允许 onclick事件发生
      

  7.   

    var xxxx = 1;//控制谁走
    var xxx = 1;//控制输赢
    while(xxx=1){
    if(xxxx=1){
       //onclick可触发等待触发
       onclick()//下棋触发
       xxxx=2//改变量
       //判断输赢然后决定是否给xxx改值
    }
    else if (xxxx=2){
       AI_move()//触发ai走棋
       xxxx=1//在改回来
       //判断输赢然后决定是否给xxx改值
    }}
    大概就是这个意思 我也不懂 
      

  8.   

    人走得时候触发onclick事件,此时触发一个函数,这个函数将对应的点或其他的什么变色后顺便让ai走,ai就不触发什么onclick事件了,直接将判断后的点变色
    也就是让人的click事件触发ai行动试试
      

  9.   


    额 看了2楼的我感觉这样写比较合理 目前我的想法最好就是
    var ctx;//2d画布元素
    var xxxx;//控制谁先走 1为人 2为AI
    var xxx=0;//控制输赢 1为输 2为赢 3为平 0为继续下棋
    xxxx=?//选定谁先走后赋值function human_move() {};
    function ai_move() {};
    function judge() {};//判断输赢给xxx赋值
    function win() {//结果出现后
    if (xxx=1){
    alert("输")
    }
    else if (xxx=2){
    alert("赢")
    }
    else{
    alert("平")
    }};function mian() {//下棋主流程方法
    human_move()//人下棋
    ctx.removeEventListener("click",function () {},false)//人下完解绑CLICK事件
    judge()//判断输赢给xxx赋值
    if(xxx!=0){
    win()
    return false;
    }//不为0 输出并结束 ai_move()
    judge()
    if(xxx!=0){
    win()
    return false;
    }//不为0 输出并结束
    ctx.addEventListener("click",function () {},false)//为0继续 绑定CLICK事件
    main()//下一回合
    };
    /*判断谁先手*/
    if(xxxx=1){
    ctx.addEventListener("click",function () {},false)//人先手绑定CLICK事件
    main()//进入主流程 
    }else if (xxxx=2){
      ai_move()
      ctx.addEventListener("click",function () {},false)//AI先手 下棋后绑定CLICK事件
      main()//进入主流程 
      }
      
    随便写写 不懂
      

  10.   

    mvc 理论大家都知道实际应用中 是很灵活的不管是 电脑 还是 人脑  control  都是一样的  或者说 都是同一个类的实现剩余下 ai 和 人脑  不一样的就是 怎么触发 control的方法(这个是一个 策略,也就是 你判定 当前 那个control 可以被触发,或者2个 同时 被触发)ai的话 那么view层只管显示动作  人脑的话  那么 view还要绑定 control的触发事件 比如我 拖动棋子 会调用control的什么方法module层 大家 是一样的 甚至是 共享的(可能就是整个棋盘的详细信息。。)好吧   (module + control +VIEW[AI | PLAY  ])(策略+AI运算)我只会 面向对象的写法 不知道 能帮助你不
      

  11.   

    - -忘记套框了 重发下
    var ctx;//2d画布元素
    var xxxx;//控制谁先走 1为人 2为AI
    var xxx=0;//控制输赢 1为输 2为赢 3为平 0为继续下棋
    xxxx=?//选定谁先走后赋值function human_move() {};
    function ai_move() {};
    function judge() {};//判断输赢给xxx赋值
    function win() {//结果出现后
    if (xxx=1){
    alert("输")
    }
    else if (xxx=2){
    alert("赢")
    }
    else{
    alert("平")
    }};function mian() {//下棋主流程方法
    human_move()//人下棋
    ctx.removeEventListener("click",function () {},false)//人下完解绑CLICK事件
    judge()//判断输赢给xxx赋值
    if(xxx!=0){
    win()
    return false;
    }//不为0 输出并结束 ai_move()
    judge()
    if(xxx!=0){
    win()
    return false;
    }//不为0 输出并结束
    ctx.addEventListener("click",function () {},false)//为0继续 绑定CLICK事件
    main()//下一回合
    };
    /*判断谁先手*/
    if(xxxx=1){
    ctx.addEventListener("click",function () {},false)//人先手绑定CLICK事件
    main()//进入主流程 
    }else if (xxxx=2){
      ai_move()
      ctx.addEventListener("click",function () {},false)//AI先手 下棋后绑定CLICK事件
      main()//进入主流程 
      }
      
      

  12.   


    嗯。看了你的方法之后很受启发。非常感谢!
    还有一个疑问,就是怎么将 human_move() 设置成阻塞的,就是只有当 onclick 事件触发了之后才执行一下步 ?
    因为 humain_move() 就是 onclick事件函数 而已。
      

  13.   


    我最初时候是这么写的。但是觉得很不好。因为人开局前要选择 先手 或者 后手 ,让onclick触发 执行 ai_move() 显然不好,虽然可以实现,但是那样逻辑就很乱了。。
      

  14.   


    啊...OO觉得太麻烦了,所以自己写的还是面向过程的形式。
    请教一个具体问题吧。
    类似于这样的一个逻辑中:
    while( 胜负条件... )
    {
        if( steps % 2 == 0 ) Human_move(); 
        else if( steps % 2 == 1 ) AI_move();
    }
    可以把 Human_move() 设置成阻塞的吗???
    就是在 Human_move() 中如果没有出现 onclick事件,就卡在那里等待 onclick事件,而不继续执行 ?
    因为如果不是阻塞的,就一直在那while(), 变成死循环了。
      

  15.   

    我不是谢了绑定和解绑click事件么 解绑了不久阻塞了么 
      

  16.   

    我就写了一句话这么多错别字 我倒  “我不是写了绑定和解绑click事件么 解绑了不就阻塞了么 ”
      

  17.   

    boolean ttt = false;
    ttt = true?  false:true;