基于JAVA的扫雷游戏课程设计

基于JAVA的扫雷游戏课程设计基于JAVA的扫雷小游戏一、引言本次课程设计目的在于设计开发一个类似windows自带扫雷游戏的小游戏,实现基本的扫雷面板及扫雷的游戏功能、游戏数据存储、游戏计时等功能。

设计采用Windows下的eclipse开发工具由本人独立完成。

二、系统设计本游戏采用快速原型模型的软件开发方法设计,总共经历了八个版本的修改最终完成设计要求。

在第一个版本中,实现如下功能:基于JFrame的扫雷框架的建立:使用JFrame建立起如图的所示的程序框架,雷区为12*12,添加JPanel和JButton,采用setBounds的布局方式而非内置的布局方法。

基于Random方法的虚拟雷盘的建立和动态修改:通过Random产生出一个14*14的数组,其中,二维数组边缘对应边框标记值为2,产生的雷点标记为1,普通点标记为0。

再次建立一个12*12的数组对应实际的游戏面板,初始值为0,遍历14*14的数组中非边缘的元素,将每个格子周围的地雷数目赋值给对应的12*12数组,地雷仍然用-1来表示,最后遍历12*12的数组同时把数组中非0非-1的数绘制到JPanel上,值为-1的元素向面板对应位置添加一个地雷的图片(注:地雷图片来自Windows7自带扫雷游戏的截图)。

基于Button的雷区覆盖面板建立以及虚拟雷盘的ActionListener的连接:将生成好的底板覆盖上12*12的Button 并且为每个Button添加ActionListener,实现点击后隐藏对应的Button功能。

结果如下图:重新开始及其按键功能的实现:通过“重新开始”按键重新生成雷区以及重新覆盖Button到所有格子。

关于按键及其功能:通过“关于”按键弹出一个MessageDialog。

在第二个版本中,实现如下功能:新增利用递归算法实现的一次点开一片区域功能:通过数据结构中的走迷宫算法在按键监听中加入了连锁点亮的算法,点亮该格,然后依次遍历12*12表的周围9格,发现为空格即递归调用遍历算法,发现数字即点亮该格并return,初步实现了如图所示的功能:新增虚拟访问判定表的建立和刷新及修改:即通过查找已标记的正确的雷并且计数,如果达到了设定了雷的最大值即执行游戏结束的方法。

新增失败提示框和自动刷新功能:即点亮了地雷的区域后,自动弹出对话框提示失败并且执行游戏结束的方法。

对原boom表进行了改动,解决了虚拟表和实际表的下标错位问题将原12*12的数组扩充到14*14。

在第三个版本中,实现如下功能:修复了一个导致重新开始后第一行雷点位置不变的BUG:重写游戏结束的算法,改变循环的起始点,使其可以正确生成虚拟的雷点。

新增了右键标记、取消雷点的功能:为每个Button添加了MouseListener 从而实现了当点击鼠标右键时可以修改Button上文字,显示为雷,并且当该Button已经显示了雷的时候再次右键该Button可以取消文字显示。

在第四个版本中,实现如下功能:调整了按键监听的点亮区域算法,当且仅当点击处周围没有地雷时才会触发openButton()算法,否则仅显示当前区域,提高了游戏性:重写了Button的ActionListener,按条件区分是否执行递归点亮算法,当且仅当单击区域为空的时候才执行点亮算法,否则仅点亮该区域。

新增了基于System.currentTimeMillis()的计时器功能,计时器与重新开始游戏对应同步更新:通过在游戏开始时获取一个currentTimeMillis()以及实时监控并刷新计时器窗口的值为当前时间减去初始时间除以1000,为节约内存,单独为计时器开辟了一个线程,每工作一次该线程休息0.5秒。

在第五个版本中,实现如下功能:更改了获胜和失败后的提示信息:将本次游戏时间加入了游戏结束时的提示窗口。

新增了“记录”窗体的框架和面板:增加了一个新的JFrame,对应“记录”按钮。

在第六个版本中,实现如下功能:再次改进了按键监听的点亮区域算法:进行递归遍历时将正相邻和斜相邻两种情况分开,使斜相邻的地雷值为0的格子不再会被自动点亮,提高了游戏性,至此版本为止,该算法已经完全符合预期要求。

游戏后台新加入了recordlist类,用来存储和处理光荣榜的数据:该类拥有10条记录以及插入新数据到对应位置的功能。

对记录窗体的改动:通过取消设定recordFrame类的mainframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);以及设定recFrame.hide();方法解决了关闭窗口时导致的程序异常终止的错误。

在第七个版本中,实现如下功能:记录的读取与存储:通过ObjectOutputStream和ObjectInputStream成功实现了对光荣榜文件的存取功能。

并且重新定义了上一版本的光荣榜信息控件,增加了获胜时修改光荣榜并且自动保存文件的功能,同时新增nameInput窗口类到游戏结束时并且成绩足以进入光荣榜时调用的方法中,用于输入获取进入光荣榜的玩家信息。

在最终版本中,实现如下功能:记录与游戏的同步措施:通过更改FileOutputStream的实现位置到nameInputer中的actionListener 中并且将recordlist和usedTime以参数形式通过构造函数传入nameInputer类中成功实现了光荣榜数据文件的存取。

