台灣最大程式設計社群網站
線上人數
1244
 
會員總數:246219
討論主題:189783
歡迎您免費加入會員
討論區列表 >> CSS/HTML5/Bootstarp >> 象棋遊戲設計
[]  
[我要回覆]
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
象棋遊戲設計
價值 : 20 QP  點閱數:1526 回應數:0
樓主

胡文懷
門外漢
0 1
6 0
發送站內信

我在製作一個象棋遊戲但是我卡在 士 俥 炮
這三隻棋我不知道該如何寫走棋的部分
誰可以救救我????
以下是我的程式碼




var RQ:Array;var BQ:Array;
RQ= [p6,p12,p13,p14,p15,p16,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28];
BQ= [p1,p2,p3,p4,p5,p7.p8,p9,p10,p11,p17,p18,p29,p30,p31,p32];



var w:int=50;
var h:int=9;//棋盤橫向格數
var v:int=9;//棋盤縱向格數
var p:MovieClip;
p1.id=1;p2.id=2;p3.id=3;p4.id=4;p5.id=5;
p6.id=6;p7.id=7;p8.id=8;p9.id=9;p10.id=10;
p11.id=11;p12.id=12;p13.id=13;p14.id=14;p15.id=15;
p16.id=16;p17.id=17;p18.id=18;p19.id=19;p20.id=20;
p21.id=21;p22.id=22;p23.id=23;p24.id=24;p25.id=25;
p26.id=26;p27.id=27;p28.id=28;p29.id=29;p30.id=30;
p31.id=31;p32.id=32;

var pgArray:Array=new Array(
new Array('J','M','X','S','K','S','X','M','J'),
new Array('0','0','0','0','0','0','0','0','0'),
new Array('0','P','0','0','0','0','0','P','0'),
new Array('Z','0','Z','0','Z','0','Z','0','Z'),
new Array('0','0','0','0','0','0','0','0','0'),
new Array('0','0','0','0','0','0','0','0','0'),
new Array('z','0','z','0','z','0','z','0','z'),
new Array('0','p','0','0','0','0','0','p','0'),
new Array('0','0','0','0','0','0','0','0','0'),
new Array('j','m','x','s','k','s','x','m','j'));


