if((mouse_i==bomb_x[i])&&(mouse_j==bomb_y[i])){
gameOver=1;
break;
}
}
if((count[mouse_i*17+mouse_j]==0)&&(gameOver==0)){
clear(mouse_i,mouse_j);
}
repaint();
}
else{
if((gameOver==1||gameWin==1)&&(e.getX()>68&&e.getX()<128&&e.getY()>390&&e.getY()<420)){
System.out.println("fahui");
check=1;
replay=1;
win=0;
gameOver=0;
gameWin=0;
bombCount=60;
repaint();
this.setVisible(false);
Index.panel1.setVisible(true);
}
}
}
}
A.没有返回键
相互讨论,添加replay按钮,点击后所有数据初始化,重新开始回到选择界面。
B.插旗相关函数
查阅相关资料,讨论,最终设定鼠标放在方格上,按空格键插旗。
没有用文本或者是其他方式保存数据,每次用户结束游戏之后,数据没有保存。
因此没办法实现排行榜等数据比较功能。
Java程序语言设计一种可以撰写跨平台应用软件的面向对象的程序设计语言。
在这次的课程设计中不仅检验了我们所学习的知识,也学会了完成一件事情的方法和技巧。
在设计过程中,和同学们相互探讨,相互学习,相互监督。
学会了宽容,学会了理解,课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作、一个必不少的过程.通过这次课程设计,明白除了日常的理论学习,还要多实践,把所学的知识运用在真正的实践上。
而完成课程设计,不仅是对我们学习情况的检验,也是对自己的一次考验。
Index.java
packagesaolei;
importjava.awt.CardLayout;
importjava.awt.Image;
importjavax.swing.ImageIcon;
importjavax.swing.JFrame;
publicclassIndex{
staticIndexPanelpanel1;
staticMyPanelpanel2;
publicstaticvoidmain(String[]args){
JFrameframe=newJFrame();
frame.setSize(546,415+50);
frame.setLocation(300,100);
panel1=newIndexPanel();
panel2=newMyPanel();
frame.add(panel1);//index界面面板
frame.add(panel2);//游戏主面板
ImageIconicon=newImageIcon("Image/rightImage.png");
ImagerightImage=icon.getImage();
frame.setIconImage(rightImage);
frame.addMouseListener(panel1);
panel1.addMouseListener(panel1);
frame.addMouseListener(panel2);
panel2.addMouseListener(panel2);
frame.addKeyListener(panel2);
panel2.addKeyListener(panel2);
frame.setLayout(newCardLayout());
frame.setVisible(true);
}
}
MyPanel.java
packagesaolei;
importjava.awt.BasicStroke;
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.Graphics2D;
importjava.awt.MouseInfo;
importjava.awt.Point;
importjava.awt.event.KeyEvent;
importjava.awt.event.KeyListener;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjavax.swing.JPanel;
publicclassMyPanelextendsJPanelimplementsMouseListener,KeyListener{
staticintreplay=1;//返回后从新开始
intwin=0;//每插一个旗就增一
intgameWin=0;//判断游戏是否赢
privatestaticfinallongserialVersionUID=1L;
staticintgameOver;//判断游戏是否结束
int[]bombFlag=newint[24*17];//bombFlag[]为是否是雷的标志,如果该空格是雷则相应的位置的bombFlag为1,默认为0
int[]count=newint[24*17];//count为此方块周围雷的个数
staticintbombCount=120;
//雷的坐标数组,数值为整数,不是绝对坐标,而是相对坐标
int[]bomb_x=newint[bombCount];
int[]bomb_y=newint[bombCount];
int[]hadFlag=newint[bombCount];//判断是否有插旗
intcheck=1;//判断插旗是否正确
intcheck_x,check_y;//插旗错误定点的相当坐标
int[]clicked=newint[24*17];//判断是否点击过
int[]clearFlag=newint[24*17];//判断是否已经clear过
publicMyPanel(){
//System.out.println(bomb_x[55]);
bombCount=60;
}
publicvoidpaint(Graphicsg){
super.paint(g);
if(replay==1){
for(inti=0;ibomb_x[i]=(int)(Math.random()*24-0.1);
bomb_y[i]=(int)(Math.random()*16-0.1);
hadFlag[i]=0;
}
for(inti=0;i<24*17;i++){
bombFlag[i]=0;
count[i]=0;
clicked[i]=0;
clearFlag[i]=0;
}
}
//设置画笔的宽度
Graphics2Dg2D=(Graphics2D)g;
g2D.setStroke(newBasicStroke(3f));
//画雷上的遮盖物
for(inti=0;i<24;i++){
for(intj=0;j<17;j++){
//将所有的方格都初始化为非炸弹
bombFlag[i*17+j]=0;
//注意这里是用或,否则同行,同列将都会被现实出来
if(clicked[i*17+j]==0){
g.setColor(newColor(150,230,250));
g.fillRect(22*i+2,22*j+2,20,20);
}
}
}
//布雷,雷的个数为bombCount
for(inti=0;i//bomb_x和bomb_y分别为炸弹的列数和行数,都是从0开始
g.setColor(Color.red);
g.fillOval(22*bomb_x[i]+2,22*bomb_y[i]+2,20,20);
if(hadFlag[i]==1){
g.setColor(Color.green);
g.fillRect(22*bomb_x[i]+8,22*bomb_y[i]+8,10,8);
g.setColor(Color.white);
g.fillRect(22*bomb_x[i]+8,22*bomb_y[i]+8,2,12);
}
bombFlag[bomb_x[i]*17+bomb_y[i]]=1;
}
//计算当前方块周围有几个雷,再写出来
//注意数组下表越界不会报错但是运行不了
g.setColor(Color.black);
for(inti=0;i<24;i++){
for(intj=0;j<17;j++){
count[i*17+j]=0;
if((i-1>=0)&&(j-1>=0)
&&(bombFlag[(i-1)*17+(j-1)]==1)){
count[i*17+j]++;
}
if((j-1>=0)&&(bombFlag[i*17+(j-1)]==1)){
count[i*17+j]++;
}
if((i+1<=23)&&(j-1>=0)
&&(bombFlag[(i+1)*17+(j-1)]==1)){
count[i*17+j]++;
}
if((i+1<=23)&&(bombFlag[(i+1)*17+j]==1)){
count[i*17+j]++;
}
if((i+1<=23)&&(j+1<=16)
&&(bombFlag[(i+1)*17+(j+1)]==1)){
count[i*17+j]++;
}
if((j+1<=16)&&(bombFlag[i*