2012-04-25 91 views
0

嘿,大家我正在创建一个使用4x4 2D阵列的记忆游戏。记忆游戏随机颜色

我有4x4用0-7的一对整数填充,它们是随机分散的。我想为每个对分配一个颜色,所以当鼠标点击该方块时,分配的颜色将基于该整数出现,您将不得不根据其相应的匹配颜色找到另一个整数。 我一直在遇到这个setColor方法的一些问题。我将包括我的整个代码,以防其他地方混乱,这就是为什么。目前,如果我点击每个广场,一旦我使用了我分配了两次的所有8种颜色,但其中一些颜色与另一个区块上的相同整数所在的位置不匹配。同样,当我多次点击同一个瓷砖时,它会在2-3种颜色之间变化,我不确定我做错了什么。

我需要建议的部分是我已经分配的setColor方法和我的逻辑。

/*Sets the background of your memory board to black*/ 
public void init() 
{ 
    setSize(400,400); 
    setBackground(Color.BLACK); 
    buildBoard(4); 

} 
/*This is main in java applets 
    You may need to add (not 
    change) a couple things in this method 
*/ 
public void paint(Graphics canvas) 
{ 
    if(firstRun) //for the first run we need to build our random board 
    { 

     print2DArray(board); 
     buildBoard(4); 
     firstRun = false; 
    } 
    else // once our board is built we will display the game 
    { 
     displayGame(canvas); 
     if (mouseClicked) // if the mouse has been clicked 
     { 
      displayHit(canvas);//find which box the user clicked 
      mouseClicked = false; 
     } 
    } 
} 

/* 
    DO NOT change this method 
    determines if the mouse has been pressed 
    sets x and y Mouse to the location of the mouse arrow 
    redraws the image 
*/ 
public boolean mouseDown(Event e, int x, int y) 
{ 
    mouseClicked = true; 
    xMouse = x; 
    yMouse = y; 
    repaint(); 
    return true; 
} 

/*DO NOT change this method 
    redraws the scene 
*/ 

public void update (Graphics g) 
{ 
    paint(g); 
} 

/* 
    pre: none 
    post: build an array that holds the memory values for a board of size x size 
    the board will hold two of each int from 0 to size randomly placed in the array 
*/ 

public static void fillRect(Graphics g, int x, int y, int width, int length) 
{ 
    g.setColor(Color.BLACK); 
    width = 100; 
    length = 100; 
    x = (int)xMouse/100; 
    y = (int)yMouse/100;   
} 

public void buildBoard(int s) 

{ 
    int a = 4; 
    for (int row = 0; row < a; row++) 
     for (int column = 0; column < a; column++) 
     { 
      board[row][column] = count++ % 8; 
     } 
    for(int row = 0; row < 4; row++) 

     for(int column = 0; column < 4; column ++) 
     { 
      int x = (int)Math.floor(Math.random()*4); 
      int y = (int)Math.floor(Math.random()*4); 
      temp = board[row][column]; 
      board[row][column] = board[x][y]; 
      board[x][y] = temp; 


     } 
} 
public static void print2DArray(int[][] arr) 
{ 
    for (int row = 0; row < arr.length; row++) 
    { 
     for (int col = 0; col < arr[row].length; col++) 
     { 
      System.out.print(arr[row][col] + " "); 
     } 
     System.out.println(); 
    } 
} 





public void displayGame(Graphics canvas) 
{ 
    canvas.setColor(Color.WHITE); 

    for(int i =0; i < 400; i+= WIDTH) 
     for(int j = 0; j < 400; j+= WIDTH) 
      canvas.drawRect(i, j, WIDTH, WIDTH); 
} 

/* 
    Pre: xMouse and yMouse have been initialized 
    Post: A circle is displayed in the correct box on the screen 
    Currently the circle is displayed at the mouse location 
*/ 
public void displayHit(Graphics g) 
{ 

    /*int xGuess = (int)xMouse/100; 
    int yGuess = (int)yMouse/100; 
    board[xGuess][yGuess] = guess1; 
    int xGuess2 = (int)xMouse/100; 
    int yGuess2 = (int)yMouse/100; 
    board[xGuess2][yGuess2] = guess2; 

    if (guess1 == guess2) 
    { 
     setColor(g); 
     centerHit(xMouse, yMouse); 
     g.fillOval(xMouse, yMouse, 40, 40); 
    } 
    else 
    g.fillRect(guess1, guess2, width, length); 
    g.setColor(Color.BLACK);*/ 
    setColor(g); 
    centerHit(xMouse, yMouse); 
    g.fillOval(xMouse, yMouse, 40, 40); 
} 

