js 棋类游戏 轮流走一步棋 的逻辑

gjt19910817 2012-11-12 09:51:35
要做一个比较简单的对战的棋类游戏。逻辑,算法什么的全部写在js文件里面。

现在卡在一个小问题上面了。。

两个棋手(一个是人,一个是电脑AI),一人走一步棋。怎么控制呢?

我用的是 html5 的 canvas 控件。人类走棋是在 canvas 上面点击触发 onclick 事件的函数,叫这个函数human_move() 吧。
AI 走棋就是一个 AI_move() 函数。

我现在用的方法是 在 human_move() 函数内,最后执行 AI_move()。等于是把 人类和AI 的移动全部写进 onclick 事件函数里面去了。

但是后来规则要改成,人类可以选择 先手 或者 后手 走棋,那么显然不能把 AI_move() 放在 onclick 事件里面。
我现在就想把 human_move() 和 AI_move() 写到一个主要控制逻辑里面去。

尝试增加一个 step变量, 进行计数, 单数就是人类走,双数就是AI走。每次走完,steps++。
想改成大概下面这样的形式:
while( 胜负条件... )
{
if( steps % 2 == 0 ) Human_move(); // Human_move()是onclick事件函数,这样显然不对。
else if( steps % 2 == 1 ) AI_move();
}

但是怎么弄都搞不定,老是死循环。。。

请问大家有什么思路和建议???
小弟js也是才上手几天,也不是很熟。跪谢了。


...全文
378 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ceynes 2013-07-21
  • 打赏
  • 举报
回复
boolean ttt = false; ttt = true? false:true;
xyq117480 2013-03-14
  • 打赏
  • 举报
回复
楼主能否分享下这个棋类游戏的源代码? 我在做一个六博。。找不到思路啊
wbb123yu 2012-11-13
  • 打赏
  • 举报
回复
我就写了一句话这么多错别字 我倒 “。。。我不是写了绑定和解绑click事件么 解绑了不就阻塞了么 ”
wbb123yu 2012-11-13
  • 打赏
  • 举报
回复
引用 14 楼 gjt19910817 的回复:
引用 13 楼 wbb123yu 的回复:- -忘记套框了 重发下 XML/HTML code12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849var ctx;//2d画布元素var xxxx;//控制谁先走 1为人 2为AIvar xxx=0……
。。。我不是谢了绑定和解绑click事件么 解绑了不久阻塞了么
gjt19910817 2012-11-13
  • 打赏
  • 举报
回复
引用 12 楼 KK3K2005 的回复:
mvc 理论大家都知道 实际应用中 是很灵活的 不管是 电脑 还是 人脑 control 都是一样的 或者说 都是同一个类的实现 剩余下 ai 和 人脑 不一样的就是 怎么触发 control的方法(这个是一个 策略,也就是 你判定 当前 那个control 可以被触发,或者2个 同时 被触发) ai的话 那么view层只管显示动作 ……
啊...OO觉得太麻烦了,所以自己写的还是面向过程的形式。 请教一个具体问题吧。 类似于这样的一个逻辑中: while( 胜负条件... ) { if( steps % 2 == 0 ) Human_move(); else if( steps % 2 == 1 ) AI_move(); } 可以把 Human_move() 设置成阻塞的吗??? 就是在 Human_move() 中如果没有出现 onclick事件,就卡在那里等待 onclick事件,而不继续执行 ? 因为如果不是阻塞的,就一直在那while(), 变成死循环了。
gjt19910817 2012-11-13
  • 打赏
  • 举报
回复
引用 10 楼 zzgzzg00 的回复:
人走得时候触发onclick事件,此时触发一个函数,这个函数将对应的点或其他的什么变色后顺便让ai走,ai就不触发什么onclick事件了,直接将判断后的点变色 也就是让人的click事件触发ai行动试试
我最初时候是这么写的。但是觉得很不好。因为人开局前要选择 先手 或者 后手 ,让onclick触发 执行 ai_move() 显然不好,虽然可以实现,但是那样逻辑就很乱了。。
gjt19910817 2012-11-13
  • 打赏
  • 举报
回复
引用 13 楼 wbb123yu 的回复:
- -忘记套框了 重发下 XML/HTML code12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849var ctx;//2d画布元素var xxxx;//控制谁先走 1为人 2为AIvar xxx=0;//控制输赢 1为输 2为赢 3为平 0……
嗯。看了你的方法之后很受启发。非常感谢! 还有一个疑问,就是怎么将 human_move() 设置成阻塞的,就是只有当 onclick 事件触发了之后才执行一下步 ? 因为 humain_move() 就是 onclick事件函数 而已。
wbb123yu 2012-11-12
  • 打赏
  • 举报
回复
不懂瞎扯淡:定个变量 初值为1 判断唯一人能走 走完改为2 AI才能走 AI走完再改1 想AI先走直接把初值改为2就好了
张正 2012-11-12
  • 打赏
  • 举报
回复
也··不懂 帮顶吧
KK3K2005 2012-11-12
  • 打赏
  • 举报
回复
2个 control 当前只有一个control 再起作用 这个思路 合具体 语言没关系
fwacky 2012-11-12
  • 打赏
  • 举报
回复
这个不懂帮顶!
Yssss1980 2012-11-12
  • 打赏
  • 举报
回复
不要使用while循环。可以这样写 function Human_move(); { ....onclick(funcion(){ .... turn(); }); } function turn(){ if(step%2==0){ Human_move(); } else{ AI_move(); turn(); } }
wbb123yu 2012-11-12
  • 打赏
  • 举报
回复
- -忘记套框了 重发下
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()//进入主流程 
  }
  
KK3K2005 2012-11-12
  • 打赏
  • 举报
回复
mvc 理论大家都知道 实际应用中 是很灵活的 不管是 电脑 还是 人脑 control 都是一样的 或者说 都是同一个类的实现 剩余下 ai 和 人脑 不一样的就是 怎么触发 control的方法(这个是一个 策略,也就是 你判定 当前 那个control 可以被触发,或者2个 同时 被触发) ai的话 那么view层只管显示动作 人脑的话 那么 view还要绑定 control的触发事件 比如我 拖动棋子 会调用control的什么方法 module层 大家 是一样的 甚至是 共享的(可能就是整个棋盘的详细信息。。) 好吧 (module + control +VIEW[AI | PLAY ])(策略+AI运算) 我只会 面向对象的写法 不知道 能帮助你不
wbb123yu 2012-11-12
  • 打赏
  • 举报
回复
引用 6 楼 gjt19910817 的回复:
引用 1 楼 Yssss1980 的回复:不要使用while循环。可以这样写 function Human_move(); { ....onclick(funcion(){ .... turn(); }); } function turn(){ if(step%2==0){ Hu……
额 看了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()//进入主流程 } 随便写写 不懂
似梦飞花 2012-11-12
  • 打赏
  • 举报
回复
人走得时候触发onclick事件,此时触发一个函数,这个函数将对应的点或其他的什么变色后顺便让ai走,ai就不触发什么onclick事件了,直接将判断后的点变色 也就是让人的click事件触发ai行动试试
wbb123yu 2012-11-12
  • 打赏
  • 举报
回复
引用 8 楼 gjt19910817 的回复:
引用 3 楼 KK3K2005 的回复:2个 control 当前只有一个control 再起作用 这个思路 合具体 语言没关系 您能否讲得具体一些呢???我的最大的疑问就是: 人走棋 是onclick事件触发的。AI走棋是 AI_move() 函数,不知道怎么控制 人走完之后,AI才能走,AI走完之后,才允许 onclick事件发生 ……
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改值 }} 大概就是这个意思 我也不懂
gjt19910817 2012-11-12
  • 打赏
  • 举报
回复
引用 3 楼 KK3K2005 的回复:
2个 control 当前只有一个control 再起作用 这个思路 合具体 语言没关系
您能否讲得具体一些呢???我的最大的疑问就是: 人走棋 是onclick事件触发的。AI走棋是 AI_move() 函数,不知道怎么控制 人走完之后,AI才能走,AI走完之后,才允许 onclick事件发生
gjt19910817 2012-11-12
  • 打赏
  • 举报
回复
引用 5 楼 wbb123yu 的回复:
不懂瞎扯淡:定个变量 初值为1 判断唯一人能走 走完改为2 AI才能走 AI走完再改1 想AI先走直接把初值改为2就好了
嗯。这个和我那个while循环的思路差不多。就是不知道怎么控制唯一人能走。因为人走棋 是onclick事件触发的。AI走棋是 AI_move() 函数,不知道怎么控制 人走完之后,AI才能走,AI走完之后,才允许 onclick事件发生。
gjt19910817 2012-11-12
  • 打赏
  • 举报
回复
引用 1 楼 Yssss1980 的回复:
不要使用while循环。可以这样写 function Human_move(); { ....onclick(funcion(){ .... turn(); }); } function turn(){ if(step%2==0){ Human_move(); } ……
onclick事件函数在 human_move()函数里面??不是很理解啊。。。 还有那个turn()那样写的话不就是递归了???这样写逻辑好像不是很好吧。

87,901

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