我设计的游戏类似于Android中的灯光,用户可以按下给定的5 * 5网格中的任何按钮。假设我们只有2 * 2网格可以轻松理解。因此,当用户按下按钮时,按钮(向上,向右,向左,向下)和本身按钮将切换(如果打开则关闭,如果关闭则打开)。另外我想改变Button的颜色(如果是绿色则是黑色,如果是黑色然后是绿色)GREEN = ON和BLACK = OFF。
我正在思考的逻辑是按下每个按钮(OnClick)。
if(button1 is pressed)
then if(button1==ON) then button1=OFF else button1=ON ;
if(button1==ON) then GREEN else BLACK ;
if(button2==ON) then button2=OFF else button2=ON;
if(button2==ON) then GREEN else BLACK ;
if(button3==ON) then button3=OFF else button3=ON;
if(button3==ON) then GREEN else BLACK ;
similarly for button 4
if(button4 is pressed)
then if(button4==ON) then button4=OFF else button4=ON ;
if(button1==ON) then GREEN else BLACK ;
if(button2==ON) then button2=OFF else button2=ON;
if(button2==ON) then GREEN else BLACK ;
if(button3==ON) then button3=OFF else button3=ON;
if(button3==ON) then GREEN else BLACK ;
similarly for all
但它不是动态的所以如果我将网格更改为5 * 5,那么我必须再次更改为逻辑。
是否有任何身体比上面的愚蠢想法有更好的主意?还应该是动态的,这样我也可以工作6 * 6网格?
由于
答案 0 :(得分:3)
你应该有一个模型,用于存储二维布尔数组中每个灯的状态。所以这些将是您LightsOut
类的实例方法。
public static final int GRID_SIZE = 5;
boolean[][] lights = new boolean[GRID_SIZE][GRID_SIZE];
然后你应该有一个开灯或关灯的方法,但只有在给出的坐标有效的情况下。
public void toggleLight(int row, int column) {
if (row >= 0 && row < GRID_SIZE && column >= 0 && column < GRID_SIZE) {
lights[row][column] = ! lights[row][column];
}
}
您需要一种方法来处理实际点击,这可能看起来像这样。
public void click(int row, int column) {
toggleLight(row, column);
toggleLight(row + 1, column);
toggleLight(row - 1, column);
toggleLight(row, column + 1);
toggleLight(row, column - 1);
}
这就是模型。然后你需要在其上构建一个视图,实际检测点击次数,显示灯光,找出绿色和黑色等等。
答案 1 :(得分:0)
有些事情可以让这项任务变得更容易:
将按钮名称设置为有意义的行/列名称。这样,如果按下按钮(1,1),则需要检查按钮(1,1),(1,2),(2,1)等。这样,您可以通过创建检查行/列上的上一个和下一个方块的方法来动态检查所有相邻按钮。
不是检查按钮是否打开然后分配开启或关闭(因为这会使您的程序有点不可读),您可以简单地将开启和关闭分配为true / false并执行button = !button
。这使得按钮变量的逻辑值被反转。