java awt 初始化_Java awt项目开发
通過Java awt 界面上的知識(shí)編寫的掃雷游戲
代碼中有詳細(xì)的注解
package com.langsin.saolei;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Insets;
import java.awt.Label;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.MenuShortcut;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class Saolei extends Frame implements ActionListener {
// 先定義橫向的按鈕的個(gè)數(shù)和縱向的按鈕的個(gè)
private static int WITH = 10;
private static int LENG = 10;
// 定義地雷的個(gè)數(shù)
private static int Mines_Count = 10;
// 定義旗幟的個(gè)數(shù)
private static int Red_Count = 10;
// 定義一個(gè)random類
private static Random random = new Random();
// 定義一個(gè)二維數(shù)組
private static Bomb[][] jb = new Bomb[WITH][LENG];
// 判斷是否結(jié)束
private boolean flag = false;
// 判斷是否成功 默認(rèn)是沒有成功
private boolean sucess = false;
// 用集合暫存sucess.txt中的內(nèi)容
private List list = new ArrayList();
// 用集合暫存游戲時(shí)間
private List listtime = new ArrayList();
StringBuffer buffer = new StringBuffer();
// 定義一個(gè)面板成員變量
private JPanel jp;
// 記錄時(shí)間的線程
private Runnable runnable;
// 已用時(shí)間
private int usedTime = 0;
// 定義兩個(gè)標(biāo)簽 時(shí)間和旗幟
private Label time, redFlag;
/*
* 檢測某點(diǎn)周圍是否有雷,周圍點(diǎn)的坐標(biāo)可由該數(shù)組計(jì)算得到
*/
private int[][] mv = { { 1, 0 }, { -1, 0 }, { 0, 1 }, { 0, -1 }, { 1, 1 },
{ -1, -1 }, { 1, -1 }, { -1, 1 } };
// 通過構(gòu)造器初始化
public Saolei() throws Exception {
super("掃雷");
// 絕對(duì)布局管理器
this.setLayout(null);
// 設(shè)置圖標(biāo)
this.setIconImage(ImageIO.read(new File("./image/圖標(biāo).jpg")));
// 設(shè)置大小
this.setBounds(100, 100, 500, 500);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
setMenu();
intMine();
intBottom();
this.setResizable(false);
this.setVisible(true);
}
// 設(shè)置初始化菜單
public void setMenu() {
// 菜單條
MenuBar menbar = new MenuBar();
// 菜單項(xiàng) 游戲
Menu game = new Menu("游戲(G)");
// 菜單項(xiàng)游戲的組件 新游戲
MenuItem newgame = new MenuItem("新游戲");
// 游戲從新開始
newgame.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 調(diào)用重新開始游戲的方法
resetGame();
}
});
game.add(newgame);
// 菜單項(xiàng)游戲的組件 更改外觀
MenuItem change = new MenuItem("更改外觀");
change.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for (int i = 0; i < WITH; i++) {
for (int j = 0; j < LENG; j++) {
if (!jb[i][j].isIsclicked() && jb[i][j].isEnabled()) {
jb[i][j].setBackground(Color.BLUE);
} else {
jb[i][j].setBackground(Color.WHITE);
}
}
}
}
});
game.add(change);
// 加一條橫線
// game.addSeparator();
game.add(new MenuItem("-"));
// 菜單項(xiàng)游戲的組件 退出
MenuItem exit = new MenuItem("退出",
new MenuShortcut(KeyEvent.VK_A, true));
exit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
System.exit(0);
}
});
game.add(exit);
menbar.add(game);
// 菜單項(xiàng) 幫助
Menu Tj = new Menu("統(tǒng)計(jì)(T)");
// 菜單項(xiàng)游戲的組件 統(tǒng)計(jì)信息
MenuItem record = new MenuItem("查看統(tǒng)計(jì)信息");
// 將游戲的成敗和時(shí)間記錄兩個(gè)txt文本中
record.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
Tongji();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
Tj.add(record);
menbar.add(Tj);
// 添加菜單條
this.setMenuBar(menbar);
}
// 初始化底部
private void intBottom() {
// 創(chuàng)建兩個(gè)label 一個(gè)是時(shí)間 一個(gè)是計(jì)時(shí)
Label lab1 = new Label("時(shí)間");
lab1.setFont(new Font("宋體", Font.BOLD, 15));
lab1.setForeground(Color.BLUE);
lab1.setBounds(80, 430, 35, 35);
this.add(lab1);
time = new Label("0");
time.setFont(new Font("宋體", Font.PLAIN, 15));
time.setBounds(140, 435, 50, 25);
this.add(time);
// 一個(gè)是標(biāo)記 小紅旗的個(gè)數(shù)
Label lab2 = new Label("旗幟");
lab2.setFont(new Font("宋體", Font.BOLD, 15));
lab2.setForeground(Color.BLUE);
lab2.setBounds(300, 430, 35, 35);
this.add(lab2);
redFlag = new Label(" 10");
redFlag.setFont(new Font("宋體", Font.PLAIN, 15));
redFlag.setBounds(350, 435, 50, 25);
this.add(redFlag);
// 通過接口來實(shí)現(xiàn)
runnable = new Runnable() {
public void run() {
while (true) {
// 是否結(jié)束
if (flag) {
break;
}
try {
// 睡眠1s
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 已用時(shí)間+1
usedTime++;
time.setText(String.valueOf(usedTime));
}
}
};
// 開始線程
new Thread(runnable).start();
}
// 初始化雷區(qū)(用按鈕來充當(dāng)?shù)乩?用面板在面板上添加按鈕)
private void intMine() {
// 將按鈕放在面板上
jp = new JPanel();
// 面板的布局管理器為網(wǎng)格布局管理器
jp.setLayout(new GridLayout(WITH, LENG, 0, 0));
// 設(shè)置面板的位置
jp.setBounds(75, 70, 350, 350);
makeMines(true);
this.add(jp);
}
// 隨機(jī)布置雷區(qū) 重置雷區(qū)
private void makeMines(boolean newFlag) {
// 在面板上面放按鈕 并設(shè)置初始按鈕屬性
for (int i = 0; i < LENG; i++) {
for (int j = 0; j < WITH; j++) {
if (newFlag) {
// 記錄下位置
jb[i][j] = new Bomb(i, j);
jp.add(jb[i][j]);
// 設(shè)置按鈕和標(biāo)簽之間的空白 數(shù)字所在按鈕的位置
jb[i][j].setMargin(new Insets(0, 0, 0, 0));
jb[i][j].addActionListener(this);
// 鼠標(biāo)點(diǎn)擊事件 鼠標(biāo)右擊
jb[i][j].addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
Object obj = e.getSource();
// e.isMetaDown() 檢測鼠標(biāo)右鍵單擊
if (e.isMetaDown() && obj instanceof Bomb) {
// 強(qiáng)制類型轉(zhuǎn)換
Bomb bomb = (Bomb) obj;
// 旗幟的個(gè)數(shù)大于等于0
if (bomb.isEnabled() && Red_Count >= 0) {
// 定義一個(gè)數(shù)字 來判定狀態(tài)
// 右擊點(diǎn)一下 變?yōu)? 紅旗狀態(tài) 兩下變?yōu)? ?號(hào)狀態(tài)
int num = (bomb.getBombflag() + 1) % 3;
switch (num) {
case 0:
// 初始狀態(tài)
bomb.setIcon(null);
break;
case 1:
Red_Count--;
// 緩沖圖片對(duì)象
BufferedImage bf1 = new BufferedImage(
35, 35,
BufferedImage.TYPE_INT_RGB);
// 通過緩存圖片對(duì)象,來得到畫筆工具對(duì)象Graphics,對(duì)緩存圖片進(jìn)行修改
Graphics grap = bf1.getGraphics();
// 先讀到這幅圖片
Image image;
try {
image = ImageIO.read(new File(
"./image/紅旗.jpg"));
// 然后通過畫筆對(duì)象來改變它,將這幅圖片進(jìn)行縮放
grap.drawImage(image, 0, 0, 35, 35,
null);
bomb.setIcon(new ImageIcon(bf1));
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
break;
case 2:
Red_Count++;
// 緩沖圖片對(duì)象
BufferedImage bf2 = new BufferedImage(
35, 35,
BufferedImage.TYPE_INT_RGB);
// 通過緩存圖片對(duì)象,來得到畫筆工具對(duì)象Graphics,對(duì)緩存圖片進(jìn)行修改
Graphics grap2 = bf2.getGraphics();
// 先讀到這幅圖片
Image image2;
try {
// 然后通過畫筆對(duì)象來改變它,將這幅圖片進(jìn)行縮放
image2 = ImageIO.read(new File(
"./image/問號(hào).jpg"));
grap2.drawImage(image2, 0, 0, 35,
35, null);
bomb.setIcon(new ImageIcon(bf2));
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
break;
default:
break;
}
redFlag.setText(String.valueOf(Red_Count));
// 改變狀態(tài)
bomb.setBombflag(num);
try {
checkSuccess();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
});
} else {
jb[i][j].setIcon(null);
jb[i][j].setEnabled(true);
// 默認(rèn)為都沒有點(diǎn)擊
jb[i][j].setIsclicked(false);
jb[i][j].setText("");
// 默認(rèn)是無雷
jb[i][j].setBomb(false);
// 默認(rèn)初始狀態(tài)值為0
jb[i][j].setBombflag(0);
}
}
}
// 布雷的個(gè)數(shù)
int i = 0;
// 定義坐標(biāo)
int x, y;
while (i < 10) {
x = random.nextInt(WITH);
y = random.nextInt(LENG);
// 判斷這個(gè)地方是否有雷 默認(rèn)沒有
if (!jb[x][y].isBomb()) {
// 設(shè)置為有雷
jb[x][y].setBomb(true);
// 查看是否有重復(fù)的
// 查看坐標(biāo)位置 其中y對(duì)應(yīng)的是列 x對(duì)應(yīng)的是行 從0-9
System.out.println(x + " " + y);
i++;
}
}
}
// 通過點(diǎn)擊事件來判斷游戲的進(jìn)展
// 點(diǎn)擊事件
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj instanceof Bomb) {
Bomb bs = (Bomb) obj;
// 如果得到的狀態(tài)是1 即紅旗 結(jié)束點(diǎn)擊事件
if (bs.getBombflag() == 1) {
return;
}
// 如果得到的狀態(tài)是2 即“?”
else if (bs.getBombflag() == 2) {
// 點(diǎn)擊一下將問號(hào)去除
bs.setIsclicked(true);
bs.setIcon(null);
}
// 如果點(diǎn)到的是雷
if (bs.isBomb()) {
// 緩沖圖片對(duì)象
BufferedImage bf1 = new BufferedImage(35, 35,
BufferedImage.TYPE_INT_RGB);
// 通過緩存圖片對(duì)象,來得到畫筆工具對(duì)象Graphics,對(duì)緩存圖片進(jìn)行修改
Graphics grap = bf1.getGraphics();
// 先讀到這幅圖片
Image image;
try {
image = ImageIO.read(new File("./image/地雷.png"));
// 然后通過畫筆對(duì)象來改變它,將這幅圖片進(jìn)行縮放
grap.drawImage(image, 0, 0, 35, 35, null);
// 將圖片設(shè)置為雷
bs.setIcon(new ImageIcon(bf1));
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
// 游戲結(jié)束
flag = true;
// 顯示所有的雷
try {
showMine();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 彈出一個(gè)窗口對(duì)話框顯示游戲結(jié)束 結(jié)束點(diǎn)擊事件
JOptionPane.showMessageDialog(this, "掃雷失敗!");
return;
}
// 沒有點(diǎn)到雷時(shí)
// 通過算法判斷是否有雷 來判斷周圍雷的情況
judge(bs.getNum_x(), bs.getNum_y());
}
}
// 重新開始游戲
private void resetGame() {
flag = true;
Red_Count = 10;
time.setText("0");
usedTime = 0;
redFlag.setText("10");
makeMines(false);
// 將游戲外觀設(shè)為初始
for (int i = 0; i < WITH; i++) {
for (int j = 0; j < LENG; j++) {
jb[i][j].setBackground(null);
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
new Thread(runnable).start();
flag = false;
}
// 如果點(diǎn)到雷,游戲結(jié)束顯示所有雷
// 顯示所有雷的方法
private void showMine() throws Exception {
for (int i = 0; i < WITH; i++) {
for (int j = 0; j < LENG; j++) {
if (jb[i][j].isBomb()) {
// 緩沖圖片對(duì)象
BufferedImage bf1 = new BufferedImage(35, 35,
BufferedImage.TYPE_INT_RGB);
// 通過緩存圖片對(duì)象,來得到畫筆工具對(duì)象Graphics,對(duì)緩存圖片進(jìn)行修改
Graphics grap = bf1.getGraphics();
// 先讀到這幅圖片
Image image = ImageIO.read(new File("./image/地雷.png"));
// 然后通過畫筆對(duì)象來改變它,將這幅圖片進(jìn)行縮放
grap.drawImage(image, 0, 0, 35, 35, null);
jb[i][j].setIcon(new ImageIcon(bf1));
}
}
}
}
// 判斷是否成功
private void checkSuccess() throws Exception {
int count = 0;
for (int i = 0; i < LENG; i++) {
for (int j = 0; j < WITH; j++) {
// 如果是雷 并且這個(gè)地方有紅旗
if (jb[i][j].isBomb() && jb[i][j].getBombflag() == 1) {
// 進(jìn)行累加
count++;
}
}
}
if (count == Mines_Count) {
flag = true;
JOptionPane.showMessageDialog(this, "恭喜你,勝利了!");
sucess = true;
String tm = time.getText();
listtime.add(tm);
writesucess(sucess);
}
}
// 判斷周圍是否有雷
private void judge(int x, int y) {
// 設(shè)置(x,y)這個(gè)位置已經(jīng)點(diǎn)擊 得到這個(gè)位置
jb[x][y].setIsclicked(true);
// 點(diǎn)擊了以后將背景設(shè)置為白色
jb[x][y].setBackground(Color.WHITE);
// 點(diǎn)過的設(shè)置為不可點(diǎn)擊 點(diǎn)擊過設(shè)置為不可用
jb[x][y].setEnabled(false);
// 設(shè)定點(diǎn)擊的這個(gè)點(diǎn)的相對(duì)初始位置是(0,0) 設(shè)定初始周圍雷的個(gè)數(shù)是0
int sx = 0;
int sy = 0;
int mineNumber = 0;
for (int i = 0; i < mv.length; i++) {
sx = x + mv[i][0];
sy = y + mv[i][1];
// 保證所有的坐標(biāo)點(diǎn)都在面板上 判斷那些沒有被點(diǎn)擊過的按鈕
if (sx >= 0 && sx < WITH && sy >= 0 && sy < LENG) {
if (jb[sx][sy].isBomb()) {
// 如果是雷的話
// 顯示的數(shù)字累加 得到(x,y)這個(gè)位置周圍雷的個(gè)數(shù)
mineNumber++;
}
}
}
// 通過遞歸來實(shí)現(xiàn)
if (mineNumber == 0) {
for (int i = 0; i < mv.length; i++) {
sx = x + mv[i][0];
sy = y + mv[i][1];
// 保證所有的坐標(biāo)都對(duì)應(yīng)一個(gè)按鈕
if (sx >= 0 && sx < LENG && sy >= 0 && sy < LENG
&& !jb[sx][sy].isIsclicked()) {
judge(sx, sy);
}
}
} else {
jb[x][y].setFont(new Font("宋體", Font.BOLD, 12));
jb[x][y].setText(String.valueOf(mineNumber));
}
}
// 只有成功了才寫
// 寫一個(gè)方法將成功記錄寫到sucess.txt 文件中
private void writesucess(boolean sucess) throws Exception {
int snum = 0;
// 如果list中沒有元素
readsucess();
if (list.isEmpty()) {
PrintWriter pw = new PrintWriter(new File("./sucess.txt"));
pw.println("游戲結(jié)果\t游戲時(shí)間");
buffer.append("游戲成功" + "\t" + listtime.get(snum));
pw.println(buffer.toString());
pw.close();
snum++;
} else {
PrintWriter pw = new PrintWriter(new File("./sucess.txt"));
for (int i = 0; i < list.size(); i++) {
pw.println(list.get(i));
}
buffer.append("游戲成功" + "\t" + listtime.get(snum));
pw.println(buffer.toString());
pw.close();
snum++;
}
}
private void readsucess() throws Exception {
BufferedReader br = new BufferedReader(new FileReader("./sucess.txt"));
String line = null;
while ((line = br.readLine()) != null) {
list.add(line);
}
br.close();
}
// 建立一個(gè)新的窗口
private void Tongji() throws Exception {
final Frame frame = new Frame("統(tǒng)計(jì)信息");
frame.setBounds(100, 100, 300, 300);
TextArea ta = new TextArea();
ta.setFont(new Font("宋體", Font.BOLD, 15));
ta.setForeground(Color.BLUE);
BufferedReader bf = new BufferedReader(new FileReader(new File(
"./sucess.txt")));
String line = null;
StringBuffer buf = new StringBuffer();
while ((line = bf.readLine()) != null) {
buf.append(line + "\n");
}
ta.setText(buf.toString());
bf.close();
frame.add(ta);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
frame.dispose();
}
});
frame.setResizable(false);
frame.setVisible(true);
}
// 程序執(zhí)行
public static void main(String[] args) throws Exception {
new Saolei();
}
}
總結(jié)
以上是生活随笔為你收集整理的java awt 初始化_Java awt项目开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java swing实现计算器_Java
- 下一篇: 超级酒吧女生Java下载_超真实分享:一