2014-11-01 67 views
-1

我正在寫代碼的遊戲,寶石棋和測試沿途修復分段錯誤。到目前爲止,我得到一個錯誤,指出:怎樣在我的C代碼

分段錯誤(核心轉儲)

我不知道如何解決它,並保持運行。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

void move_clockwise(int board[], int pos, int player_1); 
void move_count_clock(int board[], int pos, int player_1); 
void mancala_board(int board[]); 
int *current1; 
int *current2; 
int board[30], player_1, sum, position, direction, i, n, play, initPos, curPos, pos; 

//====================================================================== 

int main(void) 
{ 
int board[30]; 
board[0] = 4; 
board[1] = 4; 
board[2] = 4; 
board[3] = 4; 
board[4] = 4; 
board[5] = 4; 
board[6] = 0; 
board[7] = 4; 
board[8] = 4; 
board[9] = 4; 
board[10] = 4; 
board[11] = 4; 
board[12] = 4; 
board[13] = 0; 

printf("Welcome to Mancala\n"); 
    printf("\n\n  5 4 3 2 1 0 \n"); 
    printf("BLUE\n"); 
    printf("=====[%d] [%d] [%d] [%d] [%d] [%d]-----\n", board[5], board[4], board[3], board[2], board[1], board[0]); 
    printf("|%d|     |%d|\n", board[6], board[13]); 
    printf("-----[%d] [%d] [%d] [%d] [%d] [%d]=====\n", board[7], board[8], board[9], board[10], board[11], board[12]); 
    printf("     RED\n"); 
    printf("  6 7 8 9 10 11 \n\n"); 
sum=board[6]+board[13]; 
player_1=first_player(); 

while(sum!=48) 
{ 

    while (player_1 == 1) 
    { 
    printf("Player RED\n"); 
    printf("Pick a position corresponding to the integer: "); 
    scanf("%d", position); 

     while (position!=6 || position!=7 || position!=8 || position!=9 || position!=10 || position!=11) 
      { 
      printf("\nInvalid input, you have to select a bowl from your side.\nPlease select another position"); 
      scanf("%d",&position); 
      } 
     printf("Would you like to move clockwise or counter-clockwise?"); 
     printf("\n1. Clockwise \n2. Counter-Clockwise"); 
     scanf("%d",&direction); 
     while(direction!=1 && direction!=2) 
      { 
      printf("\nInvalid input, you have to select an integer corresponding to the given options.\n"); 
      printf("\n1. Clockwise \n2. Counter-Clockwise"); 
      scanf("%d",&direction); 
      } 
     if (direction==1) 
      { 
      position+=1; 
      move_clockwise(board, position, player_1); 
      } 
     if(direction==2) 
      { 
      position=+1; 
      move_count_clock(board, position, player_1); 
      } 
    player_1-=1; 
    mancala_board(board); 
    } 

    if (player_1 == 0) 
     { 
     printf("Player BLUE\n"); 
     printf("Pick a position corresponding to the integer: "); 
     scanf("%d", position); 
     while (position!=0 || position!=1 || position!=2 || position!=3 || position!=4 || position!=5) 
      { 
      printf("\nInvalid input, you have to select a bowl from your side.\nPlease select another position"); 
      scanf("%d",&position); 
      } 
     printf("Would you like to move clockwise or counter-clockwise?"); 
     printf("\n1. Clockwise \n2. Counter-Clockwise"); 
     scanf("%d",&direction); 
     while(direction!=1 && direction!=2) 
      { 
      printf("\nInvalid input, you have to select an integer corresponding to the given options.\n"); 
      printf("\n1. Clockwise \n2. Counter-Clockwise"); 
      scanf("%d",&direction); 
      } 
     if (direction==1) 
      { 
      position+=1; 
      move_clockwise(board, position, player_1); 
      } 
     if(direction==2) 
      { 
      position=+1; 
      move_count_clock(board, position, player_1); 
      } 
     player_1+=1; 
     mancala_board(board); 
     } 
    sum=board[6]+board[13]; 
    } 
} 

//====================================================================== 

