Я не могу думать, как переместить колонку - PullRequest
0 голосов
/ 15 января 2019

Так что я делаю игру для своей финальной работы, это как "образец игры". Я уже сделал почти весь код, но я не могу найти решение для моей последней функции, функция должна увидеть, если столбец пуст (полон нулей), и если это так, отправить его справа от всех остальных столбцов. вот мой код (все функции должны начинаться с аргументов, которые они имеют, это часть работы) функция, которую я испытываю, называется "colunas":

#include <stdio.h>
#include <stdlib.h>
#include <string.h>//para poder usar char's e strings
#include <stdbool.h>//para poder usar o while true
#include <time.h>//para poder usar seeds diferentes na funçao srand

int marcar(int sz, int tabuleiro[sz][sz], int x, int y)//vai contar o numero de quadrados do grupo
{
  int num=0;
  for (x = 0; x < sz; x++)
  {
    for (y = 0; y < sz; y++)
    {
      if(tabuleiro[x][y] == 9)//os ciclos vao percorrer o tabuleiro e vao verificar os 0s
      {
        num=num+1;//num vai contar o numero de 0s
      }
    }
  }
  return num;//retornar o numero de 0s
}

//pontuacao
int pontuacao(int num_quadrados)
{
  int pontos;
  pontos=(num_quadrados*(num_quadrados + 1))/2;
  return pontos;
}


//gravidade
/*
void gravidade(int sz, int tabuleiro[sz][sz])
{
  for (int i = 0; i < sz+1; i++)
  {
    for (int j = 0; j < sz; j++)
    {
      if (tabuleiro[i][j] == 9)
      {
        tabuleiro[i][j] = tabuleiro[i-1][j];
        tabuleiro[i-1][j] = 9;
      }
    }
  }
}
*/

void gravidade(int sz, int tabuleiro[sz][sz])
{
  int c = 0;
  while(c < sz)//utilizamos esta variavel apra percorrer o ciclo todas as vezes necessarias para fazer todos os 9s subir
  {
    for (int i = 0; i < sz-1; i++)//percorre as linhas
    {
      for (int j = 0; j < sz; j++)//percorre as colunas
      {
        if (tabuleiro[i][j] == 9 && i < sz-1)
        {
          tabuleiro[i][j] = tabuleiro[i+1][j];//muda o valor do zero para o valor acima 
          tabuleiro[i+1][j] = 9;//muda o valor que esta acima do valor copiado, para 0
        }
      }
    }
  c++;
  }
}


//jogada
int jogada(int sz, int tabuleiro[sz][sz], int x, int y)
{
  if((x>=0 && x<sz) && (y>=0  && y<sz))//definimos o limite do x e do y
  {
    int temp = tabuleiro[x][y];
    tabuleiro[x][y] = 9;  //alterar o valor de tabuleiro para impedir as chamadas infinitas da recursividade
    if(tabuleiro[x+1][y] == temp)//para verificar a direita
    {
      jogada(sz, tabuleiro, x+1, y);//chamar a função recursivamente
    }
    if (tabuleiro[x-1][y] == temp)//para verificar a esquerda
    {
      jogada(sz, tabuleiro, x-1, y);
    }
    if (tabuleiro[x][y+1] == temp)//para verificar em cima
    {
      jogada(sz, tabuleiro, x, y+1);
    } if(tabuleiro[x][y-1] == temp)//para verificar em baixo
    {
      jogada(sz, tabuleiro, x, y-1);
    }
  }
  return 0;
}

void troca(int sz, int tabuleiro[sz][sz])//mudar o zero para o proximo ciclo ele nao contar com os zeros da jogada anterior
{
  for (int x = 0; x < sz; x++)
  {
    for (int y = 0; y < sz; y++)
    {
      if(tabuleiro[x][y] == 9)//os ciclos vao percorrer o tabuleiro e vao verificar os 0s
      {
        tabuleiro[x][y] = 0;//vao passar os 9 todos a 0
      }
    }
  }
}

//mover as colunas vazias
int coluna(int sz, int tabuleiro[sz][sz])
{
  //this is the function i cant solve
}

//Mostra o tabuleiro
void mostrar(int sz, int tabuleiro[sz][sz])
{
  for (int i = sz-1; i >= 0; i--)//for para o numero de linhas, usamos o sz-1 pois o indice do array começa no 0 e i>=0 para poder chegar ao indice 0
  {
    for (int j = 0; j < sz; j++) //for para o numero de colunas
    {
      printf("%d", tabuleiro[i][j]); //print das linhas
    }
    printf("\n");//baixar a linha quando chega a coluna n-1
  }
}

