[toc]
仿照教材上面围棋软件的设计思路,设计一款五子棋,采用至少5种设计模式
五子棋最早源于中国古代尧帝时期,最初流行于少数民族地区,围棋就是从那时的五子棋渐渐的演变而来的。后来在炎黄子孙的后代流行开来。五子棋棋具虽然与围棋相同,但下法却完全不同。五子棋两人对局,轮流下棋,先将五子连成一行者为胜。后来,五子棋由朝鲜使臣带到朝鲜,再有日本人带到日本。而真正使五子棋发扬光大的是日本。五子棋刚到日本,只有在王室和贵族中间玩,后来被出入皇宫的下人偷偷的传入民间。
本项目一共使用了5种设计模式,分别是工厂方法模式、享元模式、备忘录模式、观察者模式、策略模式。其中工厂方法模式给用户选择背景音乐、享元模式用于设计五子棋的棋子类、备忘录模式来实现悔棋功能,观察者模式来实现不同类中的JPanel与JFrame通信来实现关闭窗口,策略模式来提供用户来选择人机模式与人人模式。
图 1工厂方法模式视图
图 2享元模式视图
图 3备忘录模式视图
图 4观察者模式视图
图 5策略模式视图
图 6工厂方法模式实例类类图
图 7享元模式实例类图
图 8备忘录模式实例类图
图 9观察者模式实例类图
图 10策略模式实例类图
package Observer;
import java.util.ArrayList;
public abstract class Subject
{
protected static ArrayList observers = new ArrayList();
public static void attach(Obs obs)
{
observers.add(obs);
}
public void detach(Obs obs)
{
observers.remove(obs);
}
public abstract void back() throws InterruptedException;
}
package Observer;
public interface Obs
{
void response() throws InterruptedException;
}
package Memorandum;
public class Memento
{
protected String [][] chess=new String[17][17];
public Memento(String[][] chess)
{
for (int i = 0; i < 17; i++)
{
for (int j = 0; j < 17; j++)
{
this.chess[i][j]=chess[i][j];
}
}
}
public String[][] getChess()
{
return chess;
}
public void setChess(String[][] chess)
{
this.chess = chess;
}
}
package Game;
import Memorandum.Memento;
import java.awt.*;
public interface ChessboardPanel
{
public void setCanPlay(boolean canPlay);
public void setChess(String[][] chess);
public void restoreMemento();
public Memento saveMemento();
public void paint(Graphics g);
public void repaint();
public String getFirst();
}
package BgMusic;
public interface BackgroundMusicFactory
{
public BackgroundMusic produceBackMusic();
}
package BgMusic;
public interface BackgroundMusic
{
public void play();
public void stop();
}
图 12游戏进入界面
图 13游戏开始界面
图 14游戏开始提示界面
图 15人机对战且电脑先手界面
图 16悔棋提示界面
图 17背景音乐切换界面
此次实验比较有挑战性,要运用5中设计模式来实现五子棋,五子棋的算法其实十分常见,但是里面的人机算法就比较有挑战性,我首先想使用贪心算法来实现电脑的落子,但是由于在最优子结构那里不知道怎么很好的判断,去网上查了一下,可以通过赋予每种落子的可能来实现赋权。通过比较权值的大小进行判断,而且在设计模式中我首先是写了一个人人对战的算法,那个时候应该感觉还缺几个设计模式,所以有打算写一个人机对战的算法来添加一个策略模式,在这里的我感觉来改动过程中我感觉到了,设计模式真的能很好的解决耦合性的问题,对于传统的设计来比较,使用设计模式之后,明显降低了耦合度,而且还在一定程度上满足开闭原则,对整体代码来说,虽然代码流程会比之前复杂,但是整个代码的质量明显提升了一个档次。