Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * Warning!
- * This game has 3 bugs!
- * 1. Lagging.
- * Maybe it takes some lags because I use to many loops? Idk...
- * I read javadocs, but dont understand why it does lags.
- * 2. Game can't mark cell where player does lose
- * 3. If u notice, end-game screen graphics take some effect
- * like gradient. This is bug, not mine idea...
- */
- package jsx;
- import java.awt.Color;
- import java.awt.Dimension;
- import java.awt.Font;
- import java.awt.FontMetrics;
- import java.awt.Graphics;
- import java.awt.Graphics2D;
- import java.awt.RenderingHints;
- import java.awt.event.KeyAdapter;
- import java.awt.event.KeyEvent;
- import java.awt.event.MouseAdapter;
- import java.awt.event.MouseEvent;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Random;
- import javax.swing.JFrame;
- import javax.swing.JPanel;
- import javax.swing.WindowConstants;
- public class Minesweeper extends JPanel {
- final static int MINES = 12;
- List<Tile> field;
- Random random;
- boolean inGame, isWin;
- int winCondition;
- enum Flag {
- NONE, OPEN, MARKED, CRUSHED, ERROR, VERIFIED;
- }
- public Minesweeper() {
- random = new Random();
- setPreferredSize(new Dimension(346, 368));
- setFocusable(true);
- addKeyListener(new KeyAdapter() {
- @Override
- public void keyPressed(KeyEvent e) {
- if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
- init();
- }
- });
- addMouseListener(new MouseAdapter() {
- @Override
- public void mouseClicked(MouseEvent e) {
- if (inGame) {
- if (e.getButton() == MouseEvent.BUTTON1) {
- Tile tile = getTile(e.getX(), e.getY());
- if (tile == null)
- return;
- clickLeft(tile);
- } else if (e.getButton() == MouseEvent.BUTTON3) {
- Tile tile = getTile(e.getX(), e.getY());
- if (tile == null)
- return;
- clickRight(tile);
- }
- } else {
- init();
- }
- }
- });
- init();
- }
- void init() {
- inGame = true;
- isWin = false;
- winCondition = 0;
- generate();
- calculate();
- repaint();
- }
- void calculate() {
- for (Tile t0 : field) {
- if (!t0.isMined()) {
- List<Tile> temp = getNearby(t0);
- for (Tile t1 : temp) {
- if (t1.isMined()) {
- t0.setValue(t0.getValue() + 1);
- }
- }
- }
- }
- for (Tile t0 : field) {
- if (t0.getValue() > 0) {
- winCondition++;
- }
- }
- }
- void generate() {
- field = new ArrayList<Tile>();
- for (int x = 0; x < 9; x++) {
- for (int y = 0; y < 9; y++) {
- field.add(new Tile(x, y));
- }
- }
- for (int i = 0; i < MINES + 1; i++) {
- Tile t = field.get(random.nextInt(field.size()));
- if (t.isMined()) {
- i--;
- } else {
- t.setMined();
- }
- }
- }
- void checkWin() {
- int counter = 0;
- for (int i = 0; i < field.size(); i++) {
- Tile t0 = field.get(i);
- if (t0.isFlag(Flag.OPEN) && t0.getValue() > 0) {
- counter++;
- }
- }
- if (counter == winCondition) {
- inGame = false;
- isWin = true;
- }
- }
- List<Tile> getNearby(Tile t) {
- List<Tile> out = new ArrayList<Tile>();
- for (Tile tile : field) {
- if (t.isNear(tile)) {
- out.add(tile);
- }
- }
- return out;
- }
- int getInt(int coord) {
- if (coord < 16 || coord > 320) {
- return -1;
- }
- int i = 16;
- for (int c = 0; c < 9; c++) {
- i += 34;
- if (coord < i) {
- return c;
- }
- }
- return -1;
- }
- Tile getTile(int x, int y) {
- x = getInt(x);
- y = getInt(y);
- if (x != -1 && y != -1) {
- for (Tile t0 : field) {
- if (t0.getX() == x && t0.getY() == y) {
- return t0;
- }
- }
- }
- return null;
- }
- void clickRight(Tile tile) {
- if (tile.isFlag(Flag.NONE)) {
- tile.setFlag(Flag.MARKED);
- } else if (tile.isFlag(Flag.MARKED)) {
- tile.setFlag(Flag.NONE);
- }
- repaint();
- }
- void clickLeft(Tile tile) {
- if (!tile.isFlag(Flag.NONE))
- return;
- if (tile.isMined()) {
- inGame = false;
- tile.setFlag(Flag.CRUSHED);
- } else {
- tile.setFlag(Flag.OPEN);
- checkWin();
- }
- repaint();
- }
- @Override
- public void paint(Graphics g) {
- super.paint(g);
- g.setColor(new Color(255, 223, 94));
- g.fillRect(0, 0, 346, 368);
- for (Tile t : field) {
- if (!inGame) {
- if (isWin) {
- if (t.isMined()) {
- t.setFlag(Flag.VERIFIED);
- } else if (t.isFlag(Flag.NONE)) {
- t.setFlag(Flag.OPEN);
- }
- } else {
- if (t.isMined() && t.isFlag(Flag.MARKED)) {
- t.setFlag(Flag.VERIFIED);
- } else if (t.isMined() && t.isFlag(Flag.NONE)) {
- t.setFlag(Flag.CRUSHED);
- } else if (!t.isMined() && t.isFlag(Flag.MARKED)) {
- t.setFlag(Flag.ERROR);
- } else {
- t.setFlag(Flag.OPEN);
- }
- }
- }
- drawTile(g, t);
- }
- }
- void drawTileText(Graphics2D g, int oX, int oY, String text, Color color) {
- g.setColor(color);
- Font font = new Font("Arial", Font.BOLD, 18);
- g.setFont(font);
- FontMetrics fm = getFontMetrics(font);
- int w = fm.stringWidth(text);
- int h = -(int) fm.getLineMetrics(text, g).getBaselineOffsets()[2];
- g.drawString(text, oX + (32 - w) / 2, oY + 32 - (32 - h) / 2 - 2);
- }
- void drawTile(Graphics gr, Tile tile) {
- Graphics2D g = ((Graphics2D) gr);
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
- int oX = 18 + tile.getX() * 34;
- int oY = 18 + tile.getY() * 34;
- if (inGame) {
- g.setColor(tile.getTileColor());
- g.fillRect(oX, oY, 32, 32);
- if (tile.isFlag(Flag.OPEN)) {
- if (tile.getValue() > 0)
- drawTileText(g, oX, oY, String.valueOf(tile.getValue()), tile.getTextColor());
- } else if (tile.isFlag(Flag.MARKED)) {
- drawTileText(g, oX, oY, "?", tile.getTextColor());
- }
- } else {
- g.setColor(tile.getTileColor());
- g.fillRect(oX, oY, 32, 32);
- if (tile.isFlag(Flag.OPEN)) {
- g.setColor(tile.getTileColor());
- g.fillRect(oX, oY, 32, 32);
- if (tile.getValue() > 0)
- drawTileText(g, oX, oY, String.valueOf(tile.getValue()), tile.getTextColor());
- } else {
- g.setColor(tile.getTileColor());
- g.fillRect(oX, oY, 32, 32);
- }
- g.setColor(new Color(255, 255, 255, 2));
- g.fillRect(0, 0, getWidth(), getHeight());
- g.setColor(new Color(44, 44, 44));
- g.setFont(new Font("Arial", Font.BOLD, 80));
- if (isWin) {
- g.drawString("Win!", 88, 188);
- } else {
- g.drawString("Lose!", 64, 188);
- }
- }
- }
- static class Tile {
- private boolean mined;
- private int value, x, y;
- private Flag flag;
- public Tile(int x, int y) {
- this.mined = false;
- this.value = 0;
- this.x = x;
- this.y = y;
- this.flag = Flag.NONE;
- }
- public boolean isNear(Tile t) {
- return Math.abs(x - t.getX()) < 2 && Math.abs(y - t.getY()) < 2;
- }
- public int getX() {
- return x;
- }
- public int getY() {
- return y;
- }
- public boolean isMined() {
- return mined;
- }
- public void setMined() {
- this.mined = true;
- }
- public int getValue() {
- return value;
- }
- public void setValue(int i) {
- this.value = i;
- }
- public boolean isFlag(Flag f) {
- return flag == f;
- }
- public Flag getFlag() {
- return flag;
- }
- public void setFlag(Flag f) {
- this.flag = f;
- }
- public Color getTextColor() {
- if (flag == Flag.MARKED) {
- return new Color(255, 255, 255);
- }
- switch (value) {
- case 1:
- return new Color(0, 45, 183);
- case 2:
- return new Color(22, 122, 0);
- case 3:
- return new Color(183, 0, 0);
- case 4:
- return new Color(0, 10, 163);
- case 5:
- return new Color(183, 0, 0);
- case 6:
- return new Color(140, 184, 255);
- case 7:
- return new Color(183, 0, 0);
- case 8:
- return new Color(147, 0, 160);
- }
- return null;
- }
- public Color getTileColor() {
- switch (flag) {
- case CRUSHED:
- return new Color(186, 37, 0);
- case ERROR:
- return new Color(255, 251, 30);
- case MARKED:
- return new Color(43, 102, 196);
- case NONE:
- return new Color(43, 102, 196);
- case OPEN:
- return new Color(221, 234, 255);
- case VERIFIED:
- return new Color(22, 188, 0);
- }
- return null;
- }
- }
- public static void main(String[] args) {
- JFrame game = new JFrame();
- game.setTitle("Minesweeper");
- game.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- game.setSize(346, 368);
- game.setResizable(false);
- game.add(new Minesweeper());
- game.setLocationRelativeTo(null);
- game.setVisible(true);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment