電腦遊戲製作開發設計論壇 首頁 電腦遊戲製作開發設計論壇
任何可以在PC上跑的遊戲都可以討論,主要以遊戲之製作開發為主軸,希望讓台灣的遊戲人有個討論、交流、教學、經驗傳承的園地
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入 

Google
您好~我是個程式新手,想請教以下的程式段,有哪些部份可以改進呢?

 
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式初級班:語法及基礎概念
上一篇主題 :: 下一篇主題  
發表人 內容
mimisa01
偶而上來逛逛的過客


註冊時間: 2009-11-05
文章: 7

146.17 果凍幣

發表發表於: 2009-11-5, AM 1:19 星期四    文章主題: 您好~我是個程式新手,想請教以下的程式段,有哪些部份可以改進呢? 引言回覆

代碼:

#include <stdio.h>
#include <stdlib.h>
main(){
    char o[3][3]={'*', '*','*','*','*','*','*','*','*'};//宣告二維陣列元素
    char who='O';//宣告字元變數O記憶在who位址
    char l,k;//宣告字元變數記憶座標 ,比對是否輸入重覆用
    int j,x,y,m,n;//宣告變數j=回合數,x=記憶座標x,y=記憶座標y,m=顯示座標x,n=顯示座標y
    int owin,xwin,r;//宣告owin,xwin判斷是否平手用的變數,r=檢查最後一場勝負
    printf ("\n");
        for (m=0; m<=2; m++) {//顯示遊戲棋盤
           for (n=0; n<=2; n++) {
                printf("   %c   ", o[m][n]);
           };
           printf("\n");
        }
    printf ("\n");
    for (j=0; j<9; j++){//迴圈計算9次結束
    /*判斷勝負O win*/
    /*如果Owin,直接跳出迴圈,並給予數值1記錄*/
    if ((o[0][0]=='O') && (o[0][1]=='O') && (o[0][2]=='O')||
       (o[1][0]=='O') && (o[1][1]=='O') && (o[1][2]=='O' )||
       (o[2][0]=='O') && (o[2][1]=='O') && (o[2][2]=='O' )||
       (o[0][0]=='O') && (o[1][0]=='O') && (o[2][0]=='O' )||
       (o[0][1]=='O') && (o[1][1]=='O') && (o[2][1]=='O' )||
       (o[0][2]=='O') && (o[1][2]=='O') && (o[2][2]=='O' )||
       (o[0][0]=='O') && (o[1][1]=='O') && (o[2][2]=='O' )||
       (o[0][2]=='O') && (o[1][1]=='O') && (o[2][0]=='O' )){
    owin=1;
    break;
    }
    /*判斷勝負X win*/
    /*如果Xwin直接跳出迴圈,並給予數值1記錄*/   
    if ((o[0][0]=='X') && (o[0][1]=='X') && (o[0][2]=='X')||
       (o[1][0]=='X') && (o[1][1]=='X') && (o[1][2]=='X' )||
       (o[2][0]=='X') && (o[2][1]=='X') && (o[2][2]=='X' )||
       (o[0][0]=='X') && (o[1][0]=='X') && (o[2][0]=='X' )||
       (o[0][1]=='X') && (o[1][1]=='X') && (o[2][1]=='X' )||
       (o[0][2]=='X') && (o[1][2]=='X') && (o[2][2]=='X' )||
       (o[0][0]=='X') && (o[1][1]=='X') && (o[2][2]=='X' )||
       (o[0][2]=='X') && (o[1][1]=='X') && (o[2][0]=='X' )){
    xwin=1;
    break;
    }
PunchInAgain://輸入錯誤時重新開始
         printf("%c請輸入x座標(0~2):", who);//要求輸入 x 座標位置
         scanf("%d", &x);//輸入 x 座標位置
         printf("%c請輸入y座標(0~2):", who);//要求輸入 y 座標位置
         scanf("%d", &y);//輸入 y 座標位置
         if(x>=0 && x<=2 && y>=0 && y<=2){//判斷輸入的x,y值是否錯誤
         }
           else {
              printf("輸入錯誤!!請輸入(0~2)\n");
           goto PunchInAgain;//錯誤時重新輸入
           }
         l=o[x][y];//記憶剛輸入的座標位置
//比對是否輸入錯誤,l==k比對這場是否輸入錯誤,l==who比對OX是否同樣重覆下在同一步         
          if (l == k || l==who){
          printf ("輸入錯誤!!\n");
          goto PunchInAgain;//錯誤時重新輸入 
          }   
         o[x][y]=who;//記憶座標位置
         k=o[x][y];//記憶下次比對座標位置
      if (who=='O') who='X';//判斷如果是O的話就換X
      else who='O';//否則為O
      for (m=0; m<=2; m++) {//顯示目前下的進度
           for (n=0; n<=2; n++) {
                printf("   %c   ", o[m][n]);
           };
           printf("\n");
      }
    }
   for(r=0;r<1;r++){//檢查最後一次勝負,避免平手後無法跳離迴圈所以設定變數r<1
    /*判斷勝負O win*/
    /*如果Owin直接跳出迴圈,且給予數值1記錄,並列印勝負結果*/
    if ((o[0][0]=='O') && (o[0][1]=='O') && (o[0][2]=='O')||
       (o[1][0]=='O') && (o[1][1]=='O') && (o[1][2]=='O' )||
       (o[2][0]=='O') && (o[2][1]=='O') && (o[2][2]=='O' )||
       (o[0][0]=='O') && (o[1][0]=='O') && (o[2][0]=='O' )||
       (o[0][1]=='O') && (o[1][1]=='O') && (o[2][1]=='O' )||
       (o[0][2]=='O') && (o[1][2]=='O') && (o[2][2]=='O' )||
       (o[0][0]=='O') && (o[1][1]=='O') && (o[2][2]=='O' )||
       (o[0][2]=='O') && (o[1][1]=='O') && (o[2][0]=='O' )){
    printf ("O win");
    owin=1;
    break;
    }
    /*判斷勝負X win*/
    /*如果Xwin直接跳出迴圈,且給予數值1記錄,並列印勝負結果*/   
    if ((o[0][0]=='X') && (o[0][1]=='X') && (o[0][2]=='X')||
       (o[1][0]=='X') && (o[1][1]=='X') && (o[1][2]=='X' )||
       (o[2][0]=='X') && (o[2][1]=='X') && (o[2][2]=='X' )||
       (o[0][0]=='X') && (o[1][0]=='X') && (o[2][0]=='X' )||
       (o[0][1]=='X') && (o[1][1]=='X') && (o[2][1]=='X' )||
       (o[0][2]=='X') && (o[1][2]=='X') && (o[2][2]=='X' )||
       (o[0][0]=='X') && (o[1][1]=='X') && (o[2][2]=='X' )||
       (o[0][2]=='X') && (o[1][1]=='X') && (o[2][0]=='X' )){
       printf ("X win");
       xwin=1;
       break;
       }
    }
    //判斷是否平手
    if((xwin==1) || (owin==1)){
    printf("遊戲結束\n");
    }
       else {
       printf("平手\n");
       }
    system ("pause");
}

