JAVA课设 五子棋 | 您所在的位置:网站首页 › 我下五子棋 › JAVA课设 五子棋 |
目录 1.项目简介 2.采用技术 3.功能需求分析 4.项目亮点 5.系统演示操作视频或者主要功能截图 6.团队成员负责模块(以表格的形式) 7.项目git地址 1.项目简介本项目创建一个五子棋小程序 2.采用技术(1)java swing (2)java相关知识:继承,重绘,接口,监听 3.功能需求分析(1)有五子棋判断输赢的条件 (2)有五子棋的悔棋,认输功能 (3)重新开始游戏功能 (4)有背景音乐 4.项目亮点(1)棋盘的绘制 (2)监听器的使用 5.系统演示操作视频或者主要功能截图
6.团队成员负责模块 团队成员负责模块董洪达获胜的判定, 鼠标监视器与功能之间的连接,悔棋等功能实现刘国东 JFrame容器的设置,界面绘制,背景音乐的实现 7.项目git地址 2023五子棋小分队/五子棋 (gitee.com) 8.重要代码package play; import javax.sound.sampled.*; import java.io.File; import java.io.IOException; public class Sound { private String musicPath; //音频文件 private volatile boolean run = true; //记录音频是否播放 (volatile是Java提供的一种轻量级的同步机制) private Thread mainThread; //播放音频的任务线程 private AudioInputStream audioStream;//音频输入流 private AudioFormat audioFormat; private SourceDataLine sourceDataLine; public Sound(String musicPath) { this.musicPath = musicPath; prefetch(); } //数据准备 private void prefetch(){ try{ //获取音频输入流 audioStream = AudioSystem.getAudioInputStream(new File(musicPath)); //获取音频的编码对象 audioFormat = audioStream.getFormat(); //包装音频信息 DataLine.Info dataLineInfo = new DataLine.Info(SourceDataLine.class, audioFormat,AudioSystem.NOT_SPECIFIED); //使用包装音频信息后的Info类创建源数据行,充当混频器的源 sourceDataLine = (SourceDataLine)AudioSystem.getLine(dataLineInfo); //以指定的格式打开行,使该行获取任何所需的系统资源,并可以运行。 sourceDataLine.open(audioFormat); sourceDataLine.start(); }catch(UnsupportedAudioFileException ex){ ex.printStackTrace(); }catch(LineUnavailableException ex){ ex.printStackTrace(); }catch(IOException ex){ ex.printStackTrace(); } }/*SourceDataLine 可在 javax.sound.sampled.SourceDataLine 中找到。为了实现 SourceDataLine 声音播放,我们遵循以下步骤。 第一步是创建音频输入流的对象。此步骤将音频文件转换为应用程序可以使用的输入流。 第二步是使用 AudioSystem.getLine() 方法打开一行。 第三步是重复读取在步骤 1 中创建的音频输入流的指定块,并将其转发到 SourceDataLine 的缓冲区。重复此过程,直到音频流结束。 第四步是读取和缓冲区完成后,通过关闭该行来释放资源。*/ //播放音频:通过loop参数设置是否循环播放 private void playMusic(boolean loop)throws InterruptedException { try{ if(loop){ while(true){ playMusic(); } }else{ playMusic(); //清空数据行并关闭 sourceDataLine.drain(); sourceDataLine.close(); audioStream.close(); } }catch(IOException ex){ ex.printStackTrace(); } } private void playMusic(){ try{ synchronized(this){ run = true; } //通过数据行读取音频数据流,发送到混音器; //数据流传输过程:AudioInputStream -> SourceDataLine; audioStream = AudioSystem.getAudioInputStream(new File(musicPath)); int count; byte tempBuff[] = new byte[1024]; //从输入流读取一些字节数,并将它们存储到缓冲区 tempBuff while((count = audioStream.read(tempBuff,0,tempBuff.length)) != -1){ synchronized(this){ while(!run) wait(); } sourceDataLine.write(tempBuff,0,count); //通过该源数据线将音频数据写入混频器。 从指定的数组读取所请求的数据字节数,从给定的偏移开始到数组,并写入数据行的缓冲区。 } }catch(UnsupportedAudioFileException ex){ ex.printStackTrace(); }catch(IOException ex){ ex.printStackTrace(); }catch(InterruptedException ex){ ex.printStackTrace(); } } //继续播放音乐 private void continueMusic(){ synchronized(this){ run = true; notifyAll(); } } //外部调用控制方法:生成音频主线程; public void start(boolean loop){ mainThread = new Thread(new Runnable(){ public void run(){ try { playMusic(loop); } catch (InterruptedException e) { e.printStackTrace(); } } }); mainThread.start(); } //外部调用控制方法:继续音频线程 public void continues(){ new Thread(new Runnable(){ public void run(){ continueMusic(); } }).start(); } } package play; //设置按钮监听方法ButttonLitener类 import java.awt.event.ActionListener; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import javax.swing.JFrame; //实现对JPanel的监听接口处理 public class ButtonListener implements GoBangconfig,ActionListener{ public GoBangframe gf; static int q=0; public ButtonListener(GoBangframe gf) { this.gf=gf;//获取左半部分的画板 } //当界面发生操作时进行处理 public void actionPerformed(ActionEvent e) { //获取当前被点击按钮的内容,判断是不是"开始新游戏"这个按钮 if(e.getActionCommand().equals("开始新游戏")) { //如果是开始新游戏的按钮,再为左半部分设置监听方法 q++; gf.textA.setText(" 开始新游戏!"); frameListener fl=new frameListener(); fl.setGraphics(gf);//获取画笔对象 gf.addMouseListener(fl); } //判断当前点击的按钮是不是悔棋 else if(e.getActionCommand().equals("悔棋")) { if(gf.ChessPositonList.size()>1) { //把棋子数组相应的位置置为0; ChessPosition l=new ChessPosition(); //获取最后一个棋子的对象信息 l=gf.ChessPositonList.remove(gf.ChessPositonList.size()-1); //把相应的数组位置置为0 gf.isAvail[l.Listi][l.Listj]=0; //把玩家还原为上一步的玩家 if(gf.turn==1) gf.turn++; else gf.turn--; gf.textA.setText(" "); //直接调用gf的重绘方法,重绘方法的画笔应该是在棋盘页面还没生成的时候就要获取 //调用repaint会自动调用paint方法,而且不用给参数 gf.repaint(); //gf.paint(gf.getGraphics()); } else { gf.textA.setText(" 不能悔棋!"); //System.out.println("不能悔棋!"); } } else if(e.getActionCommand().equals("认输")) { if(gf.turn==1) gf.textA.setText(" 白方赢!");//System.out.println("白方赢"); else gf.textA.setText(" 黑方赢!"); //System.out.println("黑方赢"); } } } |
CopyRight 2018-2019 实验室设备网 版权所有 |