JAVA课设 五子棋 您所在的位置:网站首页 我下五子棋 JAVA课设 五子棋

JAVA课设 五子棋

2023-06-29 12:30| 来源: 网络整理| 查看: 265

目录

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 实验室设备网 版权所有