for(var a:int=1;a<=32;a++){//用迴圈將所有棋子做初始設定
p=this["p"+a];
p.buttonMode=true;
var pt:Point=computing(new Point(p.x,p.y));//取得最接進棋子當下位置的格線座標
p.pos=new Point(pt.x,pt.y);//記錄這個格線座標
p.x=grid.x+pt.x*w ;//將棋子貼齊格線'
p.y=grid.y+pt.y*w;//將棋子貼齊格線'
p.addEventListener(MouseEvent.MOUSE_DOWN,drag);//給棋子添加偵聽滑鼠點擊事件
}
function drag(e:MouseEvent):void{//當棋子被點擊
p=e.currentTarget as MovieClip;
p.alpha=0.5;
setChildIndex(p,numChildren-1);
stage.addEventListener(MouseEvent.MOUSE_MOVE,moving);//給舞台添加偵聽滑鼠移動事件
stage.addEventListener(MouseEvent.MOUSE_UP,drop);//給舞台添加偵聽滑鼠放開事件
}
function drop(e:MouseEvent):void{//當滑鼠點擊後放開
p.pos=computing(new Point(p.x,p.y));//取得最接進棋子當下位置的格線座標
p.alpha=1;
p=null;
stage.removeEventListener(MouseEvent.MOUSE_MOVE,moving);//給舞台移除偵聽滑鼠移動事件
stage.removeEventListener(MouseEvent.MOUSE_UP,drop);//給舞台移除偵聽滑鼠放開事件
}
function moving(e:MouseEvent):void{//當滑鼠點擊後移動
var pt:Point=computing(new Point(mouseX,mouseY));//取得最接進當下滑鼠位置的格線座標
if(!checkRule(pt))return;//檢查這個座標是否符合該棋子的移動規則,若不符合則終止這個函式
if(pt.x>=0 && pt.x<=h && pt.y>=0 && pt.y<=v){
p.x=grid.x+pt.x*w;//將棋子貼齊格線
p.y=grid.y+pt.y*w;//將棋子貼齊格線
}

}
function computing(pt:Point):Point{//計算最接進傳入座標的格線座標
var _x:Number=pt.x-grid.x;
var _y:Number=pt.y-grid.y;
var gx:int=int(_x/w);
var gy:int=int(_y/w);
if(_x%w/w>0.5)gx++;
if(_y%w/w>0.5)gy++;
return new Point(gx,gy);//傳回計算結果
}
function checkRule(pt:Point):Boolean{//檢查傳入的座標是否符合棋子的移動規則
var flag:Boolean=false;
var list:Array=[p.pos];
switch(p.id){
case 1://類型 馬
list.push(new Point(p.pos.x-1,p.pos.y-2));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y-2));//同上
list.push(new Point(p.pos.x+2,p.pos.y-1));//同上
list.push(new Point(p.pos.x+2,p.pos.y+1));//同上
list.push(new Point(p.pos.x-1,p.pos.y+2));//同上
list.push(new Point(p.pos.x+1,p.pos.y+2));//同上
list.push(new Point(p.pos.x-2,p.pos.y-1));//同上
list.push(new Point(p.pos.x-2,p.pos.y+1));//同上
break;
case 2://類型 馬
list.push(new Point(p.pos.x-1,p.pos.y-2));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y-2));//同上
list.push(new Point(p.pos.x+2,p.pos.y-1));//同上
list.push(new Point(p.pos.x+2,p.pos.y+1));//同上
list.push(new Point(p.pos.x-1,p.pos.y+2));//同上
list.push(new Point(p.pos.x+1,p.pos.y+2));//同上
list.push(new Point(p.pos.x-2,p.pos.y-1));//同上
list.push(new Point(p.pos.x-2,p.pos.y+1));//同上
break;

