2017-06-18 74 views
0

我正在研究这个程序,它是模拟网格拼图。 Grid就像Rubik's Cube的二维版本。以下是这个难题的标准:修复2D魔方的旋转难题

  • 6×6栅格
  • 2面
  • 使用者可旋转的列和行
  • 旋转是180度
  • 包括两种颜色

注:我使用'*'星号表示黑色,'o'表示白色。

用户输入边(顶部,底部,左边或右边)和他们想要旋转的列或行的数量,模拟将模拟移动。 请看看网格:enter image description here

当用户旋转时,颜色会变成相反的颜色,并根据旋转改变位置。

我已经完成了大部分工作,除了轮换。当用户输入侧面和行/列号时,只有颜色反转,颜色的位置不正确。

这里是旋转的例子:enter image description here

能否请你帮我,这样的旋转正常工作。 非常感谢。

这是我的班级代码。

// Library Files 
using namespace std; 
# include <iostream> // input and output 

#ifndef G_R_I_D 
#define G_R_I_D 

class grid 
{ 
public: 
    int input();          // side and num 
    int flipTop(); 
    int flipBottom(); 
    int flipRight(); 
    int flipLeft(); 
    void initBoard();         // Create blank board 
    void printBoard();         // print board 

private: 
    char board [6][6];         // board 
    int num;           // number of rows/ columns from side 
}; 

/****************** 
*Member Definition* 
******************/ 
int grid::input() 
{ 
    cout << "# of Rows /Columns: ";      // Indicates num of rows or columns 
    cin >> num; 
} 

int grid::flipRight() 
{ 
    num = 6 - num;          // Match input to correct array ex. if right 2, actual array is 4 
    for(num; num < 6; num++)       // Because bottom contains the y axis arrays 3, 4, 5, count up in sequence 
    { 
     for(int i = 0; i < 6; i++) 
     { 
      if (board[i][num] == 'o') 
      { 
       board[i][num] = '*'; 
      } 


      else if (board[i][num] == '*') 
      { 
       board[i][num] = 'o'; 
      } 
     } 
    } 
} 

int grid::flipLeft() 
{ 
    num = num - 1;          // If between arrays 0-2, subtract one from input because first array is 1 
    for(num; num >= 0; num--)       // Because bottom contains the y axis arrays 0, 1, 2, count down in sequence 
    { 
     for(int i = 0; i < 6; i++) 
     { 
      if (board[i][num] == 'o') 
       board[i][num] = '*'; 

      else if (board[i][num] == '*') 
       board[i][num] = 'o'; 
     } 
    } 
} 

int grid::flipTop() 
{ 
    num = num - 1;          // If between arrays 0-2, subtract one from input because first array is 1 
    for(num; num >= 0; num--)       // Because bottom contains the y axis arrays 0, 1, 2, count down in sequence 
    { 
     for(int i = 0; i < 6; i++) 
      if (board[num][i] == 'o') 
       board[num][i] = '*'; 

      else if (board[num][i] == '*') 
       board[num][i] = 'o'; 
    } 
} 

int grid::flipBottom() 
{ 
    num = 6 - num;          // Match input to correct array ex. if right 2, actual array is 4 
    for(num; num < 6; num++)        // Because bottom contains the y axis arrays 3, 4, 5, count up in sequence 
    { 
     for(int i = 0; i < 6; i++) 
      if (board[num][i] == 'o') 
       board[num][i] = '*'; 

      else if (board[num][i] == '*') 
       board[num][i] = 'o'; 
    } 
} 

void grid::initBoard()        // Goes through each 36 array starting with 0,0 
{ 
    for(int y = 0; y < 6; y++)       // columns 
    { 
     for (int x = 0; x < 6; x++)      // rows 
     { 
      board[y][x] = 'o';       // assign each array to the char 'o' 
     } 
    } 
} 

void grid::printBoard() 
{ 
    for (int y = 0; y < 6; y++)       // Defining y axis (wait until x axis arrays have printed to continue to next column) 
    { 
     for (int x = 0; x < 6; x++)      // Defining x axis (once row is finished, proceed to next column) 
     { 
      cout << ' ' << board[y][x] << ' ';   // Place space between each character 
     } 
     cout << endl << endl;       // New line, next row 
    } 
} 

#endif // G_R_I_D 


/* 
+---+---+---+---+---+---+ 
|0,0|0,1|0,2|0,3|0,4|0,5| 
+---+---+---+---+---+---+ 
|1,0|1,1|1,2|1,3|1,4|1,5| 
+---+---+---+---+---+---+ 
|2,0|2,1|2,2|2,3|2,4|2,5| 
+---+---+---+---+---+---+ 
|3,0|3,1|3,2|3,3|3,4|3,5| 
+---+---+---+---+---+---+ 
|4,0|4,1|4,2|4,3|4,4|4,5| 
+---+---+---+---+---+---+ 
|5,0|5,1|5,2|5,3|5,4|5,5| 
+---+---+---+---+---+---+ 
*/ 

这里是我的C++文件,它运行的类。

// Library Files 
using namespace std; 
# include <iostream> 
# include "grid.h" 

// Start of main function 
int main() 
{ 

    // Variables 
    char side; 
    grid gridBoard; 
    // Introduction 
    cout << "Grid\n Instructions: This program is a simulation of the puzzle Grid. The Grid grid has four sides and each \n" 
     << "side has three rows or columns. To twist a side, enter the side you want to turn and the number of rows or columns. \n" 
     << "Sides:\n- (T)op \n- (B)ottom \n- (R)ight \n- (L)eft\n- (E)xit \nColumns/Rows: 1-3\n\n"; 

    // Initialize 
    gridBoard.initBoard(); 

    //Rotations 
    do 
    { 
     gridBoard.printBoard(); 
     cout << "Side: "; 
     cin >> side; 
     gridBoard.input(); 
     switch (toupper(side)) 
     { 
     case 'T': 
      gridBoard.flipTop(); 
      break; 
     case 'B': 
      gridBoard.flipBottom(); 
      break; 
     case 'R': 
      waffleBoard.flipRight(); 
      break; 
     case 'L': 
      gridBoard.flipLeft(); 
      break; 
     case 'E': 
      cout << "Simulation will exit."; 
      break; 
     default: 
      cout << "Invalid input, please try again.\n\n"; 
      break; 
     } 
    } 
    while (side != 'E'); 

    return 0; 
} 
+0

在正确的旋转示例中,您是否实际上旋转了3个顶部行而不是2个?否则我不明白这个例子 –

回答

0

最简单的方法是认识到,旋转的阵列180度是一样的,在列方向上一次的行方向和一次翻转阵列。所以,请执行下列操作步骤:

  1. 获取由用户选择从板阵列
  2. 做你的反转操作
  3. 翻转的行方向
  4. 翻转子子阵列的子阵列阵列在列方向上
  5. 复制子阵列回板阵列

对于可以使用临时数组翻页操作。顺便说一句,我在这里称它为数组,但是您可能想要查看std :: array以更轻松地处理数据。在那里你可以使用迭代器和交换功能。