Алгоритм самой большой / самой маленькой чашки бобов в C - легкая игра - PullRequest
0 голосов
/ 25 февраля 2019

Я делаю мини-проект для школы, игра состоит из четного набора чашек, X, каждая с бобами x1, x2, ... внутри каждой чашки.Есть два игрока, Белла и Алекс.Алекс всегда берет чашку с большим количеством бобов.Белла в своей первой игре берет ту с меньшим количеством бобов, вторая играет с чашкой с большим количеством бобов, третья с меньшим количеством бобов и так далее ... Они могут просто взять первую или последнюю чашку сета.Алекс всегда начинается первым.Тот, кто выиграет больше всех бобов, выиграет.

For Example: X = 4, with x1 = 1, x2 = 2, x3 = 3, x4 = 4.
Alex takes x4, A = 4. 
-> X = 3, with x1 = 1, x2 = 2, x3 = 3.
Bella takes x1 = 1, B = 1. (first play, takes the smallest)
-> X = 2, with  x1 = 2, x2 = 3.
Alex takes x2, A = 4 +3 = 7.
-> X = 1, with  x1 = 2.
Bella takes x1, B = 1+2 = 3.

Итак, Алекс выигрывает с 7 бобами против 3 бинов Беллы.

У меня есть код, все хорошо, но во второй игре Алексаон получает 8 вместо 7. Вы можете мне помочь?Montinhos [] представляет массив x1, x2, x3, x4 ...

Спасибо.PS - опция gcc: gcc -std = c99 -Wall $ file -lm

#include <stdio.h>
int i, j, z, n, A, B, jogada = 1;
void alex(int *n, int montinhos[]);
void bella(int *n, int montinhos[]);

int main(void)
{

do
{
  printf("Number of cups: ");
  scanf("%d", &n);
} while(n < 2 || n > 100 || n % 2 != 0);

int montinhos[n];

for (i = 0; i < n; ++i)
    scanf("%d", &montinhos[i]);

for (j = 0; j < n / 2; ++j)
{ //play while there are cups
  alex(&n, montinhos);
  printf("Temp Alex %d\n", A);
  bella(&n, montinhos);
  printf("Temp Bella %d\n", B);
}

if (A > B)
{
  printf("Alex wins with %d against %d\n", A, B);
}
else if (B < A)
{
  printf("Bella wins with  %d against %d\n", B, A);
}
else
{
  printf("Alex e Bella tie with %d\n", A);
}

return 0;
}


void bella(int *n, int montinhos[])
{
  if (*n==1) //if there's only 1 cup
  {
    B += montinhos[0];
    *n--;
  }
  else if (jogada % 2 != 0) //first/uneven play - takes the smallest cup
  {
    if(montinhos[0] < montinhos[*n - 1])
    {
      B += montinhos[0];
      for (z = 0; z < *n - 1; ++z)
           montinhos[z] = montinhos[z+1];
      *n--;
    }
    else if(montinhos[0] > montinhos[*n - 1])
    {
      B += montinhos[*n - 1];
      for (z = *n - 1; z < *n - 1; ++z)
           montinhos[z] = montinhos[z+1];
      *n--;
    }
  }
  else //if second/.../even play, takes the biggest cup
  {
    if(montinhos[0] > montinhos[*n - 1])
    {
      B += montinhos[0];
      for (z = 0; z < *n - 1; ++z)
           montinhos[z] = montinhos[z+1];
      *n--;
    }
    else if(montinhos[0] < montinhos[*n - 1])
    {
      B += montinhos[*n - 1];
      for (z = *n - 1; z < *n - 1; ++z)
           montinhos[z] = montinhos[z+1];
      *n--;
    }
  }
}



void alex(int *n, int montinhos[])
{
  //if left cup is bigger
  if(montinhos[0] > montinhos[*n - 1])
  {
    A += montinhos[0];
    for (z = 0; z < *n - 1; ++z)
         montinhos[z] = montinhos[z+1];
    *n--;

  }
  else if (montinhos[0] < montinhos[*n - 1])
  {
    A += montinhos[*n - 1];
    for (z = *n - 1; z < *n - 1; ++z)
         montinhos[z] = montinhos[z+1];
    *n--;
  }

}

1 Ответ

0 голосов
/ 25 февраля 2019

После проверки вашего кода, я понял, что все ваши переменные глобальные (плохой стиль, но не ошибка).Сводка изменений:

  • Поскольку n является глобальной переменной, ее не нужно передавать в качестве параметра функциям.Я удалил параметр из функций bella и alex.
  • Ваш цикл для подсчета количества оставшихся чашек был неверным.Он был основан на j < n/2.Я изменил его на while(n).

#include <stdio.h>
int i, j, z, n, A, B, jogada = 1;
void alex(int montinhos[]);
void bella(int montinhos[]);

int main(void)
{
    do
    {
        printf("Number of cups: ");
        scanf("%d", &n);
    } while(n < 2 || n > 100 || n % 2 != 0);

    int montinhos[n];

    for (i = 0; i < n; ++i)
        scanf("%d", &montinhos[i]);

    while(n)
    { //play while there are cups
      alex(montinhos);
      printf("Temp Alex %d\n", A);
      bella(montinhos);
      printf("Temp Bella %d\n", B);
    }

    if (A > B)
    {
        printf("Alex wins with %d against %d\n", A, B);
    }
    else if (B < A)
    {
        printf("Bella wins with  %d against %d\n", B, A);
    }
    else
    {
        printf("Alex e Bella tie with %d\n", A);
    }

    return 0;
}

void bella(int montinhos[])
{
  if (n==1) //if there's only 1 cup
  {
    B += montinhos[0];
    n--;
  }
  else if (jogada % 2 != 0) //first/uneven play - takes the smallest cup
  {
    if(montinhos[0] < montinhos[n - 1])
    {
      B += montinhos[0];
      for (z = 0; z < n - 1; ++z)
           montinhos[z] = montinhos[z+1];
      n--;
    }
    else if(montinhos[0] > montinhos[n - 1])
    {
      B += montinhos[n - 1];
      for (z = n - 1; z < n - 1; ++z)
           montinhos[z] = montinhos[z+1];
      n--;
    }
  }
  else //if second/.../even play, takes the biggest cup
  {
    if(montinhos[0] > montinhos[n - 1])
    {
      B += montinhos[0];
      for (z = 0; z < n - 1; ++z)
           montinhos[z] = montinhos[z+1];
      n--;
    }
    else if(montinhos[0] < montinhos[n - 1])
    {
      B += montinhos[n - 1];
      for (z = n - 1; z < n - 1; ++z)
           montinhos[z] = montinhos[z+1];
      n--;
    }
  }
}



void alex(int montinhos[])
{
  //if left cup is bigger
  if(montinhos[0] > montinhos[n - 1])
  {
    A += montinhos[0];
    for (z = 0; z < n - 1; ++z)
         montinhos[z] = montinhos[z+1];
    n--;

  }
  else if (montinhos[0] < montinhos[n - 1])
  {
    A += montinhos[n - 1];
    for (z = n - 1; z < n - 1; ++z)
         montinhos[z] = montinhos[z+1];
    n--;
  }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...