public void setColor(Graphics g) 
{ 

    centerClick(x1,y1);  
    //int x = xMouse; 
    //int y = yMouse; 
    colorIndex = board[row][column]; 
    board[row][column] = board[x1][y1]; 
    board[x1][y1] = colorIndex; 


    switch(colorIndex) 
    { 
    case 0: g.setColor(Color.RED); 
    break; 
    case 1: g.setColor(Color.GREEN); 
    break; 
    case 2: g.setColor(Color.BLUE); 
    break; 
    case 3: g.setColor(Color.ORANGE); 
    break; 
    case 4: g.setColor(Color.CYAN); 
    break; 
    case 5: g.setColor(Color.MAGENTA); 
    break; 
    case 6: g.setColor(Color.PINK); 
    break; 
    case 7: g.setColor(Color.YELLOW); 
    break; 
    } 

} 
public void centerHit(int centerX, int centerY) 
{ 
    { 
     if ((xMouse > 0) && (xMouse <=100)) 
      xMouse = 33; 
     else if ((xMouse > 100) && (xMouse <=200)) 
      xMouse = 133; 
     else if ((xMouse > 200) && (xMouse <=300)) 
      xMouse = 233; 
     else if ((xMouse > 300) && (xMouse <=400)) 
      xMouse = 333; 
    } 
    { 
     if ((yMouse > 0) && (yMouse <=100)) 
      yMouse = 33; 
     else if ((yMouse > 100) && (yMouse <=200)) 
      yMouse = 133; 
     else if ((yMouse > 200) && (yMouse <=300)) 
      yMouse = 233; 
     else if ((yMouse > 300) && (yMouse <=400)) 
      yMouse = 333; 
    } 
} 
public void centerClick(int centerX, int centerY) 
{ 
    { 
     if ((xMouse > 0) && (xMouse <=100)) 
      x1 = 0; 
     else if ((xMouse > 100) && (xMouse <=200)) 
      x1 = 1; 
     else if ((xMouse > 200) && (xMouse <=300)) 
      x1 = 2; 
     else if ((xMouse > 300) && (xMouse <=400)) 
      x1 = 3; 
    } 
    { 
     if ((yMouse > 0) && (yMouse <=100)) 
      y1 = 0; 
     else if ((yMouse > 100) && (yMouse <=200)) 
      y1 = 1; 
     else if ((yMouse > 200) && (yMouse <=300)) 
      y1 = 2; 
     else if ((yMouse > 300) && (yMouse <=400)) 
      y1 = 3; 
    } 
} 

}

+0

林不知道什么youre试图用三行代码,继承人什么,我想'colorIndex =板[行] [列]做;'您选择阅读一些细胞的颜色,不知道哪个单元格cuz我没有看到'列'或'行'价值的变化。 'board [row] [column] = board [x1] [y1];'在我看来,像你在改变原版,我不认为这是你想要的,而board [x1] [y1] = colorIndex;'assign最后单击单元格颜色点击单元格... mmmh,请解释这三行_clearly_ – jambriz 2012-04-25 20:30:19

+0

@jambriz板最初读取0-7并重复0-7为最后两行。我混合了行和列来随机化数字。这三行代码是我尝试使用鼠标点击器在4x4 2D阵列上选择一个块。然后使用xindex和yindex,并在板[row] [column]的那一点找到相应的数组值。然后,我将在刚才通过switch语句点​​击的索引处设置该值,以便根据它的整数值 – user1215307 2012-04-25 20:39:11

回答

2

这个代码

colorIndex = board[row][column]; 
    board[row][column] = board[x1][y1]; 
    board[x1][y1] = colorIndex; 

不断从改变颜色,改变

colorIndex = board[x1][y1]; 

色彩匹配问题是因为您选择建设板两次:第一次在paint方法的第一次运行中,您可以在其中打印阵列,然后在init方法,其中板被覆盖,让你看到不同的价值观

解决这个问题,你应该在init方法搭板只有一次,并呼吁print2DArray事后检查,所以

buildBoard(4); 
print2DArray(board); //<-- add this line to verify colors 

,你可以省略firstRun标志和所有关联的代码。

评论或删除此代码:

/*if(firstRun) //for the first run we need to build our random board 
    { 
     print2DArray(board); 
     buildBoard(4); 


     firstRun = false; 
    } 
    else // once our board is built we will display the game 
    {*/ 
+0

确定任何颜色,以便帮助解决我的一个问题。它可以防止每次点击多个颜色变化,但我的整数和指定的颜色不匹配,我不知道为什么 – user1215307 2012-04-25 20:57:01

+0

你也可以解释board [x1] [y1] = colorIndex vs colorIndex = board [x1 ] [y1] = colorIndex; – user1215307 2012-04-25 20:57:38

+0

你如何检查它们是否匹配?他们似乎匹配我,无论如何尝试改变'colorIndex = board [x1] [y1];''colorIndex = board [y1] [x1];'看看你想要什么 – jambriz 2012-04-25 21:06:39