int first_player(void) 
{ 
    //to determine who will be player 1 
    play=rand()%2; 
    return (play); 
} 

//====================================================================== 

//Display current board 
void mancala_board(int board[]) 
{ 
    printf("\n\n  5 4 3 2 1 0 \n"); 
    printf("BLUE\n"); 
    printf("=====[%d] [%d] [%d] [%d] [%d] [%d]-----\n", board[5], board[4], board[3], board[2], board[1], board[0]); 
    printf("|%d|     |%d|\n", board[6], board[13]); 
    printf("-----[%d] [%d] [%d] [%d] [%d] [%d]=====\n", board[7], board[8], board[9], board[10], board[11], board[12]); 
    printf("     RED\n"); 
    printf("  6 7 8 9 10 11 \n\n"); 
} 

//====================================================================== 

//allow player to move again if late marble lands in mancala 
//void move_again(int board[], int pos, int player_1) 
//{ 



//} 

//====================================================================== 

//captures the marbles across the current position if player's 
//last marble lands on their own bowl with no marbles in 
//void capture() 
//{ 



//} 

//====================================================================== 

void move_clockwise(int board[], int pos, int player_1) 
{ 
    initPos = pos; 
    n=board[pos]; 
    pos+=1; 
    for (i = 0; i < n ; i++) 
    { 
    curPos +=1;  
    board[curPos]+=1; 

    if (curPos == 14) 
     curPos -=14; 

    else if (curPos >= 28) 
     curPos -= 28; 

    if (player_1 == 0) 
    { 
    current1 = &(board[curPos]); 
    if (current1 == &(board[6])) 
     { 
     current1 = &(board[7]); 
     current1 += 1; 
     } 
    }  

    if (player_1 == 1) 
    { 
    current2 = &(board[curPos]); 
     if (current2 == &(board[13])) 
     { 
     current2 = &(board[0]); 
     current2 += 1; 
     } 
    } 
    } 
    board[initPos] = 0; 
} 

//====================================================================== 

void move_count_clock(int board[], int pos, int player_1) 
{ 
    initPos = pos; 
    n=board[pos]; 
    pos+=1; 
    for (i = 0; i < n ; i++) 
    { 
    curPos +=1;  
    board[curPos]+=1; 

    if (curPos == 14) 
     curPos -=14; 

    else if (curPos >= 28) 
     curPos -= 28; 

    if (player_1 == 0) 
    { 
    current1 = &(board[curPos]); 
    if (current1 == &(board[6])) 
     { 
     current1 = &(board[7]); 
     current1 += 1; 
     } 
    }  

    if (player_1 == 1) 
    { 
    current2 = &(board[curPos]); 
     if (current2 == &(board[13])) 
     { 
     current2 = &(board[0]); 
     current2 += 1; 
     } 
    } 
    } 
    board[initPos] = 0; 
} 
+4

你是怎麼試圖自己調試程序的?例如,您是否嘗試過使用[gdb](https://www.gnu.org/software/gdb/)或[Valgrind](https://en.wikipedia.org/wiki/Valgrind)? – GoBusto 2014-11-01 23:14:39

+2

'scanf(「%d」,position);' – wimh 2014-11-01 23:14:48

+0

@Wimmel是的,開發人員如何設想通過價值傳遞var可以奇蹟般地改變它? – 2014-11-01 23:52:56

回答

1

也許你想分開小塊的代碼和測試每一塊。或者,也許這可以幫助你:http://ericlippert.com/2014/03/05/how-to-debug-small-programs/

把&裏面的scanf是正確的建議,我認爲是在評論意思。

不管怎樣,這也是奇怪:

while (position!=6 || position!=7 || position!=8 || position!=9 || position!=10 || position!=11) 
{ 
      scanf("%d",&position); 
} 

你能指望什麼上面?它將始終進入該循環,並且從不出來,因爲 如果位置是6,它不能是7,因此由於OR,該語句將爲真。

+0

我會試試,謝謝! – Madhatter 2014-11-01 23:19:25

+0

我其實只是改變了while循環到&&,我意識到它會以無限循環結束 – Madhatter 2014-11-01 23:37:31