Массив указателя игры не уверен, как переместить указатели назад

есть игра, в которой эта программа должна играть в X-boom, она должна вынимать x-игрока каждый ход и помещать его в конец массива, а затем укорачивать массив, чтобы он больше не участвовал в этой функции. например

игрок 1 2 3 4 и х для игры 3

осталось игроков: 1 2 4

осталось игроков: 1 4

осталось игроков: 1

я сделал этот код, который я думаю, должен сделать это, но я не уверен, почему он не работает должным образом

У меня есть фотография того, как должен выглядеть вывод, но я не знаю, как поделиться им здесь, если кто-нибудь знает, пожалуйста, сообщите мне в комментариях, моя проблема в основном связана с уведомлением о функции воспроизведения, которое заняло 3 место в массиве вы должны продолжать играть с номера 3 только для того, чтобы там был новый указатель

я попытался решить эту проблему, просто перейдя к тому, который нужно было пнуть, и сделав перестановку, чтобы он вернулся, переместив всех остальных вперед, а затем укоротив массив на 1

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

void get_boom_number(int * i){
    printf("enter the boom number
");
    scanf("%d",i);
    return ;
}
#define LENGTH 31

void play(char * players[],int length,int boomnum){
    int count=-1;
     count = (count+boomnum-1)%(length);
    char * temp;
    for (int i = 0; i<30; i++) {
        printf("%d
",count);
        for (int start=count; start<length-1; start++) {
            temp=*(players+start);
            *(players+start)=*(players+start+1);
            *(players+start+1)=temp;
        }
        count=(count+boomnum-1)%(length);
        length=length-1;
    }
    return ;
}
int main()
{
    char * players[LENGTH]={"Tyrion Lannister","Daenerys Targaryen","Jon Snow","Arya Stark","Theon Greyjoy", "Joffrey Baratheon","Khal Drogo","Ted Mosby","Marshall Eriksen","Robin Scherbatsky","Barney Stinson", "Lily Aldrin", "Tracy McConnell", "Ted Mosby", "Leonard Hofstadter","Sheldon Cooper", "Penny", "Howard Wolowitz", "Raj Koothrappali", "Bernadette Rostenkowski-Wolowitz","Amy Farrah Fowler", "Gregory House", "Lisa Cuddy", "James Wilson","Eric Foreman", "Allison Cameron", "Robert Chase" ,"Lawrence Kutner", "Chris Taub","Remy 13 Hadley", "Amber Volakis"};
    int boom_number, i;
    get_boom_number(&boom_number);
    play(players,LENGTH,boom_number);

и затем просто печатая массив, мы также не можем использовать «[]» для дырки.

Всего 1 ответ


Проблема с вашим кодом состоит в том, что count станет отрицательным, если число boomnum например, равно 1. Я не понимаю, почему count инициализируется значением -1 и почему вы вычитаете еще 1 при пересчете count . Ваш код такой же как:

int count = (boomnum-2)%(length);

Опять же, кажется странным вычитать 2. В любом случае, вы должны убедиться, что результат не отрицательный.

Другая проблема заключается в следующем:

    count=(count+boomnum-1)%(length);
    length=length-1;

Это может привести к тому, что count будет равно length в следующей итерации. Я думаю, это не то, что вы хотите. Вам нужно поменять две строки, чтобы избежать этого. Подобно:

    length=length-1;
    count=(count+boomnum-1)%(length);

Выполнение этого и ввод 2 для boom_number приводит к результату:

Remy 13 Hadley

(Странное название кстати).

Я также изменил бы:

for (int i = 0; i<30; i++) {

в

while(length > 1) {

Это плохая идея жестко кодировать количество циклов.

Далее эта строка:

count=(count+boomnum-1)%(length);

тоже проблема. Если boomnum равен нулю, это может снова привести к отрицательному count .


Есть идеи?

10000