三、系统实现Sweeper类:import java.awt.event.*;import javax.swing.*;import java.awt.*;import java.util.Random;import java.io.*;public class sweeper{Button boom[][] = new Button[14][14];int visualBoom[][] = new int[14][14];int visitTest[][] = new int[14][14];int numOfBoom = 0;Label timeLabel = new Label();timeRunnable runnable = new timeRunnable();Thread timeThread = newThread(runnable);long startTime;long usedTime;JFrame mainframe;myPanel panel;Image boomImage = newImageIcon("boom.jpg").getImage();recordlist list = new recordlist();JButton startButton;JButton aboutButton;JButton recordButton;//类的属性void createWindow(){//创建基础框架mainframe = new JFrame("扫雷");panel = new myPanel();//框架及面板startButton = new JButton();startButton.setText("重新开始");startButton.setFont(new Font("楷书",Font.ITALIC,15));startButton.setFocusPainted(false);startButton.addActionListener(new startListener());aboutButton = new JButton();aboutButton.setText("关于");aboutButton.setFont(new Font("楷书",Font.ITALIC,15));aboutButton.setFocusPainted(false);aboutButton.addActionListener(new aboutListener());recordButton = new JButton();recordButton.setText("记录");recordButton.setFont(new Font("楷书",Font.ITALIC,15));recordButton.addActionListener(new recordListener());recordButton.setFocusPainted(false);//按钮timeLabel.setBounds(350, 220, 30, 30);timeLabel.setBackground(Color.white);startTime =System.currentTimeMillis();timeThread.start();panel.setLayout(null);panel.setBackground(Color.BLACK);startButton.setBounds(320, 40, 100, 30);panel.add(startButton);recordButton.setBounds(320,100,100,30) ;panel.add(recordButton);aboutButton.setBounds(320,160,100,30);panel.add(aboutButton);panel.add(timeLabel);mainframe.setSize(450, 340);mainframe.setVisible(true);mainframe.setDefaultCloseOperation(JFr ame.EXIT_ON_CLOSE);mainframe.add(panel);//框架布局}void setBoom()//生成虚拟雷盘的雷区{for(int row = 0;row<14;row++)for(int col = 0;col<14;col++){boom[row][col] = new Button();visualBoom[row][col] = 0;}//初始化雷区for(int i = 0;i<14;i++){visualBoom[0][i] = -2;visualBoom[i][0] = -2;visualBoom[i][13] = -2;visualBoom[13][i] = -2;}//虚拟雷盘封边int x,y;Random r = new Random();for(int count = 0;count<16;){x = r.nextInt(12);y = r.nextInt(12);if(visualBoom[x+1][y+1] == 0){visualBoom[x+1][y+1] =-1;count++;}}}//生成地雷,边缘:-2 雷点:-1 正常点:0void handleBoom(){//炸弹信息转化int temp[][] = new int[14][14];for(int row = 0;row<14;row++)for(int col = 0;col<14;col++){temp[row][col] = visualBoom[row][col];}for(int row = 1;row<13;row++)for(int col = 1;col<13;col++){temp[row][col] = countBoom(row,col);}numOfBoom = 0;visualBoom = temp;}int countBoom(int x,int y){//周围炸弹计数器int count = 0;if(visualBoom[x][y] != -1){if(visualBoom[x-1][y-1] == -1)count++;if(visualBoom[x][y-1] == -1)count++;if(visualBoom[x+1][y-1] == -1)count++;if(visualBoom[x+1][y] == -1)count++;if(visualBoom[x+1][y+1] == -1)count++;if(visualBoom[x][y+1] == -1)count++;if(visualBoom[x-1][y+1] == -1)count++;if(visualBoom[x-1][y] == -1)count++;}elsecount = -1;return count;}//雷:-1 雷数:(int)void showButton()//加入雷区按钮到面板上{for(int row = 1;row<13;row++)for(int col = 1;col<13;col++){boom[row][col].setBounds((row-1)*25, (col-1)*25, 25, 25);boom[row][col].setFocusable(false);boom[row][col].addActionListener(new buttomListener(row,col));boom[row][col].addMouseListener(new rightClick(row,col));panel.add(boom[row][col]);}}class myPanel extends JPanel{//面板内部类public void paintComponent(Graphics g){g.setColor(Color.gray);g.fillRect(0, 0, 300, 300);g.setColor(Color.black);for(int line =0;line<=300;line+=25)g.drawLine(line, 0, line, 300);for(int row =0;row<=300;row+=25)g.drawLine(0, row, 300, row); //绘制基本格g.setFont(new Font("楷书",Font.ITALIC,13));g.drawString("MineSweeper Ver3.0", 305, 20); //绘制版本信息g.drawString("时间",310,240);for(int row = 1;row<13;row++)for(int col =1;col<13;col++){if(visualBoom[row][col]!=-1 && visualBoom[row][col]!=0)g.drawString(Integer.toString(visualBo om[row][col]), (row-1)*25+8, (col-1)*25+20);elseif(visualBoom[row][col]==-1){g.drawImage(boomImage,(row-1)*25,(col-1)*25,25,25,this);}}}}//面板绘图class buttomListener implements ActionListener{ //各种监听器int row,col;buttomListener(int x,int y){row = x;col = y;}public voidactionPerformed(ActionEvent e) {if(visualBoom[row][col]==0){refreshVisitTest();openButton(row,col);}elseif(visualBoom[row][col] != -1){boom[row][col].setVisible(false);}else{boom[row][col].setVisible(false);gameOver(0);}numOfBoom = 0;for(int row = 1;row<13;row++)for(int col =1;col<13;col++)if(boom[row][col].getLabel() == "雷")numOfBoom++;if(numOfBoom == 16)gameOver(1);}}class rightClick implements MouseListener{int row,col;rightClick(int x,int y){row = x;col = y;}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stubif(e.getButton() == MouseEvent.BUTTON3){if(boom[row][col].getLabel() != "雷"){boom[row][col].setLabel("雷");numOfBoom = 0;for(int row =1;row<13;row++)for(int col =1;col<13;col++)if(boom[row][col].getLabel() == "雷")numOfBoom++;if(numOfBoom == 16)gameOver(1);}elseboom[row][col].setLabel("");}}@Overridepublic void mouseEntered(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stub}@Overridepublic voidmouseReleased(MouseEvent e) {// TODO Auto-generated method stub}}void refreshVisitTest(){//重置访问标记表for(int row = 1;row<13;row++)for(int col = 1;col<13;col++){visitTest[row][col] = 0;}//访问标记置0for(int i = 0;i<14;i++){visualBoom[0][i] = 1;visualBoom[i][0] = 1;visualBoom[i][13] = 1;visualBoom[13][i] = 1;}//边缘访问标记置1}class startListener implements ActionListener{public voidactionPerformed(ActionEvent e) {for(int row = 1;row<13;row++)for(int col =1;col<13;col++){boom[row][col].setVisible(true);boom[row][col].setLabel("");visualBoom[row][col] = 0;}int x,y;Random r = new Random();for(int count = 0;count<16;){x = r.nextInt(12);y = r.nextInt(12);if(visualBoom[x+1][y+1] == 0){visualBoom[x+1][y+1] = -1;count++;}}handleBoom();startTime =System.currentTimeMillis();panel.repaint();System.out.println("");System.out.println("");System.out.println("");System.out.println("");for(int row = 1;row<13;row++){System.out.println(" ");for(int col =1;col<13;col++){if(visualBoom[col][row]!=-1)System.out.print(visualBoom[col][row]+ " ");elseSystem.out.print("* ");}}}}class recordListener implements ActionListener{@Overridepublic voidactionPerformed(ActionEvent arg0) {recordFrame rec = new recordFrame();rec.createWindow();}}class aboutListener implements ActionListener{public voidactionPerformed(ActionEvent e) {JOptionPane.showMessageDialog(mainfram e.getContentPane(),"制作人: 滨江学院2011级软件工程1班王琢", "关于", RMATION_MESSAGE);}}void openButton(int x,int y){//响应鼠标事件visitTest[x][y] = 1;//访问标记置1boom[x][y].setVisible(false);if(visualBoom[x][y] != -1){if(visualBoom[x-1][y-1] != -1)boom[x-1][y-1].setVisible(false);if(visualBoom[x][y-1] == 0 && visitTest[x][y-1] == 0)openButton(x,y-1);else if(visualBoom[x][y-1] != -1)boom[x][y-1].setVisible(false);if(visualBoom[x+1][y-1] != -1)boom[x+1][y-1].setVisible(false);if(visualBoom[x+1][y] == 0 && visitTest[x+1][y] == 0)openButton(x+1,y);else if(visualBoom[x+1][y] != -1)boom[x+1][y].setVisible(false);if(visualBoom[x+1][y+1] != -1)boom[x+1][y+1].setVisible(false);if(visualBoom[x][y+1] == 0 && visitTest[x][y+1] == 0)openButton(x,y+1);else if(visualBoom[x][y+1] != -1)boom[x][y+1].setVisible(false);if(visualBoom[x-1][y+1] != -1)boom[x-1][y+1].setVisible(false);if(visualBoom[x-1][y] == 0 && visitTest[x-1][y] == 0)openButton(x-1,y);elseif(visualBoom[x-1][y] != -1)boom[x-1][y].setVisible(false);}else{gameOver(0);}}class timeRunnable implements Runnable{//计时器专用线程@Overridepublic void run() {while(true){timeLabel.setText(Long.toString((Syste m.currentTimeMillis()-startTime)/1000));usedTime =(System.currentTimeMillis()-startTime)/1000 + 1;try{Thread.sleep(500);}catch(Exception ex){}}}}void gameOver(int isWin){//游戏结束if(isWin == 0){JOptionPane.showMessageDialog(mainfram e.getContentPane()," 胜败乃兵家常事,大侠请重新来过!\n 本次游戏用时:" + usedTime + "秒", "YouLose!",RMATION_MESSAGE);startButton.doClick();}else{JOptionPane.showMessageDialog(mainfram e.getContentPane()," 恭喜您!没有什么地雷能逃过您的火眼金睛\n 本次游戏用时:" + usedTime + "秒", "YouWin!", RMATION_MESSAGE);try{ObjectInputStream in = new ObjectInputStream(newFileInputStream("record.wz"));list =(recordlist)in.readObject();in.close();if(usedTime<=list.getLowestScore());nameInputer nameinputer = newnameInputer(list,usedTime);}catch(Exception e){}startButton.doClick();}}public static void main(String [] args){ sweeper main = new sweeper();main.setBoom();main.handleBoom();main.createWindow();main.showButton();for(int row = 1;row<13;row++){System.out.println(" ");for(int col = 1;col<13;col++){if(main.visualBoom[col][row]!=-1)System.out.print(main.visualBoom[col][ row]+" ");elseSystem.out.print("* ");}}}} recordFrame类:import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener; import java.io.*;import javax.swing.*;public class recordFrame implements Serializable{JFrame recFrame;recPanel recpanel;JButton close = new JButton("关闭");recordlist list;void createWindow(){recFrame = new JFrame("光荣榜");recpanel = new recPanel();recpanel.setLayout(null);close.addActionListener(new closeListener());close.setBounds(50, 230, 80, 20);recpanel.add(close);recFrame.setSize(200, 300);recFrame.setVisible(true);recFrame.add(recpanel);}class closeListener implements ActionListener{@Overridepublic voidactionPerformed(ActionEvent arg0) {recFrame.hide();}}class recPanel extends JPanel{public void paintComponent(Graphics g){g.drawString("姓名", 25, 20);g.drawString("耗时", 125, 20);try{ObjectInputStream in = new ObjectInputStream(newFileInputStream("record.wz"));list =(recordlist)in.readObject();in.close();for(int pos =0;pos<10;pos++){g.drawString([pos], 25,20*(pos+2));g.drawString(Long.toString(list.score[ pos]), 125, 20*(pos+2));}}catch(Exception e){e.printStackTrace();}}}}recordList类:import java.io.*;public class recordlist implements Serializable{//光荣榜存储类public String name[];public long score[];public recordlist(){//构造函数name = new String[10];score = new long[10];for(int i = 0;i<10;i++){name[i] = "王琢";score[i] = 999;}}long getLowestScore(){//返回榜内最长时间return score[9];}long getHighestScore(){return score[0];}void insertValue(String n,long s){//插入新元素int i = 0;long temp;String ntemp;while(s>score[i]){i++;}do{temp = score[i];ntemp = name[i];score[i] = s;name[i] = n;s = temp;n = ntemp;i++;}while(i<10);}}nameInputer类:import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.FileOutputStream;import java.io.ObjectOutputStream;import javax.swing.*;public class nameInputer {JFrame frame;JPanel panel;JTextField text;JButton button;JLabel label;String name;recordlist mylist;long usedtime;nameInputer(recordlist list,long time){ frame = new JFrame("新纪录");frame.setSize(300, 180);panel = new JPanel();text = new JTextField();text.setBounds(145, 30, 60, 20);button = new JButton("确定");button.addActionListener(new buttonlistener());button.setBounds(80, 70, 100, 20);label = new JLabel("请留下您的尊姓大名:");label.setBounds(20, 30, 120, 20);panel.setLayout(null);panel.add(text);panel.add(button);panel.add(label);frame.add(panel);frame.setVisible(true);mylist = list;usedtime = time;}String getName(){return ;}recordlist getList(recordlist list){return list;}class buttonlistener implements ActionListener{public void actionPerformed(ActionEvent e) {name = text.getText();mylist.insertValue(name, usedtime);try{ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("record.wz"));out.writeObject(mylist);out.close();}catch(Exception ex){}frame.hide();}}}软件截图:四、结束语经过了近一周的不断努力和改进,终于完成了这个扫雷的小游戏,通过这次程序设计我深切体会了JAVA相对于C语言的便捷性以及多态与封装的优越性,同时也深深体会到软件工程基础知识对软件开发的重要性,亲身体会了一次从策划到初步实施到不断完善的开发程序过程,为今后的程序开发积累的宝贵的经验。

合集下载

简单扫雷java课程设计框图

简单扫雷java课程设计框图

简单扫雷java课程设计框图一、课程目标知识目标:1. 学生能理解Java基础语法,掌握面向对象编程的基本概念。

2. 学生能掌握简单扫雷游戏的逻辑设计,包括二维数组的使用、随机数的生成。

3. 学生能运用Java编程实现简单扫雷游戏的界面布局与功能。

技能目标:1. 学生能够运用所学知识,独立设计并编写简单扫雷游戏的框图和代码。

2. 学生能够运用调试工具,找出并修正编程过程中的错误。

3. 学生能够通过小组合作,培养团队协作能力和沟通能力。

情感态度价值观目标:1. 学生通过学习Java编程,培养解决问题的能力和创新思维。

2. 学生在游戏编程过程中,体验编程的乐趣,激发对计算机科学的兴趣。

3. 学生在团队合作中,学会尊重他人意见,培养良好的团队精神和沟通能力。

本课程针对初中年级学生,结合学科特点,注重培养学生的编程兴趣和实际操作能力。

课程以Java编程语言为基础,通过设计简单扫雷游戏,让学生在实践过程中掌握编程知识和技巧。

课程目标明确,可衡量,旨在帮助学生将所学知识应用于实际项目中,提高学生的编程能力和团队协作能力。

二、教学内容1. Java基础语法复习:变量、数据类型、运算符、控制结构(条件语句、循环语句)。

2. 面向对象编程基础:类与对象、构造方法、属性、方法。

3. 二维数组:定义、初始化、遍历、访问。

4. 随机数生成:Random类、Math类。

5. 简单扫雷游戏逻辑设计:游戏规则、雷区生成、扫雷功能、标记功能。

6. 界面布局与设计:使用Java Swing库,掌握JFrame、JButton、JLabel等组件的使用。

7. 事件处理:鼠标点击事件、键盘事件。

8. 游戏功能实现:编写代码实现游戏逻辑、界面交互、胜利条件判断。

教学内容根据课程目标进行选择和组织,以课本为依据,结合学生实际水平,确保科学性和系统性。

教学大纲明确教学内容安排和进度,分为八个部分,循序渐进地引导学生学习。

教学内容涵盖Java编程基础、面向对象编程、数组、随机数生成等,以及简单扫雷游戏的设计与实现,旨在帮助学生将所学知识应用于实际项目中,提高编程技能。

java扫雷课程设计

java扫雷课程设计

java 扫雷 课程设计一、课程目标知识目标:1. 理解并掌握Java基本语法和程序结构;2. 学会使用二维数组存储和处理扫雷游戏的数据;3. 掌握循环、条件判断等基本编程逻辑;4. 了解随机数的生成和应用。

技能目标:1. 能够编写并调试简单的Java程序;2. 能够运用所学知识设计并实现扫雷游戏的初级版本;3. 提高问题分析、程序设计和编程实现的能力;4. 培养团队协作和沟通表达能力。

情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发学习积极性;2. 培养学生勇于尝试、面对挑战的精神;3. 增强学生的逻辑思维能力和解决问题的自信心;4. 引导学生关注程序设计在现实生活中的应用,认识到编程的价值。

课程性质分析:本课程为中学信息技术课程,结合Java编程语言和扫雷游戏设计,旨在提高学生的编程兴趣和实际操作能力。

学生特点分析:初中年级学生对新鲜事物充满好奇,具备一定的逻辑思维能力,但编程基础薄弱,需要通过实际操作和趣味性强的案例来提高学习兴趣。

教学要求:1. 注重理论与实践相结合,让学生在实际操作中掌握Java编程知识;2. 采用任务驱动法,引导学生主动探究和解决问题;3. 创设有趣的游戏场景,提高学生的学习积极性;4. 分阶段教学,逐步提高学生编程能力和逻辑思维能力。

二、教学内容1. Java基本语法与程序结构- 数据类型、变量、常量- 运算符、表达式、语句- 程序流程控制(顺序、分支、循环)2. 二维数组的使用- 二维数组的定义、初始化- 遍历二维数组- 二维数组的应用场景3. 编程逻辑- 循环结构(for、while)- 条件判断(if、else、switch)- 随机数的生成与应用4. 扫雷游戏设计与实现- 游戏规则及界面设计- 二维数组存储雷区数据- 排雷逻辑实现- 游戏胜负判断5. 编程实践- 设计并编写扫雷游戏代码- 调试与优化程序- 团队协作与分享教学内容安排与进度:第1-2课时:Java基本语法与程序结构第3课时:二维数组的使用第4课时:编程逻辑第5-6课时:扫雷游戏设计与实现第7课时:编程实践与总结教材章节关联:《Java编程基础》第1章:Java概述《Java编程基础》第2章:数据类型与运算符《Java编程基础》第3章:控制流程《Java编程基础》第4章:数组与方法《Java编程基础》第5章:面向对象编程(部分内容)教学内容科学性和系统性:确保教学内容符合学科知识体系,由浅入深,让学生逐步掌握Java编程基础知识,并通过实际案例将所学知识应用于实践。

java课程设计扫雷

java课程设计扫雷

java课程设计扫雷一、课程目标知识目标:1. 让学生掌握Java基础语法,包括变量声明、数据类型、运算符和流程控制语句;2. 培养学生运用面向对象编程思想,掌握类与对象的基本概念,以及继承、封装和多态等特性;3. 通过扫雷游戏的案例,让学生学会使用二维数组处理游戏逻辑。

技能目标:1. 培养学生运用所学知识独立编写程序的能力,实现扫雷游戏的主体功能;2. 提高学生分析问题、解决问题的能力,学会运用模块化思维进行编程;3. 培养学生团队协作意识,学会在项目中分工合作、共同完成项目。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发学习热情,形成积极向上的学习态度;2. 培养学生面对困难敢于挑战、勇于克服的精神,增强自信心;3. 培养学生遵守编程规范,养成良好的编程习惯。

本课程针对高年级学生,在已有Java基础知识的基础上,通过设计扫雷游戏项目,使学生在实践中巩固和提高所学知识。

课程注重培养学生的编程技能、团队协作能力和解决实际问题的能力,同时关注学生的情感态度价值观培养,使学生在轻松愉快的氛围中学习编程。

课程目标具体、可衡量,为教学设计和评估提供明确方向。

二、教学内容1. Java基础语法复习:变量声明、数据类型、运算符、流程控制语句(包括条件语句、循环语句等);2. 面向对象编程:类与对象、构造方法、继承、封装、多态;3. 二维数组:声明、初始化、遍历、应用;4. 游戏设计原理:游戏循环、事件处理、界面设计;5. 扫雷游戏项目开发:需求分析、模块划分、编码实现、测试与优化。

教学内容参考教材相关章节,结合课程目标进行组织。

教学大纲安排如下:1. 复习Java基础语法(1课时);2. 面向对象编程知识讲解与练习(2课时);3. 二维数组知识讲解与练习(1课时);4. 游戏设计原理介绍(1课时);5. 扫雷游戏项目开发:需求分析、模块划分(1课时);6. 扫雷游戏项目开发:编码实现、测试与优化(3课时)。

扫雷java课程设计

扫雷java课程设计

扫雷java课程设计一、课程目标知识目标:1. 掌握Java基础语法,包括数据类型、运算符、控制流程等;2. 学会使用Java进行面向对象编程,理解类与对象的关系,掌握封装、继承、多态等概念;3. 了解Java图形用户界面(GUI)设计,掌握Swing组件的使用;4. 学会使用Java异常处理,提高程序的稳定性和可靠性;5. 掌握扫雷游戏的逻辑设计和实现。

技能目标:1. 能够运用Java编写简单的程序,实现基础功能;2. 能够运用面向对象思想进行问题分析,设计合理的类和对象;3. 能够独立完成扫雷游戏的编写,具备一定的编程实践能力;4. 能够运用所学知识解决实际问题,具备一定的创新和拓展能力。

情感态度价值观目标:1. 培养学生对编程的兴趣,激发学习动力;2. 培养学生良好的编程习惯,注重代码规范和优化;3. 培养学生面对问题积极思考、独立解决的能力,增强自信心;4. 培养学生团队合作精神,学会沟通与协作。

课程性质:本课程为Java语言编程实践课程,以项目为导向,注重培养学生的编程能力和实际操作能力。

学生特点:学生具备一定的计算机基础,了解编程基本概念,但对Java语言和面向对象编程尚不熟悉。

教学要求:结合学生特点,采用案例教学,由浅入深地引导学生掌握Java编程技能,注重实践操作,提高学生编程水平。

同时,关注学生情感态度价值观的培养,使学生在学习过程中形成积极、主动的学习态度。

通过课程学习,将目标分解为具体的学习成果,便于后续教学设计和评估。

二、教学内容1. Java基础语法:- 数据类型与变量- 运算符与表达式- 控制流程(if条件语句、for循环、while循环)- 数组的使用2. 面向对象编程:- 类与对象- 封装、继承、多态- 抽象类与接口- 包的使用3. Java图形用户界面设计:- Swing组件基本使用- 布局管理器- 事件处理机制4. 异常处理:- 异常的概念与分类- try-catch-finally结构- 自定义异常5. 扫雷游戏设计与实现:- 游戏逻辑分析- 界面设计- 功能模块编写(如:初始化雷区、计算周围雷数、标记与挖雷等)- 游戏测试与优化教学内容安排与进度:第一周:Java基础语法学习第二周:面向对象编程基础第三周:Java图形用户界面设计第四周:异常处理与扫雷游戏逻辑分析第五周:扫雷游戏功能模块编写与测试本教学内容根据课程目标,结合教材章节进行选择和组织,确保内容的科学性和系统性。

基于Java的扫雷课程设计

基于Java的扫雷课程设计

《算法设计与分析》课程设计扫雷游戏设计班级计科1003班姓名指导教师开发时间2012.12.18湖南涉外经济学院信息科学与工程学院2012年12月摘要扫雷游戏是Windows操作系统自带的一个小游戏,过去的几年里Windows 操作系统历经数次换代,变得越来越庞大、复杂,但这个可爱的小游戏在任何版本的Windows操作系统里去地依然保持着原貌。

但几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。

游戏上手极其简单,但是要熟练地掌握其中的操作及找出雷的技巧,难度却不低。

作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。

游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键则方块会以未标示→标示→疑似三者关系不断循环。

游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若翻开的方块显示数字“3”,则表示以其为中心的周边方块内藏有3个地雷。

当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。

扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多不同算法和语言实现,如 C,C++,VB,Jave,C#等。

本论文研究的是以java为开发环境,设计并开发一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。

论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为重要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作。

关键词:java;扫雷;课程设计;目录第一章引言 (2)1.1 课题背景及意义 (2)1.2开发的目的以及意义 (2)1.3关于本课题 (3)第二章游戏的总体分析 (4)2.1 游戏功能简介 (4)2.2 扫雷游戏的基本要求 (5)2.3 功能需求分析 (5)第三章游戏的具体分析 (6)3.1 总体功能图 (6)3.2 主要功能设计流程 (7)3.2.1 总体流程图 (7)图3-2-1 总体流程图 (7)3.2.2 雷区设计流程图 (8)3.2.3 排行榜设计流程图 (9)3.3各个类的详细介绍与关键代码 (9)3.3.1 类之间关系图 (9)3.3.2 MainFrame类 (10)3.3.3 LEDNumber类 (12)3.3.4 MineGrid类 (13)3.3.5 AboutDialog类 (13)3.3.6 CustomDialog类 (14)3.3.7 ImageFactory类 (15)3.3.8 UserDialog类 (15)3.3.9 LevelInfo类 (15)3.3.10 LogDialog类 (17)第四章游戏的实现 (19)4.1游戏的初级界面 (19)4.2游戏的中级界面 (20)4.3游戏的高级界面 (21)4.3 游戏的打包发布过程 (22)第五章结论 (24)参考文献 (25)第一章引言1.1 课题背景及意义扫雷最原始的版本可以追溯到1973年一款名为“方块”的游戏。

java扫雷源代码和课程设计

java扫雷源代码和课程设计

java扫雷源代码和课程设计一、课程目标知识目标:1. 学生能理解Java语言中面向对象编程的基本概念,包括类、对象、继承、封装和多态。

2. 学生能掌握Java的基本语法,如条件语句、循环语句、数组的使用。

3. 学生能运用所学知识实现扫雷游戏的逻辑设计。

技能目标:1. 学生通过分析扫雷游戏的规则,能自主设计游戏的类和对象,提升问题分析能力。

2. 学生能编写并调试扫雷游戏的源代码,培养编程实践能力。

3. 学生能通过课堂讨论和协作,提高团队协作和沟通能力。

情感态度价值观目标:1. 学生在探索Java编程的过程中,培养对计算机科学的兴趣和热情。

2. 学生通过解决编程问题,锻炼克服困难的意志,增强自信心。

3. 学生在团队合作中,学会尊重他人意见,培养良好的合作精神和沟通技巧。

课程性质:本课程为信息技术课程,旨在通过实际操作和项目实践,帮助学生掌握Java编程的基本知识和技能。

学生特点:学生处于高年级阶段,具备一定的编程基础和逻辑思维能力,对实际项目开发有较高的兴趣。

教学要求:教师应注重理论与实践相结合,引导学生主动探索,关注学生个体差异,提供针对性的指导。

在教学过程中,关注学生的情感态度,激发学生的学习兴趣,培养其良好的编程习惯和团队合作精神。

通过课程目标的分解和实施,确保学生达到预期的学习成果。

二、教学内容1. 面向对象编程基础:- 类的定义与使用- 对象的创建与操作- 继承、封装和多态的概念与应用2. Java基本语法:- 条件语句(if-else,switch)- 循环语句(for,while,do-while)- 数组的使用与操作3. 扫雷游戏逻辑设计:- 游戏规则分析- 类的设计与实现(如:雷区类、格子类、游戏界面类等)- 游戏逻辑的编写与调试4. 项目实践:- 分组讨论与协作- 源代码编写与调试- 游戏功能测试与优化教学内容安排和进度:1. 第1-2课时:面向对象编程基础,引入类和对象的概念,讲解继承、封装和多态。

复制java扫雷游戏课程设计

复制java扫雷游戏课程设计一、课程目标知识目标:1. 让学生掌握Java基础语法和面向对象编程思想,能运用所学知识编写简单的游戏程序;2. 让学生了解扫雷游戏的基本规则和逻辑,理解游戏设计的基本流程;3. 使学生掌握使用Java进行二维数组操作和基本算法实现。

技能目标:1. 培养学生独立编写Java程序的能力,提高编程实践技能;2. 培养学生分析问题、解决问题的能力,能够将实际问题转化为程序逻辑;3. 培养学生团队协作和沟通能力,能够共同完成一个完整的游戏项目。

情感态度价值观目标:1. 激发学生对编程的兴趣,培养学生主动探究、自主学习的精神;2. 培养学生面对挑战时的坚持和耐心,树立克服困难的信心;3. 培养学生遵守编程规范,养成良好的编程习惯,提高职业道德素养。

课程性质:本课程为实践性较强的编程课程,以项目为导向,注重培养学生的动手能力和实际应用能力。

学生特点:学生具备一定的Java基础,对编程感兴趣,但实践经验不足,需要通过实际项目来提高。

教学要求:教师需引导学生掌握游戏设计的基本原理和编程技巧,注重启发式教学,鼓励学生积极参与讨论和实际操作。

同时,关注学生的个体差异,给予不同学生个性化的指导。

通过本课程的学习,使学生能够独立完成一个Java扫雷游戏的编写,达到预期的学习成果。

二、教学内容1. Java基础语法复习:变量、数据类型、运算符、控制结构(条件语句、循环语句);2. 面向对象编程:类与对象、继承与多态、接口与实现;3. 二维数组:数组声明、初始化,遍历和操作二维数组;4. 游戏设计原理:扫雷游戏规则、界面设计、逻辑实现;5. 编程实践:使用Java编写扫雷游戏的各个模块,如界面展示、地雷生成、翻开格子、标记地雷等;6. 算法实现:查找算法、递归算法等在扫雷游戏中的应用;7. 软件测试:单元测试、集成测试,确保游戏程序的正确性和稳定性;8. 项目实战:分组进行项目开发,按照软件工程流程,完成需求分析、设计、编码、测试和总结。

java扫雷的课程设计

java扫雷的课程设计一、课程目标知识目标:1. 理解Java语言基础,掌握面向对象编程的基本概念;2. 学会使用Java编写简单的图形用户界面(GUI)程序;3. 掌握扫雷游戏的规则和逻辑,了解二维数组的使用;4. 了解随机数的生成与应用。

技能目标:1. 能够运用所学知识,独立设计并编写Java扫雷游戏的代码;2. 培养分析问题、解决问题的能力,将实际问题转化为程序逻辑;3. 提高调试程序、解决问题的实际操作能力;4. 学会与他人合作,共同完成项目任务。

情感态度价值观目标:1. 培养学生对编程的兴趣和热情,激发主动学习的动力;2. 培养学生的耐心和毅力,面对困难时保持积极的态度;3. 培养团队协作精神,学会尊重他人,共同进步;4. 培养良好的编程习惯,注重代码规范和程序优化。

本课程针对的学生特点为具有一定Java基础知识和编程能力的初中生。

在教学过程中,要注意结合学生的实际水平和接受能力,循序渐进地引导他们掌握扫雷游戏的设计与实现。

通过本课程的学习,使学生将理论知识与实践相结合,提高编程技能,培养良好的编程习惯和团队协作精神。

同时,关注学生的情感态度价值观培养,激发学生的学习兴趣,提高他们面对困难的勇气和信心。

最终实现学生能够独立完成Java扫雷游戏的设计与实现,为后续学习奠定基础。

二、教学内容1. Java语言基础回顾:变量、数据类型、运算符、控制流程(条件语句、循环语句);2. 面向对象编程概念:类与对象、方法、属性、构造函数;3. Java GUI编程:Swing组件、事件处理、布局管理;4. 二维数组:定义、初始化、遍历、访问;5. 随机数生成:Random类、随机数在游戏中的应用;6. 游戏设计:扫雷游戏规则、游戏逻辑、界面设计;7. 编程实践:独立编写Java扫雷游戏代码,实现游戏基本功能;8. 团队合作:分组讨论、协作完成项目,分享编程经验;9. 程序调试与优化:代码审查、调试技巧、性能优化。

Java扫雷游戏课程设计实训报告

Java应用技术实训报告一.总体设计本系统共包括3个java源文件和4个图像文件1.类之间的关系如图1.1所示图1.1类之的关系2 . java源文件及其功能如表1所示3.图像文件Bomb.gif :地雷方块上的图标。

questio n.gif :疑惑探雷是否正确。

bomb_big.gif :触雷时方块上的图标。

flag.gif :探雷标记。

、详细设计1 .主类Main(1 )成员变量(见表2)表2成员变量描述变量类型备注游戏运行Mai nBomb 临时变量(2)成员变量(见表3)表3名称功能备注mai n 游戏开始(3)源代码见文件Ma in .javaimport java.awt.*;import java.awt.eve nt.*;import javax.swi ng.*;/*主类*/public class Mai n{public static void main(String args[]) {(new Main Bomb()).show();}}2 .挖雷游戏MainBomb(1 )成员变量(见表4)(2)方法见(表5)(3)源代码见文件MainBomb.javaimport java.awt.*;import java.awt.eve nt.*;import javax.swi ng.*;/*窗口及算法实现类*/class Mai nBomb exte ndsJFrame impleme nts Actio nListe ner,MouseListe nerpublic JTextField text;public Label nowBomb,setBomb;public int BlockNum,BombNum;// 当前方块数当前雷数public Icon icon_bomb = new ImageIcon("Bomb.gif");// 踩雷public Icon icon_bomb_big = new ImageIcon("bomb_big.gif"); // 踩雷标记public Icon icon_flag = new ImageIcon("flag.gif");// 雷标记public Icon icon_question = new ImageIcon("question.gif"); // 疑惑是否有雷public JButton start = new JButton(" 开始");public Panel MenuPamel = new Panel();public Panel mainPanel = new Panel();public Bomb[][] bombButton;/* 界面设计*/public MainBomb(){super(" 成型04-2 李超JAVA 课程设计");BlockNum = 64;BombNum = 10;Container c=getContentPane();c.setBackground(Color.gray);c.setLayout(new BorderLayout());text=new JTextField("10 ",3);nowBomb = new Label(" 当前雷数"+" "+BombNum+"");setBomb= new Label(" 设置地雷数");start.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){BombNum = Integer.parseInt(text.getText().trim());if(BombNum >= 10 && BombNum < 50 )replay();else{JOptionPane msg = new JOptionPane();JOptionPane.showMessageDialog(null," 您设置的地雷数太多了设!"," 错误, 请重",2);}}} );MenuPamel.add(setBomb);MenuPamel.add(text);MenuPamel.add(start);MenuPamel.add(nowBomb);c.add(MenuPamel,"North");mainPanel.setLayout(new GridLayout( (int)Math.sqrt(BlockNum)(int)Math.sqrt(BlockNum)) );bombButton=new Bomb[ (int)Math.sqrt(BlockNum) ][];for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++) {bombButton[ i ]=new Bomb[ (int)Math.sqrt(BlockNum) ];}for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++ ) for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++ ) {bombButton[ i ][ j ]=new Bomb(i,j);bombButton[ i ][ j ].setForeground( Color.gray);bombButton[ i ][ j ].addActionListener(this);bombButton[ i ][ j ].addMouseListener(this);}for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++ )for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++ ) mainPanel.add(bombButton[ i ][ j ]);c.add(mainPanel,"Center");startBomb();setSize(400,400);setLocation(350,200);setResizable(false);}/* 布雷*/public void startBomb()for(int i=0;i<BombNum;i++){int x =(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1));int y =(int)(Math.random()*(int)(Math.sqrt(BlockNum)-1));if(bombButton[ x ][ y ].isBomb==true)i--;elsebombButton[ x ][ y ].isBomb=true ;}}/* 重新开始*/public void replay(){nowBomb.setText(" 当前雷数"+" "+BombNum+"");for(int i = 0 ; i < (int)Math.sqrt(BlockNum) ; i++)for(int j = 0 ; j < (int)Math.sqrt(BlockNum) ; j++){bombButton[ i ][ j ].isBomb=false;bombButton[ i ][ j ].isClicked=false;bombButton[ i ][ j ].setEnabled(true);bombButton[ i ][ j ].setText("");bombButton[ i ][ j ].setIcon(null);}startBomb();}/* 是否挖完了所有的雷*/public void isWin(){int findBomb=0; // 找到的地雷数for(int i=0;i< (int)Math.sqrt(BlockNum); i++)for(int j=0;j< (int)Math.sqrt(BlockNum ); j++){if(bombButton[ i ][ j ].isBomb == true && bombButton[ i ][ j ].isRight== true)findBomb++;}if( findBomb == Integer.parseInt(text.getText().trim()) ){JOptionPane msg = new JOptionPane();JOptionPane.showMessageDialog(this," 您挖完了所有的雷,您胜利了您胜利了",2);}}/* 计算方块周围雷数*/public void CountRoundBomb(){for (int i=0; i< (int)Math.sqrt(BlockNum); i++){for (int j = 0; j < (int)Math.sqrt(BlockNum); j++){int count = 0;// 当需要检测的单元格本身无地雷的情况下,统计周围的地雷个数if (bombButton[ i ][ j ].isBomb != true) {if ( (i - 1 >= 0) && (j - 1 >= 0)) {if (bombButton[i - 1][j - 1].isBomb == true) {count += 1; // 检测左上方空格是否是地雷}}if ( (i - 1 >= 0)) {if (bombButton[i - 1][ j ].isBomb == true) {count += 1; // 检测上方空格是否为地雷}}if ( (i - 1 >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1)) { if (bombButton[i - 1][j + 1] .isBomb == true) {count += 1; // 检测右上方是否为地雷}}if ( (j - 1 >= 0)) {if (bombButton[ i ][j - 1] .isBomb == true) {count += 1; // 检测左边是否为地雷if ( (i >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1)) {if (bombButton[ i ][j + 1].isBomb == true) {count += 1; // 右边}}if ( (j - 1 >= 0) && (i + 1 <= (int)Math.sqrt(BlockNum)-1)) { if (bombButton[i + 1][j - 1].isBomb == true) {count += 1; // 左下}}if ( (i + 1 <= (int)Math.sqrt(BlockNum)-1)) {if (bombButton[i + 1][ j ].isBomb == true) {count += 1; // 下}}if ( (j + 1 <= (int)Math.sqrt(BlockNum)-1) && (i + 1 <= Math.sqrt(BlockNum)-1)) {if (bombButton[i + 1][j + 1].isBomb == true) {count += 1; // 右下}}bombButton[ i ][ j ].BombRoundCount = count;}/** 当选中的位置为空, 则翻开周围的地图**/public void isNull(Bomb[][] bombButton,Bomb ClickecButton){int i,j;i=ClickecButton.num_x;j=ClickecButton.num_y;if (ClickecButton.isBomb==true) {}else {if ( (i - 1 >= 0) && (j - 1 >= 0)) { // 检测左上方空格是否是空if (bombButton[i - 1][j - 1].isBomb == false && bombButton[i - 1][j -1].isClicked == false && bombButton[i - 1][j - 1].isRight == false) {bombButton[i-1][j-1].setText((bombButton[i-1][j-1].BombRoundCount)+"");bombButton[i - 1][j - 1].setEnabled(false);bombButton[i - 1][j - 1].isClicked=true;}}if ( (i - 1 >= 0)) { // 检测上方空格是否为空if (bombButton[i-1][ j].isBomb == false && bombButton[i1][ j ].isClicked == false && bombButton[i - 1][ j ].isRight == false){bombButton[i-1][ j].setText((bombButton[i-1][ j ].BombRoundCount)+"");bombButton[i - 1][ j ].setEnabled(false);bombButton[i - 1][ j ].isClicked=true;if ( (i - 1 >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { // 检测右上方是否为空if (bombButton[i - 1][j + 1] .isBomb == false && bombButton[i - 1][j +1].isClicked == false && bombButton[i - 1][j + 1].isRight == false){bombButton[i - 1][j + 1].setText((bombButton[i - 1][j + 1].BombRoundCount)+"");bombButton[i - 1][j + 1].setEnabled(false);bombButton[i - 1][j + 1].isClicked=true;}}if ( (j - 1 >= 0)) { // 检测左边是否为空if (bombButton[ i ][j - 1].isBomb == false && bombButton[ i ][j - 1].isClicked == false && bombButton[ i ][j - 1].isRight == false) {bombButton[ i ][j - 1].setText((bombButton[ i ][j -1].BombRoundCount)+"");bombButton[ i ][j - 1].setEnabled(false);bombButton[ i ][j - 1].isClicked=true;}}if ( (i >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { // 检测右边空格是否是空if (bombButton[ i ][j + 1].isBomb == false && bombButton[ i ][j +1].isClicked == false && bombButton[ i ][j + 1].isRight == false) {bombButton[ i ][j + 1].setText((bombButton[ i ][j +1].BombRoundCount)+"");bombButton[ i ][j + 1].setEnabled(false);bombButton[ i ][j + 1].isClicked=true;}if ( (j - 1 >= 0) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { // 检测左下空格是否是空if (bombButton[i + 1][j - 1].isBomb == false && bombButton[i + 1][j -1].isClicked == false && bombButton[i + 1][j - 1].isRight == false) {bombButton[i + 1][j - 1].setText((bombButton[i + 1][j - 1].BombRoundCount)+"");bombButton[i + 1][j - 1].setEnabled(false);bombButton[i + 1][j - 1].isClicked=true;}}if ( (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) { // 检测下边空格是否是空if (bombButton[i + 1][ j ].isBomb == false && bombButton[i + 1][ j ].isClicked == false && bombButton[i + 1][ j ].isRight == false) {bombButton[i + 1][ j ].setText((bombButton[i + 1][ j ].BombRoundCount)+"");bombButton[i + 1][ j ].setEnabled(false);bombButton[i + 1][ j ].isClicked=true;}}if ( (j + 1 <= ((int)Math.sqrt(BlockNum)-1) ) && (i + 1 <=((int)Math.sqrt(BlockNum)-1)) ) { // 检测右下边空格是否是空if (bombButton[i + 1][j + 1].isBomb == false && bombButton[i + 1][j +1].isClicked == false && bombButton[i + 1][j + 1].isRight == false){bombButton[i+1][j+1].setText((bombButton[i+1][j+1].BombRoundCo unt)+"");bombButton[i + 1][j + 1].setEnabled(false); bombButton[i + 1][j +1].isClicked=true;}}if ( (i - 1 >= 0) && (j - 1 >= 0))// 检测左上isNull(bombButton,bombButton[i - 1][j - 1]);if ( (i - 1 >= 0))isNull( bombButton,bombButton[i - 1][ j ]);// 检测上方if ( (i - 1 >= 0) && (j + 1 <= (int)Math.sqrt(BlockNum)-1))isNull( bombButton,bombButton[i - 1][j + 1]);// 检测右上if ( (j - 1 >= 0))isNull(bombButton,bombButton[i][j - 1]);// 检测左边if ( (i >= 0) && (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) )isNull(bombButton,bombButton[i][j + 1]);// 检测右边if ( (j - 1 >= 0) && (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) )isNull(bombButton,bombButton[i + 1][j - 1]); // 检测左下if ( (i + 1 <= ((int)Math.sqrt(BlockNum)-1)) ) // 检测下isNull(bombButton,bombButton[i + 1][ j ]);if ( (j + 1 <= ((int)Math.sqrt(BlockNum)-1)) && (i +1 <= ((int)Math.sqrt(BlockNum)-1)) )// 检测右下isNull(bombButton,bombButton[i + 1][j + 1]);}}public void actionPerformed(ActionEvent e){CountRoundBomb();if(((Bomb)e.getSource()).isBomb==false&&((Bomb)e.getSource()).isClicked==false){((Bomb)e.getSource()).setText(( ((Bomb)e.getSource()).BombRoundCount) +"");((Bomb)e.getSource()).isClicked=true;((Bomb)e.getSource()).setIcon(null);((Bomb)e.getSource()).setEnabled(false);if((((Bomb)e.getSource()).BombRoundCount) == 0)isNull(bombButton,(Bomb)e.getSource());isWin();}else if(((Bomb)e.getSource()).isBomb == true){for(int i=0;i<(int)Math.sqrt(BlockNum);i++)for(int j=0;j<(int)Math.sqrt(BlockNum);j++){if(bombButton[ i ][ j ].isBomb == true)bombButton[ i ][ j ].setIcon(icon_bomb);}((Bomb)e.getSource()).setIcon(icon_bomb_big);JOptionPane msg = new JOptionPane();JOptionPane.showMessageDialog(this," 你踩到地雷了,按确定重来"," 你踩到地雷了",2);replay();}}public void mouseClicked(MouseEvent e){Bomb bombSource = (Bomb)e.getSource();boolean right = SwingUtilities.isRightMouseButton(e);if((right == true) && (bombSource.isClicked == false)){bombSource.BombFlag = (bombSource.BombFlag + 1)%3;if(bombSource.BombFlag == 1){if(BombNum > 0 && bombSource.isRight == false ){bombSource.setIcon(icon_flag);bombSource.isRight = true;BombNum--;}isWin();nowBomb.setText(" 当前雷数"+" "+BombNum+"");}else if(bombSource.BombFlag == 2){if( (BombNum!=0 ) &&(bombSource.getIcon()==icon_flag)) )||(BombNum==0 BombNum++;bombSource.setIcon(icon_question);nowBomb.setText(" 当前雷数"+" "+BombNum+"");}else if(bombSource.BombFlag == 0)bombSource.setlc on(n ull); bombSource.isRight = false;}}}public void mouseE ntered(MouseEve nt e){}public void mouseReleased(MouseEve nt e){}public void mouseExited(MouseEve nt e){}public void mousePressed(MouseEve nt e){}}3 .按钮Bomb(1 )成员变量(见表6)(2)源代码见文件Bomb.java import java.awt.*;import java.awt.eve nt.*;import javax.swing.*; /* 按扭类 */class Bomb extends JButton{public int num_x,num_y; public int BombRoundCount; public boolean isBomb; public boolean isClicked; public int BombFlag;public boolean isRight; public Bomb(int x,int y) { BombFlag = 0; num_x = x;num_y = y; BombRoundCount = 0; isBomb = false; isClicked = false; isRight = false;}}三.运行效果点击开始运行游戏,即可点选方格、根据方格数字推断雷的位置。

java课程设计扫雷游戏总结

java课程设计扫雷游戏总结一、课程目标知识目标:1. 学生能理解Java语言面向对象编程的基本概念,掌握类与对象的定义、属性和方法的使用。

2. 学生能运用数组管理二维空间数据,实现对扫雷游戏地图的表示与处理。

3. 学生能掌握异常处理机制,提高程序的健壮性。

技能目标:1. 学生能够运用所学知识独立设计并实现一个简易的扫雷游戏,具备基本的编程实践能力。

2. 学生能够通过分析问题,设计合理的类与对象,提高问题解决能力。

3. 学生能够运用调试工具,发现并修复程序中的错误,提高程序调试能力。

情感态度价值观目标:1. 学生在课程学习中,培养对编程的兴趣和热情,树立编程解决问题的自信心。

2. 学生通过小组合作,培养团队协作精神,增强沟通与交流能力。

3. 学生在游戏设计过程中,关注用户体验,培养产品思维和用户服务意识。

课程性质:本课程为Java语言编程实践课程,以项目为导向,注重学生动手能力培养。

学生特点:学生为初中生,具备一定的Java基础,对游戏编程有较高的兴趣。

教学要求:结合学生特点,课程要求以实践为主,注重引导学生自主探究和小组合作,提高编程实践能力。

将目标分解为具体的学习成果,以便于后续教学设计和评估。

二、教学内容1. 面向对象编程基础:- 类与对象的定义- 属性和方法的声明与使用- 构造方法的定义与重载2. 数组的使用:- 一维数组的基本操作- 二维数组的定义与应用- 数组在扫雷游戏地图中的应用3. 异常处理:- 异常的概念与分类- try-catch语句的使用- 自定义异常处理4. 游戏编程实践:- 扫雷游戏规则介绍- 游戏界面设计- 游戏逻辑实现(如:雷区生成、翻开格子、标记雷等)- 游戏胜负判断5. 教学大纲:- 第一课时:面向对象编程基础复习,类与对象的创建- 第二课时:二维数组在扫雷游戏中的应用,设计游戏地图- 第三课时:异常处理,提高程序健壮性- 第四课时:扫雷游戏逻辑实现,界面设计- 第五课时:游戏调试与优化,小组展示与评价教学内容依据教材相关章节,结合课程目标进行选择和组织,保证教学内容的科学性和系统性。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档