wpeter
2006-01-12, 07:42 PM
最近想說要來玩玩看小型遊戲的設計,所以寫了個圈圈叉叉來玩玩。但是現在有點小問題...
比較普通的狀況(如:1P 或2P 在第三次下手就已經連成一直線或一斜線)沒有什麼問題,但是像下列
幾種情況就會出現判斷錯誤的情況:
+-+-+-+ +-+-+-+
|○| |○| | |○|○|
+-+-+-+ +-+-+-+
|○|╳|╳| |○|╳|╳|
+-+-+-+ +-+-+-+
|╳|╳|○| |╳|╳|○|
+-+-+-+ +-+-+-+ ..........
╳ 獲勝 ╳ 獲勝
目前是用三乘三的二維陣列來存放出手的資訊。一開始先將所有陣列的數值都歸零。然後圈圈的代表值是
「1」,叉叉的代表值是「2」。利用迴圈假設一個起始點,然後一一跟它右邊(橫排)的陣列值做比較
,或是跟它下面的值(縱行)做比較。如果值是一樣的,那就設win 為起始點的陣列值,然後繼續比對,
否則win=0,並直接跳出迴圈,繼續讓下一行的判斷。(不知道這個邏輯上有沒有瑕疵...)
那麼,根據上面的想法,我可以寫成下面這樣的一個判斷程式,分橫排、縱行、左斜()和右斜(@)
分別討論。但是就是出了上面這些小紕漏,麻煩大家幫我看看好嗎!?
/* 平行全相等時勝利 */
for(i=0;i<size;i++){
for(j=1;j<size;j++){
if(game[i][0]==game[i][j] && game[i][0]!=0 && game[i][j]!=0)
{
win=game[i][0];
} else {
win=0;
break;
}
if(win==0)
{
break;
}
}
if(win!=0)
{
goto flag3;
}
}
/* 垂直全相等時勝利 */
for(i=0;i<size;i++){
for(j=1;j<size;j++){
if(game[0][i]==game[j][i] && game[0][i]!=0 && game[j][i]!=0)
{
win=game[0][i];
} else {
win=0;
break;
}
if(win==0)
{
break;
}
}
if(win!=0)
{
goto flag3;
}
}
/* 右斜全相等時勝利 */
for(i=0;i<(size-1);i++){
if(game[0][0]==game[i+1][i+1] && game[0][0]!=0 && game[i+1][i+1]!=0)
{
win=game[0][0];
} else {
win=0;
break;
}
}
if(win!=0)
{
goto flag3;
}
/* 左斜全相等時勝利 */
for(i=1;i<(size-1);i++){
if(game[size-1][0]==game[size-i-1][i] && game[size-1][0]!=0 && game[size-i-1][i]!=0)
{
win=game[size-1][0];
} else {
win=0;
break;
}
}
if(win!=0)
{
goto flag3;
}
其中goto flag3是勝利的情況(很不好的寫法...但是太懶惰了...),直接跳出迴圈,然後輸出某某玩家勝
利的訊息。因為陣列值只要不為零就可以判斷是圈圈下手或是叉叉下手,所以直接讓它成為win 值,方便
程式判斷哪一位玩家贏得了勝利。
贊助商連結
比較普通的狀況(如:1P 或2P 在第三次下手就已經連成一直線或一斜線)沒有什麼問題,但是像下列
幾種情況就會出現判斷錯誤的情況:
+-+-+-+ +-+-+-+
|○| |○| | |○|○|
+-+-+-+ +-+-+-+
|○|╳|╳| |○|╳|╳|
+-+-+-+ +-+-+-+
|╳|╳|○| |╳|╳|○|
+-+-+-+ +-+-+-+ ..........
╳ 獲勝 ╳ 獲勝
目前是用三乘三的二維陣列來存放出手的資訊。一開始先將所有陣列的數值都歸零。然後圈圈的代表值是
「1」,叉叉的代表值是「2」。利用迴圈假設一個起始點,然後一一跟它右邊(橫排)的陣列值做比較
,或是跟它下面的值(縱行)做比較。如果值是一樣的,那就設win 為起始點的陣列值,然後繼續比對,
否則win=0,並直接跳出迴圈,繼續讓下一行的判斷。(不知道這個邏輯上有沒有瑕疵...)
那麼,根據上面的想法,我可以寫成下面這樣的一個判斷程式,分橫排、縱行、左斜()和右斜(@)
分別討論。但是就是出了上面這些小紕漏,麻煩大家幫我看看好嗎!?
/* 平行全相等時勝利 */
for(i=0;i<size;i++){
for(j=1;j<size;j++){
if(game[i][0]==game[i][j] && game[i][0]!=0 && game[i][j]!=0)
{
win=game[i][0];
} else {
win=0;
break;
}
if(win==0)
{
break;
}
}
if(win!=0)
{
goto flag3;
}
}
/* 垂直全相等時勝利 */
for(i=0;i<size;i++){
for(j=1;j<size;j++){
if(game[0][i]==game[j][i] && game[0][i]!=0 && game[j][i]!=0)
{
win=game[0][i];
} else {
win=0;
break;
}
if(win==0)
{
break;
}
}
if(win!=0)
{
goto flag3;
}
}
/* 右斜全相等時勝利 */
for(i=0;i<(size-1);i++){
if(game[0][0]==game[i+1][i+1] && game[0][0]!=0 && game[i+1][i+1]!=0)
{
win=game[0][0];
} else {
win=0;
break;
}
}
if(win!=0)
{
goto flag3;
}
/* 左斜全相等時勝利 */
for(i=1;i<(size-1);i++){
if(game[size-1][0]==game[size-i-1][i] && game[size-1][0]!=0 && game[size-i-1][i]!=0)
{
win=game[size-1][0];
} else {
win=0;
break;
}
}
if(win!=0)
{
goto flag3;
}
其中goto flag3是勝利的情況(很不好的寫法...但是太懶惰了...),直接跳出迴圈,然後輸出某某玩家勝
利的訊息。因為陣列值只要不為零就可以判斷是圈圈下手或是叉叉下手,所以直接讓它成為win 值,方便
程式判斷哪一位玩家贏得了勝利。
贊助商連結