2013-05-30 28 views
0

我有这个函数的问题。这还没完成。我是新手程序员,我不知道我犯了什么错误。逆向游戏中的C指针

我想要这个功能之后,玩家1放置位置程序chack,左边是玩家的1个棋子,玩家1的两个棋子之间的所有对手的爪子都打开'X',就像在逆向游戏中一样。

我知道我的解释很复杂,但我希望任何人都可以遏制我。 这是全未完成代码:

#include<stdio.h> 


#define SIZE 7 

char board[SIZE][SIZE]; 
char letter; 
int number; 

void make_board(char tab[SIZE][SIZE]){ 
    int w,k; 

for(w=0; w < SIZE; w++){ 

    for(k=0; k < SIZE; k++){ 
     tab[w][k] = '.'; 
    } 
} 

tab[0][0] = 'X'; 
tab[1][0] = '1';  
tab[2][0] = '2'; 
tab[3][0] = '3'; 
tab[4][0] = '4'; 
    tab[5][0] = '5'; 
    tab[6][0] = '6';  

tab[0][1] = 'A';  
tab[0][2] = 'B'; 
tab[0][3] = 'C'; 
tab[0][4] = 'D'; 
tab[0][5] = 'E'; 
tab[0][6] = 'F'; 

tab[4][4] = 'X'; 
tab[4][3] = 'O'; 
tab[3][4] = 'O'; 
tab[3][3] = 'X'; 

} 

char draw_board(char tab[SIZE][SIZE]){ 
    int w, k; 
    for(w=0; w < SIZE; w++){ 
     for(k=0; k < SIZE; k++){ 
      printf("%2c", tab[w][k]); 
     } 
     printf("\n"); 
    } 
} 

int translate(char letter){ 
int letter_to_number; 
switch(letter){ 
    case 'A': 
    case 'a': 
     letter_to_number = 1; 
     break; 

    case 'B': 
    case 'b': 
     letter_to_number = 2; 
     break; 

    case 'C': 
    case 'c': 
     letter_to_number = 3; 
     break; 

    case 'D': 
    case 'd': 
     letter_to_number = 4; 
     break;  
    case 'E': 
    case 'e': 
     letter_to_number = 5; 
     break; 
} 
return letter_to_number; 
} 
int finished(char tab[SIZE][SIZE]){ // looking '.' in array 
    int i,j; 
    for(i=1;i<=SIZE;i++){ 
     for(j=1;j<=SIZE;j++){ 
     if(tab[i][j]=='.'){ 
      return 1; 
     }else{ 
      return 0; // if don't find any '.' game is finish 
     } 
    }  
    } 
} 

void hit(char tab[SIZE][SIZE], int player){ 
int i,j; 

int *poz1, *poz2; 
printf("Call out a letter and a number of a row and column on the grid:\n"); 
    scanf(" %c %d", &letter, &number); 
    i=translate(letter); 
    poz1=&tab[number][i]; 
    if(tab[number][i]=='.'){ 
     if(player==1){ 
      *poz1='X'; 
      for(poz1-1;*poz1=='X';poz1--){ 
       poz2=&poz1;} 
      poz1=&tab[number][i]; 
      for(poz2;poz2<=poz1;poz2++){ 
       *poz2='X';} 
     }else{ 
      *poz1='O'; 
      for(poz1-1;*poz1=='O';poz1--){ 
       poz2=&poz1;} 
      poz1=&tab[number][i]; 
      for(poz2;poz2<=poz1;poz2++){ 
       poz2='O';} 
     }  
    }else{ 
     printf("On this place already is pawn\n"); 
    } 
    draw_board(board); 
    getchar(); 
} 

int main(){ 
int i,j,k, pg1=0, pg2=0, player=1; 
make_board(board); 
draw_board(board); 

do{ 
    if(player==1){ 
    printf("Player 1\n"); 
    hit(board, gracz); 
    k=finished(board); 
    gracz=2; 
    }else{ 
    printf("Player 2\n"); 
    hit(board, gracz); 
    k=finished(board); 
    player=1; 
    } 
}while(k==1); 

    for(i=1;i<=SIZE;i++){ 
     for(j=1;j<=SIZE;j++){ 
     if(board[i][j]=='X'){ 
      pg1++; 
     }else{ 
      pg2++; 
     } 
    } 
    } 

    if(pg1>pg2){ 
    printf("Player 1 wins"); 
}else{ 
    printf("Player 2 wins"); 
} 
return 0; 
} 
+1

'我不知道我犯了什么错误 - 所以你说这是一个逻辑错误,它不像你预期的那样工作?它做错了什么?你有没有试图调试你的代码? – Mike

+0

请重新翻译你的第二句话,这是不可理解的。 – 2013-05-30 18:56:42

+0

欢迎来到SO。不幸的是你的问题是不可理解的。请花更多精力解释你的功能应该做什么,然后解释遇到的错误类型。 –

回答

0

位bug的代码:

poz1=&tab[number][i]; 
if(tab[number][i]=='.'){ 
    if(player==1){ 
     *poz1='X'; 
     for(poz1-1;*poz1=='X';poz1--){ 
      poz2=&poz1;} 
     poz1=&tab[number][i]; 
     for(poz2;poz2<=poz1;poz2++){ 
      *poz2='X';} 

你怎么能ASGN & POS1到POS2。为此,您需要指向指针的指针,即pos 2应声明为** pos2。

此外,你想通过循环poz1(前面设置'X')来实现什么?

总之,一些清理你的代码:

if(tab[number][i]=='.'){ 
    if(player==1){ //considering player 1 is 'X' 
     // Loop to the left till you find opponent's piece or come to edge. 
     for(j=i-1;tab[number][j]=='O' && j!=0 ;j--) 
      ; 
     // Validation check 
     if(i-j <=1 || tab[number][j] != 'X'); 
     //Invalid move 
      return 1; 
     else 
      // convert all the opponents pieces between two of yours piece 
      for(k=i;k>j;k--) 
       tab[number][k] = 'X'; 

上面的代码部分是资料only..this将检查此举是有效的左侧side..and如果有效转换的对手的棋子。 。你需要了解这一点,并把“右”,“对角线”等类似的逻辑,以完成逆向游戏。

+0

非常感谢您的帮助。 – Lemonngirl

+0

好的,在代码中添加了一些评论,以便于理解。 – user2407394

+0

接受答案,如果你发现它有用.. !! – user2407394