import javax.swing.JOptionPane;
public class DividedBy10v2{
public static void main( String[] args ){
int block[][] = new int[3][3];
int DetermineRow = 0; // The variable assigned for counting rows
int DetermineColumn = 0; // The variable assigned for counting columns
int blockRow,blockColumn;
int score = 0;
String inputRow, inputColumn;
//random a set of number
int randomSet[] = new int[100];
for(int i=0;i<randomSet.length;i++){
randomSet[i] = (int) (Math.random() * 9) + 1;
}
int round = 0 ;//for counting the round of the game
while( true ){
++round;
//print out the title and score
System.out.println( "-------------------------" );
System.out.println( "Divided by 10 - Mini Game" );
System.out.printf( "---- Score:%8d ----\n\n", score );
//show game board
System.out.println( " 0 1 2 " );
for(DetermineRow=0;DetermineRow<block.length;DetermineRow++){
System.out.print( DetermineRow + " ");
for(DetermineColumn=0;DetermineColumn<block.length;DetermineColumn++){
if(block[DetermineRow][DetermineColumn]!=0){
System.out.print( block[DetermineRow][DetermineRow] + " " );
}else{
System.out.print( "_ " );
}
}
System.out.println();
}
//display the coming value
System.out.printf( "Coming value : %d > %d > %d \n\n", randomSet[round], randomSet[(round + 1)], randomSet[(round + 2)] );
//check over checking
if(block[0][0]>0&&block[0][1]>0&&block[0][2]>0){
if(block[1][2]>0&&block[1][1]>0&&block[1][2]>0){
if(block[2][0]>0&&block[2][1]>0&&block[2][2]>0){
System.out.println( "------ Game Over ------" );
//continue check
int ContinueCheck = JOptionPane.showConfirmDialog(null, "Do you want to continue ?", "Continue?", JOptionPane.YES_NO_OPTION);
if( ContinueCheck == JOptionPane.YES_OPTION){
//initialize the game board
for(DetermineRow=0;DetermineRow<block.length;DetermineRow++)
for(DetermineColumn=0;DetermineColumn<block.length;DetermineColumn++)
block[DetermineRow][DetermineColumn]=0;
continue;
}else{if(ContinueCheck == JOptionPane.NO_OPTION){
System.out.println( "-------------------------" );
System.out.println("Good Bye !");
break;}
}
}
}
}
//input value
while(true){
inputRow = JOptionPane.showInputDialog( "The number of row you want to put the number" );
blockRow = Integer.parseInt(inputRow);
inputColumn = JOptionPane.showInputDialog( "The number of column you want to put the number" );
blockColumn = Integer.parseInt(inputColumn);
if(blockRow>=block.length || blockRow<0 || blockColumn>=block.length || blockColumn<0){
JOptionPane.showMessageDialog(null , "The block you want to enter the number does not exist." , "Error" , JOptionPane.ERROR_MESSAGE );
continue;
}else{
if(block[blockRow][blockColumn]!=0){
JOptionPane.showMessageDialog(null , "The block you want to enter the number has been entered an number." , "Error" , JOptionPane.ERROR_MESSAGE );
continue;
}else{
block[blockRow][blockColumn] = randomSet[round];
break;
}
}
}
//score got check
int modSumBlock[] = {-1,-1,-1,-1,-1,-1,-1,-1};//to store the remainder of the sum of 3 block
if(block[0][0] != 0 && block[0][1] != 0 && block[0][2] != 0)
modSumBlock[0] = (block[0][0] + block[0][1] + block[0][2]) % 10;
if(block[1][0] != 0 && block[1][1] != 0 && block[1][2] != 0)
modSumBlock[1] = (block[1][0] + block[1][1] + block[1][2]) % 10;
if(block[2][0] != 0 && block[2][1] != 0 && block[2][2] != 0)
modSumBlock[2] = (block[2][0] + block[2][1] + block[2][2]) % 10;
if(block[0][0] != 0 && block[1][0] != 0 && block[2][0] != 0)
modSumBlock[3] = (block[0][0] + block[1][0] + block[2][0]) % 10;
if(block[0][1] != 0 && block[1][1] != 0 && block[2][1] != 0)
modSumBlock[4] = (block[0][1] + block[1][1] + block[2][1]) % 10;
if(block[0][2] != 0 && block[1][2] != 0 && block[2][2] != 0)
modSumBlock[5] = (block[0][2] + block[1][2] + block[2][2]) % 10;
if(block[0][0] != 0 && block[1][1] != 0 && block[2][2] != 0)
modSumBlock[6] = (block[0][0] + block[1][1] + block[2][2]) % 10;
if(block[0][2] != 0 && block[1][1] != 0 && block[2][0] != 0)
modSumBlock[7] = (block[0][2] + block[1][1] + block[2][0]) % 10;
//all 'if' is used for checking if all block in the same row/column/diagonal are filled in number
//counting how many score got and where should be cleared by 8bit (in decimal)
int scoreCount = 0;
for(int n=0;n<8;n++){
if(modSumBlock[n]==0){
score += 10;
scoreCount += (int) Math.pow(2,n);
}else{
continue;
}
}
//start clear game board
if(scoreCount>=128){
block[0][2] = 0;
block[1][1] = 0;
block[2][0] = 0;
scoreCount -= 128;
}
if(scoreCount>=64){
block[0][0] = 0;
block[1][1] = 0;
block[2][2] = 0;
scoreCount -= 64;
}
if(scoreCount>=32){
block[0][2] = 0;
block[1][2] = 0;
block[2][2] = 0;
scoreCount -= 32;
}
if(scoreCount>=16){
block[0][1] = 0;
block[1][1] = 0;
block[2][1] = 0;
scoreCount -= 16;
}
if(scoreCount>=8){
block[0][0] = 0;
block[1][0] = 0;
block[2][0] = 0;
scoreCount -= 8;
}
if(scoreCount>=4){
block[2][0] = 0;
block[2][1] = 0;
block[2][2] = 0;
scoreCount -= 4;
}
if(scoreCount>=2){
block[1][0] = 0;
block[1][1] = 0;
block[1][2] = 0;
scoreCount -= 2;
}
if(scoreCount>=1){
block[0][0] = 0;
block[0][1] = 0;
block[0][2] = 0;
scoreCount -= 1;
}
}
}
}
上面的代码是我制作的一个迷你游戏,它由一个3x3的棋盘组成。整数值范围为1-9,由系统生成并存储在数组中。如果已经使用了所有的值,它将从数组的第一个元素重新启动。在每一轮,接下来的三个数字显示给球员,所以球员知道的价值,不仅将在当前一轮,但也在接下来的两轮。
请注意,游戏板中的每个位置只允许一个值。程序应该检查输入位置是否已经分配。如果是这样的话,应该提示玩家再次输入。在一轮结束时,系统将检查棋盘的三行、三列和两条对角线;如果一组的和可被10整除,则可以将和加到分数中,并且可以将值从棋盘中移除。空槽计算为0,当棋盘满时,游戏结束。
我想简化代码,因为它看起来太混乱和复杂。有没有其他方法缩短代码的方法?我如何也允许玩家从不同大小的棋盘中进行选择(例如,游戏开始时会问玩家是想玩3vs3vs4还是5vs5)?您可以尝试编译代码并玩游戏,看看它是如何工作的。
发布于 2013-11-30 16:24:43
我认为,当我运行您的程序时,文本控制台和swing用户输入的结合会导致糟糕的体验。
实际上,既然您有GUI输入框,为什么我必须键入要输入的行/列?为什么不给我一个按钮网格,我有一个可以添加到网格中的数字,我只需点击数字应该去的地方?
这样的网格操作甚至可能比您放在控制台上的文本输出更容易。
尽管如此,我还是很欣赏这段代码是可运行的,并且可以工作.直到我按下“取消”按钮,代码才会抛出一个NumberFormatException
。
至于代码风格,它看起来非常复杂,有大量的代码重复和“幻数”。改变电网的大小将是非常令人沮丧的.都是硬编码的。
因此,您应该设置一个常量,例如“网格大小”,并在许多地方使用它:
final int gridsize = 3;
然后你可以修复很多你有神奇数字的地方:
int block[][] = new int[gridsize][gridsize];
....
randomSet[i] = (int) (Math.random() * gridsize * gridsize) + 1;
诸若此类。
展示-游戏板将成为某种形式的循环:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < gridsize; i++) {
sb.append(String.format("%4d", i));
}
而且,使用大写字母的变量名也不是很好的java编码约定.这句话:
for(DetermineRow=0;DetermineRow<block.length;DetermineRow++){ ....
对Java的“常客”来说是非常讨厌的。对于像这样的小循环,一些简单的东西,比如:
for (int row = 0; row < gridsize; row++) { ...
会更容易理解。注意,我在for循环(int row = 0
)中声明了行变量。这是在for循环中定义变量的正常方法。它不是必需的,但当循环变量完全包含在循环中时,它实际上会导致更少的错误.(即row
在循环之外不可见)。
现在,在那个显示循环中,因为你有复杂的名字,所以很难看到.这是你的代码:
for(DetermineRow=0;DetermineRow<block.length;DetermineRow++){
System.out.print( DetermineRow + " ");
for(DetermineColumn=0;DetermineColumn<block.length;DetermineColumn++){
if(block[DetermineRow][DetermineColumn]!=0){
System.out.print( block[DetermineRow][DetermineRow] + " " );
}else{
System.out.print( "_ " );
}
}
System.out.println();
}
我只会重命名你的变量..。我们可以更容易地看到一个bug:
for(row=0;row<block.length;row++){
System.out.print( row + " ");
for(column=0;column<block.length;column++){
if(block[row][column]!=0){
System.out.print( block[row][row] + " " );
}else{
System.out.print( "_ " );
}
}
System.out.println();
}
你现在能看到窃听器了吗?
System.out.print( block[row][row] + " " );
应:
System.out.print( block[row][column] + " " );
同样,由于游戏检查中有复杂的if-语句,因此还有另一个bug:
if(block[0][0]>0&&block[0][1]>0&&block[0][2]>0){
if(block[1][2]>0&&block[1][1]>0&&block[1][2]>0){
if(block[2][0]>0&&block[2][1]>0&&block[2][2]>0){
在第二行中,应该是0(我用‘^’标记了位置):
if(block[0][0]>0&&block[0][1]>0&&block[0][2]>0){
if(block[1][2]>0&&block[1][1]>0&&block[1][2]>0){
^
if(block[2][0]>0&&block[2][1]>0&&block[2][2]>0){
使用循环(最好是在一种方法中)会更好:
private static final boolean isComplete(int[][] grid) {
for (int row = 0; row < grid.length; row++) {
for (int col = 0; col < grid[row].length; col++) {
if (grid[row][col] == 0) {
return false;
}
}
}
return true; // all celss have values.
}
然后,你可以打电话给:
//check over checking
if(isComplete(block)){
int ContinueCheck = JOptionPane.showConfirmDialog(null, "Do you want to continue ?", "Continue?", JOptionPane.YES_NO_OPTION);
if( ContinueCheck == JOptionPane.YES_OPTION){
...
continue;
}else if(ContinueCheck == JOptionPane.NO_OPTION) {
System.out.println( "-------------------------" );
System.out.println("Good Bye !");
break;
}
}
注意,在这一点上,我从来没有引用网格的实际大小为3.?因此,到目前为止,我更改的所有代码都将用于任何大小的网格.
最后的部分,就是得到分数……这个部分有点挑战性,但是,可以用几个循环来完成.首先,int modSumBlock[] = {-1,-1,-1,-1,-1,-1,-1,-1}
是另一个“幻数”(8),应该是:
int modSumBlock[] = new int[gridsize + gridsize + 2]; // rows, columns, and diagonals
那么你的循环是:
for (int row = 0; row < gridsize; row++) {
modSumBlock[ 0 + row] = getRowScore(block, row);
}
for (int col = 0; col < gridsize; col++) {
modSumBlock[gridsize + col] = getColumnScore(block, col);
}
modSumBlock[gridsize + gridsize] = getSlashDiagonalScore(block);
modSumBlock[gridsize + gridsize + 1] = getBackslashDiagonalScore(block);
此时,你应该对你应该做的其他改变有一些想法.
玩得开心!
https://codereview.stackexchange.com/questions/36409
复制相似问题