//main
int main()
{
  //definição do tabuleiro
  int sz;//size do tabuleiro
  printf("Escolha o valor de n (da matriz n*n):\n");
  scanf("%d", &sz);//scan do size
  printf("\n");
  int tabuleiro[sz][sz];//o size é igual para as colunas como para as linhas pois a matriz é n*n
  srand(time(NULL));//função utilizada para alterar a seed do rand (gerador de valores aleatórios)
  for (int i = 0; i < sz; i++)//for para o numero de linhas, usamos o sz-1 pois o indice do array começa no 0 e i>=0 para poder chegar ao indice 0
  {
    for (int j = 0; j < sz; j++)//for para o numero de colunas
    {
      tabuleiro[i][j] = rand() %4 + 1;//gerar a matriz com valores aleatórios
    }
  } 

  int jx, jy, mx, my, pontos;
  pontos=0;

  while(true)
  {
    for (int i = 0; i < sz; i++)
    {
      for (int j = 0; j < sz; j++)
      {
          mostrar(sz, tabuleiro);
          printf("\n");

          printf("(0,0) e o canto inferior esquerdo\n");
          printf("Escolha o x (lembrando que x = x+1 linhas exemplo x(1) = linha 2):\n");//acontece devido ao índice começar no 0 e não no 1
          scanf("%d", &jx);
          printf("\n");

          printf("Escolha o y (lembrando que y = y+1 colunas exemplo y(1) = coluna 2):\n");//acontece devido ao índice começar no 0 e não no 1
          scanf("%d", &jy);

          if(tabuleiro[jx][jy] != 0) //utilizamos este if para condicionar a posicao pois se escolher 0 ele contava os pontos de todos os zeros juntos
          {
            jogada(sz, tabuleiro, jx, jy);
            printf("\n");

            gravidade(sz, tabuleiro);//assim sempre que uma jogada é executada ele faz a funçao gravidade

            int p = marcar(sz, tabuleiro, mx, my);
            pontuacao(p);

            pontos=pontos+pontuacao(p);

            printf("Pontos:\n");
            printf("%d\n", pontos);
            printf("\n");

            troca(sz, tabuleiro);
          }
          else
          {
            printf("\n");
            printf("Nao e possivel escolher uma posicao onde o valor de tabuleiro[x][y] seja 0\n");
            printf("\n");
          }
      }
    }
  }
}

я надеюсь на помощь, спасибо за потраченное время.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Как насчет этого (комментарии объясняют код):

void coluna(int size, int board[size][size]){
    int not_zeros[size]; // Use to save the index of columns that contain at 
                         // least one number different than zero.
    int i, j;
    for(i=0; i<size; i++){
        not_zeros[i] = -1; //initialize the array.

    for (i=0; i<size; i++){
        int foundNotZero = 0;
        for (j=0; j<size; j++){
            if(board[j][i] != 0){ //line j, column i.
                foundNotZero = 1;
                break;
            }
        }
        if (foundNotZero == 1){ //at least one element of the column i is not zero.
            not_zeros[i] = i;
        }
    }
    int start = 0;
    for(i=0; i<size; i++){
        if (not_zeros[i] >= 0){ //copy column i to column start.
            for(j = 0; j<size; j++){
                board[j][start] = board[j][not_zeros[i]];
            }
            start++; //increment start.
        }
    }
    for(i=start; i<size; i++){
        for(j=0; j<size; j++){
            board[j][i] = 0; //fill the remaining columns with zeros.
        }
    }
}
0 голосов
/ 15 января 2019

Как насчет следующего:

int coluna(int sz, int tabuleiro[sz][sz])
{
    int i, j, k, m;
    i= 0;
    m= sz;
    while (i<m) {
        int allzeroes= 1;
        for (j=0; j<sz; j++) {
            if (tabuleiro[i][j]!=0) {
                allzeroes= 0;
                break;
            }
        }
        if (allzeroes) {    // col i is all zeroes
            // move all remaining cols down 1 col
            for (j=i; j<m-1; j++)
                for (k=0; k<sz; k++)
                    tabuleiro[j][k]= tabuleiro[j+1][k];

            // zero last column
            for (k=0; k<sz; k++)
                tabuleiro[m-1][j]= 0;

            // new last col that is not zero
            m--;
        }
        else i++;
    }
    return 1;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...