Как создать функцию, заменяющую элементы 2d-массива на основе пользовательского ввода в C?

#arrays #c #function #pointers #multidimensional-array

Вопрос:

Для моей лаборатории скользящих головоломок мне необходимо создать игру с 4х4 плитками под номером 15-1 (0-пустое место).Я начал продвигаться с моим кодом, но я понятия не имею, как создать свою функцию moveTile. Я предполагаю, что он может использовать указатели, но я не уверен, как это закодировать. Мне также нужно использовать другую функцию, чтобы определить, является ли перемещение допустимым. Перемещение будет допустимым только в том случае, если выбранная пользователем плитка находится рядом с пустой плиткой (0). Цель состоит в том, чтобы весь массив располагался в порядке возрастания (1-15). Мы будем очень признательны за любую помощь. Откровенно говоря, мои навыки кодирования все еще немного грубоваты

 #include <stdio.h>

const int row = 4; //global variables for row column size of board
const int col = 4;

//function prototypes
void startGame(void);
void endGame(void);
void displayGame(int arr [row][col]);
int is_move_valid(int tile);
int moveTile(int arry[][]);


/*int moveTile() //function to move tiles
{
    
}
*/


int main(void) {

    startGame(); //Prints game initialization message
   
    char a; //char variable for user to start game
    
    
    printf("Menu: [p]rint , [m]ove , [q]uit: n"); //gives user options to start game, move piece, or quit
    scanf(" %c", amp;a);
         while (getchar() != 'q') { //loops the game unless user decides to quit
             if ( a =='p')
             {
                 int board [][4] = { {0, 15, 14, 13},
                                     {12, 11, 10, 9},
                                     {8, 7, 6, 5},
                                     {4, 3, 2, 1}};
                 displayGame(board);
             }
             
        
        

        printf("nMenu: [p]rint , [m]ove , [q]uit:n");
        }
        
    
    endGame();
    return 0;
}
void startGame() //game initialization function definition
{
    printf("Setting Up The Gamen");
}

void displayGame(int arr [row][col]){ //board display function
    int i, j;
    for (i=0; i<row; i  ) { //creates row elements
        printf("n"); //formatting into 4x4
        for (j=0; j<col; j  ) { //creates column elements
            printf("=", arr[i][j]);
        }
    }
}
int is_move_valid(int tile)
{
    
}
void endGame(void) //game teardown
{
    printf("Ending the gamen");
}

int moveTile(int arry[][]){
    int t; // integer variable for tile the user wants to move
    printf("Which tile would you like to move? :n ");
    scanf("%d", amp;t);
}
 

Комментарии:

1. Вам нужно найти квадрат, содержащий плитку. Затем вам нужно проверить, находится ли он рядом с плиткой, равной 0, имея в виду, что плитка также может находиться рядом с краем сетки. Если плитка находится рядом с 0, вы устанавливаете для этого другого квадрата значение плитки, а для текущего квадрата-0. Разбейте проблему на более мелкие, очень конкретные проверки.

2. Есть два способа взглянуть на ходы. Один из них заключается в перемещении определенной пронумерованной плитки в определенном направлении, которое указывает на открытое пространство. Использование этого подхода означает, что выбранная плитка должна иметь открытое пространство в правильном смежном положении, при условии, что смежное положение, конечно, находится на доске. Это довольно сложно. Другой способ взглянуть на это таков: движение-это просто перемещение плитки в открытое пространство с определенного направления. Возможно, вы сочтете, что последний подход более полезен с точки зрения пользовательского интерфейса.

3. int arry[][] : это неверно, вам необходимо указать второе измерение, например int arry[][4]

Ответ №1:

Пока вы думаете о том, как реализовать эти движения , позвольте мне отметить, что ваш дизайн выглядит как бы вывернутым наизнанку; большая вещь будет playGame() , так что это будет важная функция, вызываемая by main() .

 int main(void) {
    
    printf("Setting Up The Gamen");

    playGame(); 

    printf("Thank you for playing!n");

}
 

Теперь у вас есть начало, середина и конец. И пока не нуждаюсь ни в каких комментариях.

Если для запуска или демонтажа требуется больше, то вы можете поместить эти строки также в функции.


ходы: нулевая плитка может двигаться как ладья в шахматах: от 1 до максимальных квадратов, но не по диагонали; но пользователь, вероятно, не хочет перемещаться по лунке.