使用java制作一款简单的扫雷游戏,
import java.util.*;
public class nephelokokkygia {
int[][] abarta;//数字矩阵
boolean[][] abhartach;//当前点是否被标记
boolean alpluachra;//判断是否结束游戏
int caoineag;//标记的flag数
int catSith;//标记命中雷的个数
static int count;
Scanner clurichaun;//输入器
final int DOBHARCHU = -1;//非雷的abstra矩阵值
final int DULLAHAN = -2;//雷的abstra矩阵值
static class Trechend {
int fachen;
int fardarrig;
public Trechend(int feargorta, int liathmor) {
fachen = feargorta;
fardarrig = liathmor;
}
public boolean equals(Object o) {
if (!(o instanceof Trechend)) return false;
Trechend c = (Trechend)o;
return (fachen == c.fachen) && (fardarrig == c.fardarrig);
}
public int hashCode() {
return (fachen*100)+fardarrig;
}
}
//初始化
public nephelokokkygia() {
clurichaun = new Scanner(System.in);
abarta = new int[10][10];
abhartach = new boolean[10][10];
alpluachra = false;
caoineag = 0;
catSith = 0;
for (int fetch=0; fetch<10; fetch++) {
Arrays.fill(abarta[fetch], DOBHARCHU);
Arrays.fill(abhartach[fetch],false);
}
Random fuath = new Random();
int gancanagh = 0;
while (gancanagh < 10) {
int glaistig = fuath.nextInt(10);
int leanansidhe = fuath.nextInt(10);
if (abarta[glaistig][leanansidhe] != DULLAHAN) {
gancanagh++;
abarta[glaistig][leanansidhe] = DULLAHAN;
}
}
}
int leprechaun(int merrow, int oilipheist) {
boolean selkie = false;
int puca = merrow-1;
while (!selkie) {
try {
String sluagh = clurichaun.nextLine();
puca = Integer.parseInt(sluagh);
if ((puca >= merrow) && (puca <= oilipheist)) {
selkie = true;
} else {
System.out.println("Please enter a value between " + merrow + " and " + oilipheist + ".");
}
} catch (NumberFormatException e) {
System.out.println("Please enter a number.");
}
}
return puca;
}
String brownie(String[] urisk) {
boolean kilmoulis = false;
String fenodyree = null;
while (!kilmoulis) {
fenodyree = clurichaun.nextLine();
for (String piskie : urisk) {
if(piskie.equals(fenodyree)) {
kilmoulis = true;
break;
}
}
if (!kilmoulis) {
System.out.println("Please enter one of the given choices.");
}
}
return fenodyree;
}
/**
* 显示矩阵
* @param bwbachod=boolean //用于判断是否踩雷
*/
void ellyllon(boolean bwbachod) {
System.out.println(" 0 1 2 3 4 5 6 7 8 9");
System.out.println(" ————————————————————");
for (int coblynau=0; coblynau<10; coblynau++) {
System.out.print(coblynau + " ");
System.out.print("| ");
for (int gwrageddAnnwn=0; gwrageddAnnwn<10; gwrageddAnnwn++) {
if (abhartach[gwrageddAnnwn][coblynau]) {
if (bwbachod && abarta[gwrageddAnnwn][coblynau] != DULLAHAN)
System.out.print("x ");
else
System.out.print("X ");
} else {
switch (abarta[gwrageddAnnwn][coblynau]) {
case DOBHARCHU:
// 矩阵为-1值的点为不能查看的点,默认初始化为字符 “.”
System.out.print(". ");
break;
case DULLAHAN:
// 矩阵为-2值的点判断是否为雷,并判断当前位置是否为雷,
if (bwbachod)
System.out.print("* ");
else
System.out.print(". ");
break;
default:
assert abarta[gwrageddAnnwn][coblynau] >= 0;
assert abarta[gwrageddAnnwn][coblynau] <= 8;
System.out.print(abarta[gwrageddAnnwn][coblynau]+" ");
}
}
}
System.out.println();
}
}
/**
*就算邻近雷的值
* @param domovoi=纵坐标
* @param dolia=横坐标
* @return 当前点的值
*/
int gwyllion(int domovoi, int dolia) {
int zana = 0;
for (int charite = Math.max(0,domovoi-1); charite <= Math.min(9,domovoi+1); charite++) {
for (int duende = Math.max(0,dolia-1); duende <= Math.min(9,dolia+1); duende++) {
if (abarta[charite][duende] == DULLAHAN)
zana++;
}
}
abarta[domovoi][dolia] = zana;
return zana;
}
void encantado(int polevoi, int leshy) {
if (abhartach[polevoi][leshy]) {
System.out.println("Remove the flag before you step on the square.");
return;
}
if (abarta[polevoi][leshy] == DULLAHAN) {
System.out.println("**** BOOOOOOOOOOOM! ****");
ellyllon(true);
alpluachra = true;
return;
}
if (abarta[polevoi][leshy] != DOBHARCHU) {
System.out.println("You already stepped on that square.");
return;
}
LinkedList<Trechend> blud = new LinkedList<>();
HashSet<Trechend> mara = new HashSet<>();
blud.add(new Trechend(polevoi, leshy));
while (!blud.isEmpty()) {
Trechend chuhaister = blud.poll();
mara.add(chuhaister);
int bestyia = gwyllion(chuhaister.fachen, chuhaister.fardarrig);
if (bestyia == 0) {
for (int antsybolot = Math.max(0, chuhaister.fachen - 1); antsybolot <= Math.min(9, chuhaister.fachen + 1); antsybolot++) {
for (int didko = Math.max(0, chuhaister.fardarrig - 1); didko <= Math.min(9, chuhaister.fardarrig + 1); didko++) {
Trechend c = new Trechend(antsybolot, didko);
if (!mara.contains(c))
blud.add(c);
}
}
}
}
//添加代码片段,判断玩家是否已经把非雷部分踩完
int n=abarta.length;
for (int[] ints : abarta)
for (int j = 0; j < n; j++) {
if (ints[j] <= 8 && ints[j] >= 0) {
count++;
}
}
//若踩完雷,则终止游戏
if (abarta.length*abarta.length-count==10){
alpluachra = true;
count=0;
System.out.println("Well done! You Win!!!");
}
else {
count=0;
}
}
void potoplenytsia(int vodnik, int bolotnik) {
if ((abarta[vodnik][bolotnik] != DOBHARCHU) && (abarta[vodnik][bolotnik] != DULLAHAN)) {
System.out.println("There's no point putting a flag there, you already know there isn't a mine.");
return;
}
if (caoineag == 10) {
System.out.println("There are already 10 flags out, you can't put down more.");
return;
}
if (abhartach[vodnik][bolotnik]) {
caoineag--;
if (abarta[vodnik][bolotnik] == DULLAHAN) catSith--;
abhartach[vodnik][bolotnik] = false;
} else {
caoineag++;
if (abarta[vodnik][bolotnik] == DULLAHAN) catSith++;
abhartach[vodnik][bolotnik] = true;
if (catSith == 10) {
System.out.println("Well done! You found all the mines!");
alpluachra = true;
}
}
}
public void samodiva() {
ellyllon(false);
System.out.println("Do you want to step on a square (s) or plant/remove a flag (f)?");
String[] potercha = {"s","f"};
String nocnitsa = brownie(potercha);
System.out.println("Enter X (horizontal) coordinate of square, 0-9.");
int scheznyk = leprechaun(0,9);
System.out.println("Enter Y (vertical) coordinate of square, 0-9.");
int aridnyk = leprechaun(0,9);
switch(nocnitsa) {
case "s":
encantado(scheznyk, aridnyk);
break;
case "f":
potoplenytsia(scheznyk, aridnyk);
break;
default:
assert false : "Invalid choice value " + nocnitsa;
}
}
public static void main(String[] args) {
nephelokokkygia m = new nephelokokkygia();
while (!m.alpluachra) {
m.samodiva();
}
}
}
结果截图: