黑白棋游戏中的 C 指针

标签 c pointers reversi

我希望这个函数在玩家 1 放置位置程序检查之后,左侧是玩家 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;
}

最佳答案

有点错误的代码:

 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';}

如何将 &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';

上面的代码部分仅供引用。这将检查该移动对于左侧是否有效。如果有效,则转换对手的棋子。您需要理解这一点,并为“右”,“添加类似的逻辑对角线”等来完成黑白棋游戏。

关于黑白棋游戏中的 C 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16843794/

相关文章:

c - 从 C 中的字符串中获取文本的特定部分

c - 弧球相机变焦

使用openwrt编译C程序

algorithm - 黑白棋评价函数

code-golf - Code Golf : Reversi

c - 使用指针改变矩阵

c++ - 如何衡量管理内存所花费的时间

javascript - Parse - JavaScript 指针查询,从指针返回解析对象的问题

c - C 中指向指针的指针抛出段错误

c++ - 理解为什么存储在链表中的字符串不能正确打印