?? 游戲類.ef
字號:
?引入 工具,用戶界面;
公開 類 游戲類
{
整數(shù)[] 坐標(biāo)數(shù)組;
邏輯 選中=假;//是否有球被選中
整數(shù) 選中行,選中列;//記錄被選中的行列坐標(biāo)
整數(shù) 編號1,編號2,編號3;//下三個球的編號
邏輯 結(jié)束=假;//游戲是否結(jié)束
邏輯 是否出球=假;
公開 整數(shù)[] 初始化游戲(整數(shù)[] 格子數(shù)組)
{
數(shù)學(xué)運算.置隨機數(shù)種子();
坐標(biāo)數(shù)組=格子數(shù)組;
取隨機編號();
//計次循環(huán)(1)//測試用
坐標(biāo)數(shù)組=隨機出球(坐標(biāo)數(shù)組);
選中=假;結(jié)束=假;
選中行=0;選中列=0;
是否出球=假;
返回(坐標(biāo)數(shù)組);
}
公開 整數(shù)[] 隨機出球(整數(shù)[] 格子數(shù)組)
{
坐標(biāo)數(shù)組=格子數(shù)組;
出球(編號1);
出球(編號2);
出球(編號3);
取隨機編號();
返回(坐標(biāo)數(shù)組);
}
出球(整數(shù) 編號)//不能出球,表示游戲結(jié)束
{
整數(shù) 行,列,i,n;
計次循環(huán)(100,i)
{
如果(坐標(biāo)數(shù)組[i]==0) n++;//統(tǒng)計無球的格子數(shù)
}
如果(n>19)//數(shù)組自帶19個空格子,大于19表示有空格子
{
(行,列)=取隨機位置();
坐標(biāo)數(shù)組[行][列]=編號;
}
如果(n-1==19) 結(jié)束=真;
}
整數(shù),整數(shù) 取隨機位置()
{
整數(shù) 行,列;
開始
{
行=數(shù)學(xué)運算.取隨機數(shù)()%9+1;
列=數(shù)學(xué)運算.取隨機數(shù)()%9+1;
}循環(huán)(坐標(biāo)數(shù)組[行][列]!=0);
返回(行,列);
}
公開 整數(shù),整數(shù),整數(shù) 取編號()
{
返回(編號1,編號2,編號3);
}
取隨機編號()
{
編號1=數(shù)學(xué)運算.取隨機數(shù)()%(6)+1;
編號2=數(shù)學(xué)運算.取隨機數(shù)()%(6)+1;
編號3=數(shù)學(xué)運算.取隨機數(shù)()%(6)+1;
}
公開 邏輯 是否結(jié)束()
{
返回(結(jié)束);
}
公開 整數(shù),整數(shù),整數(shù) 取選中值()
{
返回(選中行,選中列,坐標(biāo)數(shù)組[選中行][選中列]);
}
公開 邏輯 取出球值()
{
返回(是否出球);
}
//游戲運行過程:
//1格子有球:選中處理-->選中=真-->返回(ok)
//2格子無球:1選中==假-->返回(ok)
// 2選中==真-->1能否移動==假-->返回(ok)
// 2選中==真-->2能否移動==真-->移動處理-->1能否消球==假----------------------->隨機出球處理-->1能否消球==假->返回
// 2選中==真-->2能否移動==真-->移動處理-->2能否消球==真-->消分處理------------------------------------------>返回
公開 整數(shù)[],坐標(biāo)點[],坐標(biāo)點[],整數(shù),整數(shù) 運行游戲(整數(shù)[] 格子數(shù)組,整數(shù) 行,整數(shù) 列)
{
坐標(biāo)數(shù)組=格子數(shù)組;
坐標(biāo)點 訪問點=創(chuàng)建 坐標(biāo)點();
訪問點.置橫縱坐標(biāo)(行,列);
坐標(biāo)點[] 路徑表=創(chuàng)建 坐標(biāo)點[0];
坐標(biāo)點[] 消球表=創(chuàng)建 坐標(biāo)點[0];
路徑表=(坐標(biāo)點[])路徑表.插入(0,訪問點);
整數(shù) 移動值,消球值;
是否出球=假;
{//格子有球
如果(坐標(biāo)數(shù)組[行][列]!=0)
{
//選中處理:記錄選中行列,給選中格畫標(biāo)記,選中=真,返回
選中行=行;選中列=列;
選中=真;
}
}
{//格子無球
如果(坐標(biāo)數(shù)組[行][列]==0)
{
如果(選中==真)//==假時直接返回
{
//能否移動???
坐標(biāo)點[] 遍歷父表=創(chuàng)建 坐標(biāo)點[0];//記錄父點行列坐標(biāo)
坐標(biāo)點[] 遍歷子表=創(chuàng)建 坐標(biāo)點[0];//記錄父點行列坐標(biāo)
(遍歷父表,遍歷子表)=取遍歷表();//取得選中球的遍歷表
邏輯 能否移動=是否重復(fù)訪問點(遍歷子表,訪問點);//能移動返回真
如果(能否移動==真)//==假時直接返回
{
//移動處理
移動值=坐標(biāo)數(shù)組[選中行][選中列];
路徑表=取移動路徑(遍歷父表,遍歷子表,訪問點);
坐標(biāo)數(shù)組[訪問點.橫坐標(biāo)()][訪問點.縱坐標(biāo)()]=坐標(biāo)數(shù)組[選中行][選中列];
坐標(biāo)數(shù)組[選中行][選中列]=0;
選中行=0;選中列=0;
選中=假;
//能否消球???
(消球表,消球值)=取消球坐標(biāo)();//取得可以消的球的坐標(biāo)表
如果(消球表.長度()>=5)//>=5時表示有可消球
{
//消球處理
整數(shù) x;
計次循環(huán)(消球表.長度(),x)
{
坐標(biāo)數(shù)組[消球表[x].橫坐標(biāo)()][消球表[x].縱坐標(biāo)()]=0;
}
是否出球=假;
}
否則 是否出球=真;//隨機出球條件滿足:不能消球時,隨機出球
}
}
}
}
返回(坐標(biāo)數(shù)組,路徑表,消球表,移動值,消球值);
}
公開 坐標(biāo)點[],整數(shù) 取消球坐標(biāo)()
{
整數(shù) m,n,x,消球值=0;
坐標(biāo)點[] 消球數(shù)組=創(chuàng)建 坐標(biāo)點[0];
計次循環(huán)(9,m)
計次循環(huán)(9,n)
{
消球值=坐標(biāo)數(shù)組[m+1][n+1];
如果(是否有相同色球(m+1,n+1,1))//[-]向判斷
{
坐標(biāo)點 坐標(biāo)=創(chuàng)建 坐標(biāo)點();
坐標(biāo).置橫縱坐標(biāo)(m+1,n+1);
消球數(shù)組=(坐標(biāo)點[])消球數(shù)組.添加(坐標(biāo));
計次循環(huán)(9-(n+1),x)
{
如果(坐標(biāo)數(shù)組[m+1][n+1]==坐標(biāo)數(shù)組[m+1][n+1+x+1])
{
坐標(biāo)點 坐標(biāo)=創(chuàng)建 坐標(biāo)點();
坐標(biāo).置橫縱坐標(biāo)(m+1,n+1+x+1);
消球數(shù)組=(坐標(biāo)點[])消球數(shù)組.添加(坐標(biāo));
}
否則 返回(消球數(shù)組,消球值);
}
返回(消球數(shù)組,消球值);
}
如果(是否有相同色球(m+1,n+1,2))//[\]向判斷
{
坐標(biāo)點 坐標(biāo)=創(chuàng)建 坐標(biāo)點();
坐標(biāo).置橫縱坐標(biāo)(m+1,n+1);
消球數(shù)組=(坐標(biāo)點[])消球數(shù)組.添加(坐標(biāo));
如果(m+1-(n+1)<0)//不同于其他方式的操作,可實際畫圖理解
{
計次循環(huán)(9-(n+1),x)
{
如果(坐標(biāo)數(shù)組[m+1][n+1]==坐標(biāo)數(shù)組[m+1+(x+1)][n+1+(x+1)])
{
坐標(biāo)點 坐標(biāo)=創(chuàng)建 坐標(biāo)點();
坐標(biāo).置橫縱坐標(biāo)(m+1+(x+1),n+1+(x+1));
消球數(shù)組=(坐標(biāo)點[])消球數(shù)組.添加(坐標(biāo));
}
否則 返回(消球數(shù)組,消球值);
}
}
否則
{
計次循環(huán)(9-(m+1),x)
{
如果(坐標(biāo)數(shù)組[m+1][n+1]==坐標(biāo)數(shù)組[m+1+(x+1)][n+1+(x+1)])
{
坐標(biāo)點 坐標(biāo)=創(chuàng)建 坐標(biāo)點();
坐標(biāo).置橫縱坐標(biāo)(m+1+(x+1),n+1+(x+1));
消球數(shù)組=(坐標(biāo)點[])消球數(shù)組.添加(坐標(biāo));
}
否則 返回(消球數(shù)組,消球值);
}
}
返回(消球數(shù)組,消球值);
}
如果(是否有相同色球(m+1,n+1,3))//[|]向判斷
{
坐標(biāo)點 坐標(biāo)=創(chuàng)建 坐標(biāo)點();
坐標(biāo).置橫縱坐標(biāo)(m+1,n+1);
消球數(shù)組=(坐標(biāo)點[])消球數(shù)組.添加(坐標(biāo));
計次循環(huán)(9-(m+1),x)
{
如果(坐標(biāo)數(shù)組[m+1][n+1]==坐標(biāo)數(shù)組[m+1+x+1][n+1])
{
坐標(biāo)點 坐標(biāo)=創(chuàng)建 坐標(biāo)點();
坐標(biāo).置橫縱坐標(biāo)(m+1+x+1,n+1);
消球數(shù)組=(坐標(biāo)點[])消球數(shù)組.添加(坐標(biāo));
}
否則 返回(消球數(shù)組,消球值);
}
返回(消球數(shù)組,消球值);
}
如果(是否有相同色球(m+1,n+1,4))//[/]向判斷
{
坐標(biāo)點 坐標(biāo)=創(chuàng)建 坐標(biāo)點();
坐標(biāo).置橫縱坐標(biāo)(m+1,n+1);
消球數(shù)組=(坐標(biāo)點[])消球數(shù)組.添加(坐標(biāo));
如果(m+1+n+1<10)//不同于其他方式的操作,可實際畫圖理解
{
計次循環(huán)((n+1)-1,x)
{
如果(坐標(biāo)數(shù)組[m+1][n+1]==坐標(biāo)數(shù)組[m+1+(x+1)][n+1-(x+1)])
{
坐標(biāo)點 坐標(biāo)=創(chuàng)建 坐標(biāo)點();
坐標(biāo).置橫縱坐標(biāo)(m+1+(x+1),n+1-(x+1));
消球數(shù)組=(坐標(biāo)點[])消球數(shù)組.添加(坐標(biāo));
}
否則 返回(消球數(shù)組,消球值);
}
}
否則
{
計次循環(huán)(9-(m+1),x)
{
如果(坐標(biāo)數(shù)組[m+1][n+1]==坐標(biāo)數(shù)組[m+1+(x+1)][n+1-(x+1)])
{
坐標(biāo)點 坐標(biāo)=創(chuàng)建 坐標(biāo)點();
坐標(biāo).置橫縱坐標(biāo)(m+1+(x+1),n+1-(x+1));
消球數(shù)組=(坐標(biāo)點[])消球數(shù)組.添加(坐標(biāo));
}
否則 返回(消球數(shù)組,消球值);
}
}
返回(消球數(shù)組,消球值);
}
}
返回(消球數(shù)組,消球值);
}
邏輯 是否有相同色球(整數(shù) 行,整數(shù) 列,整數(shù) 方向)//判斷當(dāng)前球的有效范圍,-向\向|向/向,四個方向
{
邏輯 值=假;
假如(方向)//因從行1列1進(jìn)行每個單元格判斷,所以只用判斷4個方向即可
{
為 1://[-]向判斷
{
如果(列+4<=9 && 坐標(biāo)數(shù)組[行][列]!=0 && 坐標(biāo)數(shù)組[行][列]==坐標(biāo)數(shù)組[行][列+1]==坐標(biāo)數(shù)組[行][列+2] && 坐標(biāo)數(shù)組[行][列+2]==坐標(biāo)數(shù)組[行][列+3]==坐標(biāo)數(shù)組[行][列+4]) 值=真;
}
為 2://[\]向判斷
{
如果(行+4<=9 && 列+4<=9 && 坐標(biāo)數(shù)組[行][列]!=0 && 坐標(biāo)數(shù)組[行][列]==坐標(biāo)數(shù)組[行+1][列+1]==坐標(biāo)數(shù)組[行+2][列+2] && 坐標(biāo)數(shù)組[行+2][列+2]==坐標(biāo)數(shù)組[行+3][列+3]==坐標(biāo)數(shù)組[行+4][列+4]) 值=真;
}
為 3://[|]向判斷
{
如果(行+4<=9 && 坐標(biāo)數(shù)組[行][列]!=0 && 坐標(biāo)數(shù)組[行][列]==坐標(biāo)數(shù)組[行+1][列]==坐標(biāo)數(shù)組[行+2][列] && 坐標(biāo)數(shù)組[行+2][列]==坐標(biāo)數(shù)組[行+3][列]==坐標(biāo)數(shù)組[行+4][列]) 值=真;
}
為 4://[/]向判斷
{
如果(行+4<=9 && 列-4>=1 && 坐標(biāo)數(shù)組[行][列]!=0 && 坐標(biāo)數(shù)組[行][列]==坐標(biāo)數(shù)組[行+1][列-1]==坐標(biāo)數(shù)組[行+2][列-2] && 坐標(biāo)數(shù)組[行+2][列-2]==坐標(biāo)數(shù)組[行+3][列-3]==坐標(biāo)數(shù)組[行+4][列-4]) 值=真;
}
}
//如果(值) 界面程序.信息框("ok");//測試用,發(fā)現(xiàn)可以消球時提醒
返回(值);
}
坐標(biāo)點[] 取移動路徑(坐標(biāo)點[] 遍歷父表,坐標(biāo)點[] 遍歷子表,坐標(biāo)點 訪問點)
{
整數(shù) 指針;
坐標(biāo)點[] 路徑表=創(chuàng)建 坐標(biāo)點[0];
開始
{
指針=取指針(遍歷子表,訪問點);
路徑表=(坐標(biāo)點[])路徑表.插入(0,遍歷子表[指針]);
訪問點=遍歷父表[指針];
}循環(huán)(訪問點.橫坐標(biāo)()!=-1 && 訪問點.縱坐標(biāo)()!=-1);
返回(路徑表);
}
整數(shù) 取指針(坐標(biāo)點[] 遍歷表,坐標(biāo)點 訪問點)//指針==成員在數(shù)組中的位置
{
整數(shù) 指針,x;
計次循環(huán)(遍歷表.長度(),x)
{
如果(遍歷表[x].橫坐標(biāo)()==訪問點.橫坐標(biāo)() && 遍歷表[x].縱坐標(biāo)()==訪問點.縱坐標(biāo))
{
指針=x;跳出();
}
}
返回(指針);
}
坐標(biāo)點[],坐標(biāo)點[] 取遍歷表()
{
整數(shù) 表指針=0;
坐標(biāo)點[] 遍歷父表=創(chuàng)建 坐標(biāo)點[0];//記錄父點行列坐標(biāo)
坐標(biāo)點[] 遍歷子表=創(chuàng)建 坐標(biāo)點[0];//記錄父點行列坐標(biāo)
坐標(biāo)點 父點=創(chuàng)建 坐標(biāo)點();坐標(biāo)點 訪問點=創(chuàng)建 坐標(biāo)點();//橫縱==行列
父點.置橫縱坐標(biāo)(-1,-1);訪問點.置橫縱坐標(biāo)(選中行,選中列);
遍歷父表=(坐標(biāo)點[])遍歷父表.添加(父點);遍歷子表=(坐標(biāo)點[])遍歷子表.添加(訪問點);
//取子[表指針]的未訪問點X.加入遍歷表中(X!==遍歷子表中已訪問點)
//表指針++,至到表指針==數(shù)組.長度()結(jié)束遍歷
開始
{
(遍歷父表,遍歷子表)=取已訪問點(遍歷父表,遍歷子表,表指針);
表指針++;
}循環(huán)(表指針<遍歷子表.長度());
//遍歷表到遍歷數(shù)組(遍歷子表);//測試用,可顯示所有可達(dá)到單元格
返回(遍歷父表,遍歷子表);
}
坐標(biāo)點[],坐標(biāo)點[] 取已訪問點(坐標(biāo)點[] 遍歷父表,坐標(biāo)點[] 遍歷子表,整數(shù) 表指針)
{
整數(shù) 行=遍歷子表[表指針].橫坐標(biāo)(),列=遍歷子表[表指針].縱坐標(biāo)();
如果(行<9 && 坐標(biāo)數(shù)組[行+1][列]==0)
{
坐標(biāo)點 訪問點1=創(chuàng)建 坐標(biāo)點();
訪問點1.置橫縱坐標(biāo)(行+1,列);
如果(是否重復(fù)訪問點(遍歷子表,訪問點1)==假)
{
遍歷父表=(坐標(biāo)點[])遍歷父表.添加(遍歷子表[表指針]);遍歷子表=(坐標(biāo)點[])遍歷子表.添加(訪問點1);
}
}
如果(行>1 && 坐標(biāo)數(shù)組[行-1][列]==0)
{
坐標(biāo)點 訪問點2=創(chuàng)建 坐標(biāo)點();
訪問點2.置橫縱坐標(biāo)(行-1,列);
如果(是否重復(fù)訪問點(遍歷子表,訪問點2)==假)
{
遍歷父表=(坐標(biāo)點[])遍歷父表.添加(遍歷子表[表指針]);遍歷子表=(坐標(biāo)點[])遍歷子表.添加(訪問點2);
}
}
如果(列<9 && 坐標(biāo)數(shù)組[行][列+1]==0)
{
坐標(biāo)點 訪問點3=創(chuàng)建 坐標(biāo)點();
訪問點3.置橫縱坐標(biāo)(行,列+1);
如果(是否重復(fù)訪問點(遍歷子表,訪問點3)==假)
{
遍歷父表=(坐標(biāo)點[])遍歷父表.添加(遍歷子表[表指針]);遍歷子表=(坐標(biāo)點[])遍歷子表.添加(訪問點3);
}
}
如果(列>1 && 坐標(biāo)數(shù)組[行][列-1]==0)
{
坐標(biāo)點 訪問點4=創(chuàng)建 坐標(biāo)點();
訪問點4.置橫縱坐標(biāo)(行,列-1);
如果(是否重復(fù)訪問點(遍歷子表,訪問點4)==假)
{
遍歷父表=(坐標(biāo)點[])遍歷父表.添加(遍歷子表[表指針]);遍歷子表=(坐標(biāo)點[])遍歷子表.添加(訪問點4);
}
}
返回(遍歷父表,遍歷子表);
}
邏輯 是否重復(fù)訪問點(坐標(biāo)點[] 遍歷子表,坐標(biāo)點 訪問點)//重復(fù)返回真,示重復(fù)返回假
{
邏輯 值=假;
整數(shù) x;
計次循環(huán)(遍歷子表.長度(),x)
{
如果(遍歷子表[x].橫坐標(biāo)()==訪問點.橫坐標(biāo)() && 遍歷子表[x].縱坐標(biāo)()==訪問點.縱坐標(biāo))
{
值=真;返回(值);
}
}
返回(值);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -