sandalwood sandalwood - 3 months ago 13
Java Question

Carrying over static variable

I am trying to setup a Minesweeper game however I am having problems carrying over the new 'v' int into the board file. Below is a list of things I have done.I hope what I have said below makes sense, the original minesweeeper base game code can be found at the bottom of this.


  • Made an Easy.java file that contains:



import java.util.Scanner;

public class Easy{
public static int b;

public static void setVariable(int s)
{
b = s;
}

public static int getVariable()
{
return b;
}
}



  • Added a public static int to the top of Mines.java (under

    private final int FRAME_HEIGHT = 290;



)


  • Added to the main method withing the public void run of the Mines.java file:

    System.out.println("Please enter number for difficulty");
    System.out.println("1: Easy 2: Medium 3: Hard");
    Scanner kb = new Scanner(System.in);
    int difficulty = kb.nextInt();
    System.out.println("Difficulty set to: " + difficulty);
    if(difficulty==1){
    Easy.setVariable(40);
    v = Easy.getVariable();
    System.out.println(v);
    System.out.println("Easy mode chosen");
    }

  • I am just unsure on how to link the Board.java file to take the value of 'v' I have tried

    int N_MINES = Mines.v;



However it doesn't see any value I set in the above piece of code however if I set v to equal a number it see's this. In the previous code where I do "System.out.println(v);" it prints out the correct variable however the Board.java does not see this number. How am I supposed to go about this?

Board.java:

import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import java.util.Random;
import java.util.*;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Board extends JPanel {

private final int NUM_IMAGES = 13;
private final int CELL_SIZE = 15;

private final int COVER_FOR_CELL = 10;
private final int MARK_FOR_CELL = 10;
private final int EMPTY_CELL = 0;
private final int MINE_CELL = 9;
private final int COVERED_MINE_CELL = MINE_CELL + COVER_FOR_CELL;
private final int MARKED_MINE_CELL = COVERED_MINE_CELL + MARK_FOR_CELL;

private final int DRAW_MINE = 9;
private final int DRAW_COVER = 10;
private final int DRAW_MARK = 11;
private final int DRAW_WRONG_MARK = 12;

int N_MINES = Mines.v;

private int N_ROWS = 16;
private int N_COLS = 16;

private int[] field;
private boolean inGame;
private int mines_left;
private Image[] img;

private int all_cells;
private JLabel statusbar;


public Board(JLabel statusbar) {

this.statusbar = statusbar;

img = new Image[NUM_IMAGES];

for (int i = 0; i < NUM_IMAGES; i++) {
img[i] = (new ImageIcon(i + ".png")).getImage();
}

setDoubleBuffered(true);

addMouseListener(new MinesAdapter());
newGame();
}


private void newGame() {

Random random;
int current_col;


int i = 0;
int position = 0;
int cell = 0;
/*
System.out.println("Please enter number for difficulty");
System.out.println("1: Easy 2: Medium 3: Hard");
Scanner kb = new Scanner(System.in);
int difficulty = kb.nextInt();
System.out.println("Difficulty set to: " + difficulty);

if(difficulty==1){
N_MINES=N_MINES*1;
System.out.println("Easy mode chosen");

}

if(difficulty==2){
N_MINES=N_MINES*2;
System.out.println("Medium mode chosen");
}

if(difficulty==3){
N_MINES=N_MINES*3;
System.out.println("Hard mode chosen");
}
*/
random = new Random();
inGame = true;
mines_left = N_MINES;

all_cells = N_ROWS * N_COLS;
field = new int[all_cells];

for (i = 0; i < all_cells; i++)
field[i] = COVER_FOR_CELL;

statusbar.setText(Integer.toString(mines_left));


i = 0;
while (i < N_MINES) {

position = (int) (all_cells * random.nextDouble());

if ((position < all_cells) &&
(field[position] != COVERED_MINE_CELL)) {


current_col = position % N_COLS;
field[position] = COVERED_MINE_CELL;
i++;

if (current_col > 0) {
cell = position - 1 - N_COLS;
if (cell >= 0)
if (field[cell] != COVERED_MINE_CELL)
field[cell] += 1;
cell = position - 1;
if (cell >= 0)
if (field[cell] != COVERED_MINE_CELL)
field[cell] += 1;

cell = position + N_COLS - 1;
if (cell < all_cells)
if (field[cell] != COVERED_MINE_CELL)
field[cell] += 1;
}

cell = position - N_COLS;
if (cell >= 0)
if (field[cell] != COVERED_MINE_CELL)
field[cell] += 1;
cell = position + N_COLS;
if (cell < all_cells)
if (field[cell] != COVERED_MINE_CELL)
field[cell] += 1;

if (current_col < (N_COLS - 1)) {
cell = position - N_COLS + 1;
if (cell >= 0)
if (field[cell] != COVERED_MINE_CELL)
field[cell] += 1;
cell = position + N_COLS + 1;
if (cell < all_cells)
if (field[cell] != COVERED_MINE_CELL)
field[cell] += 1;
cell = position + 1;
if (cell < all_cells)
if (field[cell] != COVERED_MINE_CELL)
field[cell] += 1;
}
}
}
}


public void find_empty_cells(int j) {

int current_col = j % N_COLS;
int cell;

if (current_col > 0) {
cell = j - N_COLS - 1;
if (cell >= 0)
if (field[cell] > MINE_CELL) {
field[cell] -= COVER_FOR_CELL;
if (field[cell] == EMPTY_CELL)
find_empty_cells(cell);
}

cell = j - 1;
if (cell >= 0)
if (field[cell] > MINE_CELL) {
field[cell] -= COVER_FOR_CELL;
if (field[cell] == EMPTY_CELL)
find_empty_cells(cell);
}

cell = j + N_COLS - 1;
if (cell < all_cells)
if (field[cell] > MINE_CELL) {
field[cell] -= COVER_FOR_CELL;
if (field[cell] == EMPTY_CELL)
find_empty_cells(cell);
}
}

cell = j - N_COLS;
if (cell >= 0)
if (field[cell] > MINE_CELL) {
field[cell] -= COVER_FOR_CELL;
if (field[cell] == EMPTY_CELL)
find_empty_cells(cell);
}

cell = j + N_COLS;
if (cell < all_cells)
if (field[cell] > MINE_CELL) {
field[cell] -= COVER_FOR_CELL;
if (field[cell] == EMPTY_CELL)
find_empty_cells(cell);
}

if (current_col < (N_COLS - 1)) {
cell = j - N_COLS + 1;
if (cell >= 0)
if (field[cell] > MINE_CELL) {
field[cell] -= COVER_FOR_CELL;
if (field[cell] == EMPTY_CELL)
find_empty_cells(cell);
}

cell = j + N_COLS + 1;
if (cell < all_cells)
if (field[cell] > MINE_CELL) {
field[cell] -= COVER_FOR_CELL;
if (field[cell] == EMPTY_CELL)
find_empty_cells(cell);
}

cell = j + 1;
if (cell < all_cells)
if (field[cell] > MINE_CELL) {
field[cell] -= COVER_FOR_CELL;
if (field[cell] == EMPTY_CELL)
find_empty_cells(cell);
}
}
}

@Override
public void paintComponent(Graphics g) {

int cell = 0;
int uncover = 0;

for (int i = 0; i < N_ROWS; i++) {
for (int j = 0; j < N_COLS; j++) {

cell = field[(i * N_COLS) + j];

if (inGame && cell == MINE_CELL)
inGame = false;

if (!inGame) {
if (cell == COVERED_MINE_CELL) {
cell = DRAW_MINE;
} else if (cell == MARKED_MINE_CELL) {
cell = DRAW_MARK;
} else if (cell > COVERED_MINE_CELL) {
cell = DRAW_WRONG_MARK;
} else if (cell > MINE_CELL) {
cell = DRAW_COVER;
}


} else {
if (cell > COVERED_MINE_CELL)
cell = DRAW_MARK;
else if (cell > MINE_CELL) {
cell = DRAW_COVER;
uncover++;
}
}

g.drawImage(img[cell], (j * CELL_SIZE),
(i * CELL_SIZE), this);
}
}

if (uncover == 0 && inGame) {
inGame = false;
statusbar.setText("Game won");
} else if (!inGame)
statusbar.setText("Game lost");
}


class MinesAdapter extends MouseAdapter {

@Override
public void mousePressed(MouseEvent e) {

int x = e.getX();
int y = e.getY();

int cCol = x / CELL_SIZE;
int cRow = y / CELL_SIZE;

boolean rep = false;


if (!inGame) {
newGame();
repaint();
}


if ((x < N_COLS * CELL_SIZE) && (y < N_ROWS * CELL_SIZE)) {

if (e.getButton() == MouseEvent.BUTTON3) {

if (field[(cRow * N_COLS) + cCol] > MINE_CELL) {
rep = true;

if (field[(cRow * N_COLS) + cCol] <= COVERED_MINE_CELL) {
if (mines_left > 0) {
field[(cRow * N_COLS) + cCol] += MARK_FOR_CELL;
mines_left--;
statusbar.setText(Integer.toString(mines_left));
} else
statusbar.setText("No marks left");
} else {

field[(cRow * N_COLS) + cCol] -= MARK_FOR_CELL;
mines_left++;
statusbar.setText(Integer.toString(mines_left));
}
}

} else {

if (field[(cRow * N_COLS) + cCol] > COVERED_MINE_CELL) {
return;
}

if ((field[(cRow * N_COLS) + cCol] > MINE_CELL) &&
(field[(cRow * N_COLS) + cCol] < MARKED_MINE_CELL)) {

field[(cRow * N_COLS) + cCol] -= COVER_FOR_CELL;
rep = true;

if (field[(cRow * N_COLS) + cCol] == MINE_CELL)
inGame = false;
if (field[(cRow * N_COLS) + cCol] == EMPTY_CELL)
find_empty_cells((cRow * N_COLS) + cCol);
}
}

if (rep)
repaint();

}
}
}
}


Mines.java:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import java.util.*;


public class Mines extends JFrame {

private final int FRAME_WIDTH = 250;
private final int FRAME_HEIGHT = 290;
public static int v;

private final JLabel statusbar;

public Mines() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(FRAME_WIDTH, FRAME_HEIGHT);
setLocationRelativeTo(null);
setTitle("Minesweeper");

statusbar = new JLabel("");
add(statusbar, BorderLayout.SOUTH);

add(new Board(statusbar));

setResizable(false);
}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {

@Override
public void run() {
JFrame ex = new Mines();
ex.setVisible(true);

System.out.println("Please enter number for difficulty");
System.out.println("1: Easy 2: Medium 3: Hard");
Scanner kb = new Scanner(System.in);
int difficulty = kb.nextInt();
System.out.println("Difficulty set to: " + difficulty);

if(difficulty==1){
Easy.setVariable(40);
v = Easy.getVariable();
System.out.println(v);
System.out.println("Easy mode chosen");
}
if(difficulty==2){
//Medium.setVariable(80);
//v = Medium.getVariable();
//System.out.println(v);
System.out.println("Medium mode chosen");
//Medium.main(args);
}
if(difficulty==3){
Hard.main(args);
}

}
});
}
}

Answer

Edit the constructor of the Board class to accept the number of mines.

private int n_mines = 40; // default 

public Board(int mines, JLabel statusbar) {
    this.n_mines = mines;
    this.statusbar = statusbar;

Make a new Board(20, new JLabel()); for an easier game