case 3://類型 象
if(p.pos.y-2>4){
list.push(new Point(p.pos.x-2,p.pos.y-2));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+2,p.pos.y-2));//同上
}
list.push(new Point(p.pos.x+2,p.pos.y+2));//同上
list.push(new Point(p.pos.x-2,p.pos.y+2));//同上
break;
case 4://類型 象
if(p.pos.y-2>4){
list.push(new Point(p.pos.x-2,p.pos.y-2));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+2,p.pos.y-2));//同上
}
list.push(new Point(p.pos.x+2,p.pos.y+2));//同上
list.push(new Point(p.pos.x-2,p.pos.y+2));//同上
break;
case 5://類型 將
if(p.pos.y>7)
list.push(new Point(p.pos.x,p.pos.y-1));//計算此類型的棋子可移動的座標,並添加到陣列中
if(p.pos.y<9)
list.push(new Point(p.pos.x,p.pos.y+1));//同上
if(p.pos.x>3)
list.push(new Point(p.pos.x-1,p.pos.y));//同上
if(p.pos.x<5)
list.push(new Point(p.pos.x+1,p.pos.y));//同上
break;
case 6://類型 帥
if(p.pos.y>0)
list.push(new Point(p.pos.x,p.pos.y-1));//計算此類型的棋子可移動的座標,並添加到陣列中
if(p.pos.y<2)
list.push(new Point(p.pos.x,p.pos.y+1));//同上
if(p.pos.x>3)
list.push(new Point(p.pos.x-1,p.pos.y));//同上
if(p.pos.x<5)
list.push(new Point(p.pos.x+1,p.pos.y));//同上
break;
case 7://類型 卒
if(p.pos.y<5){//如果棋子已越過楚河漢界
list.push(new Point(p.pos.x-1,p.pos.y));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y));//同上
list.push(new Point(p.pos.x,p.pos.y-1));//同上
}else{//如果棋子沒越過楚河漢界
list.push(new Point(p.pos.x,p.pos.y-1));//計算此類型的棋子可移動的座標,並添加到陣列中
}
break;
case 8://類型 卒
if(p.pos.y<5){//如果棋子已越過楚河漢界
list.push(new Point(p.pos.x-1,p.pos.y));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y));//同上
list.push(new Point(p.pos.x,p.pos.y-1));//同上
}else{//如果棋子沒越過楚河漢界
list.push(new Point(p.pos.x,p.pos.y-1));//計算此類型的棋子可移動的座標,並添加到陣列中
}
break;
case 9://類型 卒
if(p.pos.y<5){//如果棋子已越過楚河漢界
list.push(new Point(p.pos.x-1,p.pos.y));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y));//同上
list.push(new Point(p.pos.x,p.pos.y-1));//同上
}else{//如果棋子沒越過楚河漢界
list.push(new Point(p.pos.x,p.pos.y-1));//計算此類型的棋子可移動的座標,並添加到陣列中
}
break;
case 10://類型 卒
if(p.pos.y<5){//如果棋子已越過楚河漢界
list.push(new Point(p.pos.x-1,p.pos.y));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y));//同上
list.push(new Point(p.pos.x,p.pos.y-1));//同上
}else{//如果棋子沒越過楚河漢界
list.push(new Point(p.pos.x,p.pos.y-1));//計算此類型的棋子可移動的座標,並添加到陣列中
}
break;
case 11://類型 卒
if(p.pos.y<5){//如果棋子已越過楚河漢界
list.push(new Point(p.pos.x-1,p.pos.y));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y));//同上
list.push(new Point(p.pos.x,p.pos.y-1));//同上
}else{//如果棋子沒越過楚河漢界
list.push(new Point(p.pos.x,p.pos.y-1));//計算此類型的棋子可移動的座標,並添加到陣列中
}
break;
case 12://類型 兵
if(p.pos.y<5){//如果棋子已越過楚河漢界
list.push(new Point(p.pos.x,p.pos.y+1));//計算此類型的棋子可移動的座標,並添加到陣列中
}else{//如果棋子沒越過楚河漢界
list.push(new Point(p.pos.x-1,p.pos.y));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y));//同上
list.push(new Point(p.pos.x,p.pos.y+1));//同上
}
break;
case 13://類型 兵
if(p.pos.y<5){//如果棋子已越過楚河漢界
list.push(new Point(p.pos.x,p.pos.y+1));//計算此類型的棋子可移動的座標,並添加到陣列中
}else{//如果棋子沒越過楚河漢界
list.push(new Point(p.pos.x-1,p.pos.y));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y));//同上
list.push(new Point(p.pos.x,p.pos.y+1));//同上
}
break;
case 14://類型 兵
if(p.pos.y<5){//如果棋子已越過楚河漢界
list.push(new Point(p.pos.x,p.pos.y+1));//計算此類型的棋子可移動的座標,並添加到陣列中
}else{//如果棋子沒越過楚河漢界
list.push(new Point(p.pos.x-1,p.pos.y));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y));//同上
list.push(new Point(p.pos.x,p.pos.y+1));//同上
}
break;
case 15://類型 兵
if(p.pos.y<5){//如果棋子已越過楚河漢界
list.push(new Point(p.pos.x,p.pos.y+1));//計算此類型的棋子可移動的座標,並添加到陣列中
}else{//如果棋子沒越過楚河漢界
list.push(new Point(p.pos.x-1,p.pos.y));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y));//同上
list.push(new Point(p.pos.x,p.pos.y+1));//同上
}
break;
case 16://類型 兵
if(p.pos.y<5){//如果棋子已越過楚河漢界
list.push(new Point(p.pos.x,p.pos.y+1));//計算此類型的棋子可移動的座標,並添加到陣列中
}else{//如果棋子沒越過楚河漢界
list.push(new Point(p.pos.x-1,p.pos.y));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y));//同上
list.push(new Point(p.pos.x,p.pos.y+1));//同上
}
break;
case 17://類型 士
if(p.pos.y>7);

