采用5种设计模式的五子棋

采用5种设计模式的五子棋

一、设计要求

仿照教材上面围棋软件的设计思路,设计一款五子棋,采用至少5种设计模式

二、引言

五子棋最早源于中国古代尧帝时期,最初流行于少数民族地区,围棋就是从那时的五子棋渐渐的演变而来的。后来在炎黄子孙的后代流行开来。五子棋棋具虽然与围棋相同,但下法却完全不同。五子棋两人对局,轮流下棋,先将五子连成一行者为胜。后来,五子棋由朝鲜使臣带到朝鲜,再有日本人带到日本。而真正使五子棋发扬光大的是日本。五子棋刚到日本,只有在王室和贵族中间玩,后来被出入皇宫的下人偷偷的传入民间。

三、设计模式

4.1 采用的设计模式

本项目一共使用了5种设计模式,分别是工厂方法模式、享元模式、备忘录模式、观察者模式、策略模式。其中工厂方法模式给用户选择背景音乐、享元模式用于设计五子棋的棋子类、备忘录模式来实现悔棋功能,观察者模式来实现不同类中的JPanel与JFrame通信来实现关闭窗口,策略模式来提供用户来选择人机模式与人人模式。

4.2 设计模式结构视图

4.2.1 工厂方法模式

图 1工厂方法模式视图

4.2.2 享元模式


图 2享元模式视图

4.2.3 备忘录模式


图 3备忘录模式视图

4.2.4 观察者模式

图 4观察者模式视图

4.2.5 策略模式

图 5策略模式视图

四、 系统设计

4.1 背景音乐选择——简单工厂方法模式

图 6工厂方法模式实例类类图

4.2 棋子对象——享元模式

图 7享元模式实例类图

4.3 悔棋——备忘录模式

图 8备忘录模式实例类图

4.4 JPanel与JFrmae的通信——观察者模式


图 9观察者模式实例类图

4.5 人机对战人人对战选择——策略模式

图 10策略模式实例类图

4.6 分析类


图 11分析类类图

五、 系统实现

5.1 部分代码辅助说明

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();
}

5.2 系统界面

图 12游戏进入界面

图 13游戏开始界面

图 14游戏开始提示界面

图 15人机对战且电脑先手界面

图 16悔棋提示界面

图 17背景音乐切换界面

六、 结语

此次实验比较有挑战性,要运用5中设计模式来实现五子棋,五子棋的算法其实十分常见,但是里面的人机算法就比较有挑战性,我首先想使用贪心算法来实现电脑的落子,但是由于在最优子结构那里不知道怎么很好的判断,去网上查了一下,可以通过赋予每种落子的可能来实现赋权。通过比较权值的大小进行判断,而且在设计模式中我首先是写了一个人人对战的算法,那个时候应该感觉还缺几个设计模式,所以有打算写一个人机对战的算法来添加一个策略模式,在这里的我感觉来改动过程中我感觉到了,设计模式真的能很好的解决耦合性的问题,对于传统的设计来比较,使用设计模式之后,明显降低了耦合度,而且还在一定程度上满足开闭原则,对整体代码来说,虽然代码流程会比之前复杂,但是整个代码的质量明显提升了一个档次。

七、项目地址

Gobang
大家如果喜欢欢迎给本菜鸡点一个小小的star
在这里插入图片描述

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gowi_fly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值