附註:這是個井字遊戲
有關於輸入錯誤部份,如果不用goto語法的話,想請問,還有什麼方法可以直接繞回去?
謝謝指教

_________________
一步一腳印
回頂端
檢視會員個人資料 發送私人訊息
yag
Site Admin


註冊時間: 2007-05-02
文章: 688

2673.35 果凍幣

發表發表於: 2009-11-7, PM 12:27 星期六    文章主題: Re: 您好~我是個程式新手,想請教以下的程式段,有哪些部份可以改進呢? 引言回覆

mimisa01 寫到:

附註:這是個井字遊戲
有關於輸入錯誤部份,如果不用goto語法的話,想請問,還有什麼方法可以直接繞回去?
謝謝指教

用個do-while迴圈包起來就好了
設個flag變數先設為0
如果需要跳回去
就把它設成1
然後while判斷它為1時再做一次

另外你的變數名稱應該盡可能取有明確意義的名字
加註解是必要的
但不是加了註解就可以亂取名
程式的理解複雜度是看你必須同時在腦中記得幾樣東西
你如果亂取名
那看的人就必須記住每個名字跟註解的對應意義
會讓程式變得難以理解
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
mimisa01
偶而上來逛逛的過客


註冊時間: 2009-11-05
文章: 7

146.17 果凍幣

發表發表於: 2009-11-9, AM 7:46 星期一    文章主題: 引言回覆

謝謝教導....首先先看看flag怎麼使用,還有我的英文還要再加強QQ
_________________
一步一腳印
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    電腦遊戲製作開發設計論壇 首頁 -> 遊戲程式初級班:語法及基礎概念 所有的時間均為 台灣時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
可以 在這個版面附加檔案
可以 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作