ΠΠ°ΠΏΠΈΡΠ°Π» Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΠΊΠΎΠ΄ ΠΈ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ: Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅ΠΉΠΊΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΆΠ°ΡΡ ΡΠΎ Π΅ΡΡΡ ΠΏΡΠΈ Π½Π°ΠΆΠ°ΡΠΈΠΈ Π½Π° Π·Π°ΠΊΡΡΡΡΡ ΡΡΠ΅ΠΉΠΊΡ ΠΎΠ½Π° Π½Π΅ ΠΎΡΠΊΡΡΠ²Π°Π΅ΡΡΡΡ. ΠΠ΄Π΅ ΠΎΡΠΈΠ±ΠΊΠ° Π² ΠΊΠΎΠ΄Π΅?
package com.javarush.games.minesweeper;
import com.javarush.engine.cell.*;
import java.util.ArrayList;
public class MinesweeperGame extends Game {
private static final int SIDE = 9;
private int countMinesOnField;
private boolean isMine;
private static final String MINE = "\uD83D\uDCA3";
private static final String FLAG = "\uD83D\uDEA9";
private int countFlags;
private boolean isGameStopped;
private int countClosedTiles = SIDE * SIDE;
private int score;
private GameObject[][] gameField = new GameObject[SIDE][SIDE];
@Override
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
}
@Override
public void onMouseLeftClick(int x, int y) {
if (isGameStopped) {
restart();
}
else {
openTile(x, y);
}
}
private void createGame() {
for (int i = 0; i < gameField.length; i ++) {
for (int j = 0; j < gameField[i].length ; j ++) {
if (getRandomNumber(10) == 1) {
isMine = true;
countMinesOnField++;
}
gameField[i][j] = new GameObject(j, i, isMine);
setCellValue(i, j, "");
setCellColor(i, j, Color.ORANGE);
isMine = false;
}
}
countFlags = countMinesOnField;
countMineNeighbors();
}
private ArrayList<GameObject> getNeighbors(GameObject go) {
ArrayList<GameObject> testList = new ArrayList<GameObject>();
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
if (go != gameField[i][j] && Math.abs(go.x - gameField[i][j].x) < 2 && Math.abs(go.y - gameField[i][j].y) < 2) {
testList.add(gameField[i][j]);
}
}
}
return testList;
}
private void countMineNeighbors() {
ArrayList<GameObject> testList = new ArrayList<GameObject>();
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
if (!gameField[i][j].isMine) {
testList = getNeighbors(gameField[i][j]);
for (GameObject go : testList) {
if (go.isMine) {
gameField[i][j].countMineNeighbors++;
}
}
}
}
}
}
private void openTile(int x, int y){
if (gameField[x][y].isOpen || gameField[x][y].isFlag || isGameStopped){
} else if(gameField[y][x].isMine){
setCellValueEx(x, y, Color.RED, MINE);
gameOver();
}
else {
gameField[y][x].isOpen=true;
countClosedTiles--;
setCellColor(x,y, Color.GREEN);
score += 5;
boolean notZero = gameField[x][y].countMineNeighbors!=0;
if(notZero){
setCellNumber(x,y,gameField[x][y].countMineNeighbors);
}
else {
ArrayList<GameObject> list3 = new ArrayList<GameObject>();
setCellValue(x,y,"");
list3=getNeighbors(gameField[y][x]);
for(int i=0; i<list3.size();i++){
int Xx=list3.get(i).x;
int Yy=list3.get(i).y;
if(!list3.get(i).isOpen){
openTile(Xx,Yy);
}
}
}
}
if (countClosedTiles == countMinesOnField) {
win();
}
setScore(score);
}
private void markTile(int x, int y) {
if (isGameStopped){
if (gameField[x][y].isOpen || (countFlags == 0 && !gameField[x][y].isFlag)) {
} else if (!gameField[x][y].isFlag) {
gameField[x][y].isFlag = true;
countFlags--;
setCellValue(x, y, FLAG);
setCellColor(x, y, Color.YELLOW);
} else if (gameField[x][y].isFlag) {
gameField[x][y].isFlag = false;
countFlags++;
setCellValue(x, y, "");
setCellColor(x, y, Color.ORANGE);
}
}
}
@Override
public void onMouseRightClick(int x, int y) {
markTile(x, y);
}
private void gameOver() {
showAllMines();
isGameStopped = true;
showMessageDialog(Color.BLACK, "Over", Color.WHITE, 40);
}
private void win() {
isGameStopped = true;
showMessageDialog(Color.BLACK, "WIN", Color.WHITE, 40);
}
private void restart() {
isGameStopped = false;
countClosedTiles = SIDE * SIDE;
score = 0;
countMinesOnField = 0;
setScore(score);
createGame();
}
private void showAllMines() {
for (int i = 0; i < 9; i ++) {
for (int j = 0; j < 9; j ++) {
if (gameField[i][j].isMine) {
setCellValueEx(i, j, Color.RED, MINE);
}
}
}
}
}
nemerof
41 ΡΡΠΎΠ²Π΅Π½Ρ
ΠΡΠΈΠ±ΠΊΠ° Π² openTile()
Π Π΅ΡΠ΅Π½
ΠΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ (10)
- ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΡΠ΅
- Π½ΠΎΠ²ΡΠ΅
- ΡΡΠ°ΡΡΠ΅
ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΠΎΡΡΠ°Π²ΠΈΡΡ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π°Π²ΡΠΎΡΠΈΠ·ΠΎΠ²Π°ΡΡΡΡ
ΠΠ»Π΅ΠΊΡΠ°Π½Π΄Ρ ΠΠΎΡΠΎΠ½ΠΊΠΎΠ²
22 Π°ΠΏΡΠ΅Π»Ρ 2019, 16:16
private void markTile(int x, int y) {
if (isGameStopped){
...........
}
ΠΠΎΠ»ΠΆΠ½ΠΎ ΠΆ Π²ΡΠΎΠ΄Π΅ Π±ΡΡΡ (!isGameStopped)
ΠΈ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ showAllMines(), Π² ΡΡΡΠΎΠΊΠ΅ if (gameField[i][j].isMine) Π½ΡΠΆΠ½ΠΎ i ΠΈ j ΠΏΠΎΠΌΠ΅Π½ΡΡΡ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ, ΠΈΠ½Π°ΡΠ΅ ΠΌΠΈΠ½Ρ Π½Π° ΠΎΡΠΊΡΡΡΡΡ
ΡΡΠ΅ΠΉΠΊΠ°Ρ
Π±ΡΠ΄ΡΡ ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ ΠΈΠ³ΡΡ
ΡΡΠΎ ΠΏΠ΅ΡΠ²ΠΎΠ΅, ΡΡΠΎ ΠΏΠΎΠΏΠ°Π»ΠΎΡΡ Π½Π° Π³Π»Π°Π·Π°
0
nemerof
22 Π°ΠΏΡΠ΅Π»Ρ 2019, 17:23
ΠΠ΅Π±ΠΎΠ»ΡΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΊΠ° Π² showAllMines ΠΈ Π²ΠΏΡΠ°Π²Π΄Ρ Π±ΡΠ»Π°, Π½ΠΎ Π³Π»Π°Π²Π½ΠΎΠ΅ ΡΠΎ ΡΡΠΎ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ openTile() Π΅ΡΡΡ ΠΊΠ°ΠΊΠΎΠ΅-ΡΠΎ ΡΡΠ»ΠΎΠ²ΠΈΠ΅ ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ΅ΠΌΡ ΠΎΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π½Π΅ Π΄Π°ΡΡ ΠΎΡΠΊΡΡΠ²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ΅ΠΉΠΊΠΈ ΡΠΎ Π΅ΡΡΡ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΊΠ»Π΅ΡΠΊΠΈ Π½Π°ΠΆΠ°ΡΡ ΠΏΡΠΎΡΡΠΎ Π½Π΅Π»ΡΠ·Ρ, ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°ΠΊ ΠΈ Π½Π΅ ΡΠ΅ΡΠΈΠ»Π°ΡΡ.....
0
ΠΠ»Π΅ΠΊΡΠ°Π½Π΄Ρ ΠΠΎΡΠΎΠ½ΠΊΠΎΠ²
22 Π°ΠΏΡΠ΅Π»Ρ 2019, 17:33
ΠΌΠΎΠΉ openTile
0
nemerof
22 Π°ΠΏΡΠ΅Π»Ρ 2019, 17:34
openTile() ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠΌΠΎΠ³, Π½ΠΎ ΠΏΠΎΡΠ²ΠΈΠ»Π°ΡΡ Π΄ΡΡΠ³Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°: ΠΈΠ³ΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π·Π°Π²Π΅ΡΡΠ°ΡΡΡΡ Π΄Π°ΠΆΠ΅ Π² ΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π΅ΡΠ»ΠΈ Π½Π°ΠΆΠΈΠΌΠ°Ρ Π½Π° ΠΊΠ»Π΅ΡΠΊΡ Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ 0 ΡΠΎΡΠ΅Π΄Π΅ΠΉ Ρ ΠΌΠΈΠ½ΠΎΠΉ ΠΈ Π³Π΄Π΅ Π½Π΅ΡΡ ΠΌΠΈΠ½Ρ
0
ΠΠ»Π΅ΠΊΡΠ°Π½Π΄Ρ ΠΠΎΡΠΎΠ½ΠΊΠΎΠ²
22 Π°ΠΏΡΠ΅Π»Ρ 2019, 17:37
Π³Π΄Π΅ ΡΠΎ Ρ ΡΡΠ»ΠΎΠ²ΠΈΡΠΌΠΈ ΠΎΡΠΈΠ±ΠΊΠ°, Π²ΠΌΠ΅ΡΡΠΎ true Π²ΡΠ»Π΅ΡΠ°Π΅Ρ false ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ
0
nemerof
22 Π°ΠΏΡΠ΅Π»Ρ 2019, 17:39
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ, Ρ Π²Π°ΡΠΈΠΌ openTile() ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ, ΠΏΠΎΠΉΠ΄Ρ ΠΈΡΠΊΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΡ Π² ΡΠ²ΠΎΡΠΌ, ΡΠΏΠ°ΡΠΈΠ±ΠΎ Π·Π° ΠΏΠΎΠΌΠΎΡΡ
0
Mariya Tuleshova
8 Π΄Π΅ΠΊΠ°Π±ΡΡ 2019, 11:52
Π£ ΠΌΠ΅Π½Ρ Ρ Π²Π°ΡΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ openTile() Π²ΠΌΠ΅ΡΡΠ΅ Ρ ΡΠΎΡΠ΅Π΄ΡΠΌΠΈ Π½Π΅ ΠΌΠΈΠ½Π°ΠΌΠΈ, ΠΎΡΠΊΡΡΠ²Π°ΡΡΡΡ ΠΌΠΈΠ½Ρ, ΠΈ Π²ΡΡΠΊΠ°ΠΊΠΈΠ²Π°Π΅Ρ "ΠΡ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»ΠΈ".
ΠΠΎΠ΄ΡΠΊΠ°ΠΆΠΈΡΠ΅, Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΡΡΠ°ΠΏΠ΅ Ρ ΠΌΠ΅Π½Ρ ΠΎΡΠΈΠ±ΠΊΠ°, ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ°.
Π’Π΅ΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½ΠΈΠΆΠ΅.
ΠΡΠ΅Π½Ρ ΠΏΡΠΎΡΡ ΠΏΠΎΠΌΠΎΡΠΈ!!!
0
Mariya Tuleshova
8 Π΄Π΅ΠΊΠ°Π±ΡΡ 2019, 11:58
public void initialize() {
setScreenSize(SIDE, SIDE);
createGame();
}
private void createGame() {
for (int x = 0; x < SIDE; x++) {
for (int y = 0; y < SIDE; y++) {
setCellColor(x, y, Color.ORANGE);
setCellValue(x, y, "");
if (getRandomNumber(10) == 0) {
gameField[y][x] = new GameObject(y, x, true);
countMinesOnField++;
} else {
gameField[y][x] = new GameObject(y, x, false);
}
}
}
countMineNeighbors();
countFlags = countMinesOnField;
isGameStopped = false;
}
private void countMineNeighbors() {
for (int i = 0; i < SIDE; i++) {
for (int j = 0; j < SIDE; j++) {
if (!gameField[j][i].isMine) {
ArrayList<GameObject> neigbours = getNeighbors(gameField[j][i]);
for (GameObject neigbour : neigbours) {
if (neigbour.isMine) {
gameField[j][i].countMineNeighbors++;
}
}
}
}
}
}
private ArrayList<GameObject> getNeighbors(GameObject gameObject) {
ArrayList<GameObject> neighbors = new ArrayList<>();
int x1 = (gameObject.x - 1 < 0) ? 0 : gameObject.x - 1;
int x2 = (gameObject.x + 1 < SIDE - 1) ? gameObject.x + 1 : SIDE - 1;
int y1 = (gameObject.y - 1 < 0) ? 0 : gameObject.y - 1;
int y2 = (gameObject.y + 1 < SIDE - 1) ? gameObject.y + 1 : SIDE - 1;
for (int i = y1; i <= y2; i++) {
for (int j = x1; j <= x2; j++) {
boolean isCenter = (i == gameObject.y && j == gameObject.x);
if (!isCenter) {
neighbors.add(gameField[i][j]);
0
Mariya Tuleshova
8 Π΄Π΅ΠΊΠ°Π±ΡΡ 2019, 11:59
private void openTile(int x, int y){
if(gameField[y][x].isFlag || isGameStopped || gameField[y][x].isOpen){
return;
}
if(gameField[y][x].isMine){
setCellValueEx(x, y, Color.RED, MINE);
gameOver();
gameField[y][x].isOpen = true;
return;
} else {
countClosedTiles = countClosedTiles - 1;
gameField[y][x].isOpen = true;
score += 5;
setScore(score);
setCellColor(x, y, Color.GREEN);
if(gameField[y][x].countMineNeighbors != 0){
setCellNumber(x, y, gameField[y][x].countMineNeighbors);
} else {
setCellValue(x, y, "");
ArrayList<GameObject> list = getNeighbors(gameField[y][x]);
for(GameObject object: list){
if(!object.isOpen & !object.isMine){
openTile(object.x, object.y);
}
}
}
}
if(countClosedTiles == countMinesOnField){
win();
}
}
private void markTile ( int x, int y){
if (!isGameStopped) {
if (!gameField[y][x].isOpen && countFlags != 0) {
// Π ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»Π°ΠΆΠΊΠ° Π² Π½Π΅ΡΠ°ΡΠΊΡΡΡΠΎΠΉ ΡΡΠ΅ΠΉΠΊΠ΅ Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ²Π΅ΡΠ°
if (!gameField[y][x].isFlag) {
gameField[y][x].isFlag = true;
countFlags--;
setCellValue(x, y, FLAG);
setCellColor(x, y, Color.YELLOW);
} else
{
if (gameField[y][x].isFlag) {
gameField[y][x].isFlag = false;
countFlags++;
setCellValue(x, y, "");
setCellColor(x, y, Color.ORANGE);
}
}
}
0
Mariya Tuleshova
8 Π΄Π΅ΠΊΠ°Π±ΡΡ 2019, 11:59
private void gameOver () {
isGameStopped = true;
// ΠΡΠ²ΠΎΠ΄ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ
showMessageDialog(Color.BLUE, "ΠΡ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»ΠΈ!", Color.RED, 14);
}
private void win () {
isGameStopped = true;
showMessageDialog(Color.YELLOW, "Π£Π Π! ΠΡ Π²ΡΠΈΠ³ΡΠ°Π»ΠΈ", Color.RED, 14);
}
private void restart() {
isGameStopped = false;
countClosedTiles = SIDE * SIDE;
score = 0;
countMinesOnField = 0;
setScore(score);
createGame();
}
@Override
public void onMouseLeftClick ( int x, int y){
if (isGameStopped) {restart();}
else
{openTile(x, y);}
}
@Override
public void onMouseRightClick ( int x, int y){
markTile(x, y);
}
}
0