首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想不出该如何移动栏目

问我想不出该如何移动栏目
EN

Stack Overflow用户
提问于 2019-01-15 23:47:57
回答 2查看 64关注 0票数 0

所以我正在为我的最终作品制作一个游戏,它就像是“样本游戏”。我已经编写了几乎所有的代码,但是我找不到最后一个函数的解决方案,该函数必须检查列是否为空(充满零),如果是,则将其发送到所有其他列的右侧。这是我的代码(所有的函数都必须以它们的参数开头,这是工作的一部分)我遇到问题的函数叫做"colunas":

代码语言:javascript
复制
#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");
          }
      }
    }
  }
}

我希望能得到帮助,谢谢你花了这么长时间。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-16 22:34:41

这样如何(注释解释代码):

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2019-01-16 00:13:04

下面的内容如何:

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54202271

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档