【发布时间】:2015-05-12 15:36:10
【问题描述】:
我制作了一个程序,旨在像扫雷游戏一样运行。它被设置为 GridLayout,并且在主代码中有一个名为 getNumberSmall 的递归代码,当单击按钮时运行。它不会递归运行,除非单击的按钮是空白区域(即,如果您曾经玩过扫雷游戏,既不是地雷也不是数字)。单击空白区域时,代码应该在单击的空白按钮周围的按钮上递归运行。但是,当我这样做时,会出现堆栈溢出错误。我应该如何解决这个问题?
public void getNumberSmall(JButton b3){
JButton above = new JButton();
JButton below = new JButton();
JButton right = new JButton();
JButton left = new JButton();
JButton DRight = new JButton();
JButton DLeft = new JButton();
JButton DRightD = new JButton();
JButton DLeftD = new JButton();
JButton clicked = b3;
int myX = (int) clicked.getClientProperty("column");
int myY = (int) clicked.getClientProperty("row");
int mNum = 0;
if(myX < 9){
for(int i = 0; i < small.size(); i++){
if((int) small.get(i).getClientProperty("column") - 1 == myX){
if((int) small.get(i).getClientProperty("row") == myY){
right = small.get(i);
if((int)right.getClientProperty("enabled") == 1){
right = null;
}
}
}
}
}
else{
right = null;
}
if(myX > 1){
for(int i = 0; i < small.size(); i++){
if((int) small.get(i).getClientProperty("column") + 1 == myX){
if((int) small.get(i).getClientProperty("row") == myY){
left = small.get(i);
if((int)left.getClientProperty("enabled") == 1){
left = null;
}
}
}
}
}
else{
left = null;
}
if(myY < 9){
for(int i = 0; i < small.size(); i++){
if((int) small.get(i).getClientProperty("column") == myX){
if((int) small.get(i).getClientProperty("row") - 1 == myY){
below = small.get(i);
if((int)below.getClientProperty("enabled") == 1){
below = null;
}
}
}
}
}
else{
below = null;
}
if(myY > 1){
for(int i = 0; i < small.size(); i++){
if((int) small.get(i).getClientProperty("column") == myX){
if((int) small.get(i).getClientProperty("row") + 1 == myY){
above = small.get(i);
if((int)above.getClientProperty("enabled") == 1){
above = null;
}
}
}
}
}
else{
above = null;
}
if(myY == 9){
DRightD = null;
DLeftD = null;
}
if(myY == 1){
DRight = null;
DLeft = null;
}
if(myX == 9){
DRightD = null;
DRight = null;
}
if(myX == 1){
DLeftD = null;
DLeft = null;
}
if(DRight != null){
for(int i = 0; i < small.size(); i++){
if((int) small.get(i).getClientProperty("column") - 1 == myX){
if((int) small.get(i).getClientProperty("row") + 1 == myY){
DRight = small.get(i);
if((int)DRight.getClientProperty("enabled") == 1){
DRight = null;
}
}
}
}
}
if(DLeft != null){
for(int i = 0; i < small.size(); i++){
if((int) small.get(i).getClientProperty("column") + 1 == myX){
if((int) small.get(i).getClientProperty("row") + 1 == myY){
DLeft = small.get(i);
if((int)DLeft.getClientProperty("enabled") == 1){
DLeft = null;
}
}
}
}
}
if(DRightD != null){
for(int i = 0; i < small.size(); i++){
if((int) small.get(i).getClientProperty("column") - 1 == myX){
if((int) small.get(i).getClientProperty("row") - 1 == myY){
DRightD = small.get(i);
if((int)DRightD.getClientProperty("enabled") == 1){
DRightD = null;
}
}
}
}
}
if(DLeftD != null){
for(int i = 0; i < small.size(); i++){
if((int) small.get(i).getClientProperty("column") + 1 == myX){
if((int) small.get(i).getClientProperty("row") - 1 == myY){
DLeftD = small.get(i);
if((int)DLeftD.getClientProperty("enabled") == 1){
DLeftD = null;
}
}
}
}
}
if(above != null){
if((int) above.getClientProperty("mines") == 1){
mNum = mNum + 1;
}
}
if(below != null){
if((int) below.getClientProperty("mines") == 1){
mNum = mNum + 1;
}
}
if(right != null){
if((int) right.getClientProperty("mines") == 1){
mNum = mNum + 1;
}
}
if(left != null){
if((int) left.getClientProperty("mines") == 1){
mNum = mNum + 1;
}
}
if(DRight != null){
if((int) DRight.getClientProperty("mines") == 1){
mNum = mNum + 1;
}
}
if(DLeft != null){
if((int) DLeft.getClientProperty("mines") == 1){
mNum = mNum + 1;
}
}
if(DRightD != null){
if((int) DRightD.getClientProperty("mines") == 1){
mNum = mNum + 1;
}
}
if(DLeftD != null){
if((int) DLeftD.getClientProperty("mines") == 1){
mNum = mNum + 1;
}
}
if(mNum == 0){
String num2 = "" + mNum;
clicked.setText(num2);
if((above != null) && ((int)above.getClientProperty("enabled") == 0)){
getNumberSmall(above);
above.putClientProperty("enabled", 1);
}
if((below != null) && ((int)below.getClientProperty("enabled") == 0)){
getNumberSmall(below);
below.putClientProperty("enabled", 1);
}
if((right != null) && ((int)right.getClientProperty("enabled") == 0)){
getNumberSmall(right);
right.putClientProperty("enabled", 1);
}
if((left != null ) && ((int)left.getClientProperty("enabled") == 0)){
getNumberSmall(left);
left.putClientProperty("enabled", 1);
}
if((DRight != null) && ((int)DRight.getClientProperty("enabled") == 0)){
getNumberSmall(DRight);
DRight.putClientProperty("enabled", 1);
}
if((DLeft != null) && ((int)DLeft.getClientProperty("enabled") == 0)){
getNumberSmall(DLeft);
DLeft.putClientProperty("enabled", 1);
}
if((DRightD != null) && ((int)DRightD.getClientProperty("enabled") == 0)){
getNumberSmall(DRightD);
DRightD.putClientProperty("enabled", 1);
}
if((DLeftD != null) && ((int)DLeftD.getClientProperty("enabled") == 0)){
getNumberSmall(DLeftD);
DLeftD.putClientProperty("enabled", 1);
}
}
else{
String number = "" + mNum;
clicked.setText(number);
}
}
【问题讨论】:
-
尝试运行你的调试器。您也许能够找出为什么递归不会停止。但如果我不得不猜测,那可能是因为你在调用
getNumberSmall之前调用了putClientProperty。 -
TNT- 你是对的!我切换了 getNumberSmall 和 putClientProperty (在所有这些都将单击的按钮设置为启用之前)并且它有效!谢谢!
标签: java recursion stack-overflow