if(p.pos.y<9);

if(p.pos.x>3);

if(p.pos.x<5);

break;
case 18://類型 士
break;
case 19://類型 r士
if(p.pos.x==4){
list.push(new Point(p.pos.x+1,p.pos.y+1));
list.push(new Point(p.pos.x+1,p.pos.y-1));
list.push(new Point(p.pos.x-1,p.pos.y+1));
list.push(new Point(p.pos.x-1,p.pos.y-1));}
else {
if(p.pos.y==0)
list.push(new Point(p.pos.x+1,p.pos.y+1));
else
if((p.pos.y==0)&&(p.pos.x==5))
list.push(new Point(p.pos.x-1,p.pos.y+1));
else
if(p.pos.x==5)
list.push(new Point(p.pos.x-1,p.pos.y-1));
else
if(p.pos.y==2)
list.push(new Point(p.pos.x+1,p.pos.y-1));


}

break;

case 20://類型 r士
if((p.pos.x==4)&&(p.pos==1)){
list.push(new Point(p.pos.x+1,p.pos.y+1));
list.push(new Point(p.pos.x+1,p.pos.y-1));
list.push(new Point(p.pos.x-1,p.pos.y+1));
list.push(new Point(p.pos.x-1,p.pos.y-1));
}



break;

case 21://類型 r馬
list.push(new Point(p.pos.x-1,p.pos.y-2));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y-2));//同上
list.push(new Point(p.pos.x+2,p.pos.y-1));//同上
list.push(new Point(p.pos.x+2,p.pos.y+1));//同上
list.push(new Point(p.pos.x-1,p.pos.y+2));//同上
list.push(new Point(p.pos.x+1,p.pos.y+2));//同上
list.push(new Point(p.pos.x-2,p.pos.y-1));//同上
list.push(new Point(p.pos.x-2,p.pos.y+1));//同上
break;
case 22://類型 r馬
list.push(new Point(p.pos.x-1,p.pos.y-2));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+1,p.pos.y-2));//同上
list.push(new Point(p.pos.x+2,p.pos.y-1));//同上
list.push(new Point(p.pos.x+2,p.pos.y+1));//同上
list.push(new Point(p.pos.x-1,p.pos.y+2));//同上
list.push(new Point(p.pos.x+1,p.pos.y+2));//同上
list.push(new Point(p.pos.x-2,p.pos.y-1));//同上
list.push(new Point(p.pos.x-2,p.pos.y+1));//同上
break;
case 23://類型 r象
if(p.pos.y-2>5){
list.push(new Point(p.pos.x-2,p.pos.y-2));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+2,p.pos.y-2));//同上
}
list.push(new Point(p.pos.x+2,p.pos.y+2));//同上
list.push(new Point(p.pos.x-2,p.pos.y+2));//同上
break;
case 24://類型 r象
if(p.pos.y-2>5){
list.push(new Point(p.pos.x-2,p.pos.y-2));//計算此類型的棋子可移動的座標,並添加到陣列中
list.push(new Point(p.pos.x+2,p.pos.y-2));//同上
}
list.push(new Point(p.pos.x+2,p.pos.y+2));//同上
list.push(new Point(p.pos.x-2,p.pos.y+2));//同上
break;
case 25://類型 r俥
break;
case 26://類型 r俥
break;
case 27://類型 r炮

break;
case 28://類型 r炮
break;
case 29://類型 車
break;
case 30://類型 車
break;
case 31://類型 包
break;
case 32://類型 包
break;
}




var a:int;
for(a=0;a<list.length;a++){//用迴圈檢查傳入的座標是否有在陣列當中
if(pt.x==list[a].x && pt.y==list[a].y){
flag=true;//若是有,則將變數改為true
}
}
return flag;//傳回變數
}


本篇文章發表於2011-09-14 15:23
目前尚無任何回覆
   

回覆
如要回應,請先登入.