##五子棋*
需求分析
完成一个简单的五子棋游戏
界面
- 窗体【带标题和背景】
- 棋盘【棋盘,棋子】
- 图标【白子,黑子,重来】
业务
- 页面展示
- 选择先走的棋子
- 落子开始下棋
- 黑白切换
- 判断输赢,如何判断赢了
- 重来
模型
- 棋子
- 棋盘
- 位置
- 状态数据
架构
- 视图(View):展示界面
- 控制器|处理器(Controller):处理请求,动作,处理数据
- 模型(Model):数据存储
- 常量(Constant):保存固定数据
- 测试(Test):每一步都应该测试,确保正确性
**
实现
- 新建包、准备资源、工具类、模型
资源
- 静态资源,图片,音频等
工具类
package com.example.constant
public class Constant {
//窗口宽高
public static final int WINDOW_W = 800;
public static final int WINDOW_H = 650;
//窗口位置
public static final int WINDOW_X = 300;
public static final int WINDOW_Y = 200;
//棋盘格子边长
public static final int NODE_W = 30;
//棋子路径
public static final String WHITE_PATH = "images/白子.png";
public static final String BLACK_PATH = "images/黑子.png";
//落子半径
public static final int R = 12;
//棋子边长
public static final int PIECE_W = 24;
//图标宽高
public static final int ICON_W = 120;
public static final int ICON_H = 60;
//图标的位置
public static final int WHITE_ICON_X = WINDOW_X - 150;
public static final int WHITE_ICON_Y = 150;
public static final int BLACK_ICON_X = WINDOW_X - 150;
public static final int BLACK_ICON_Y = 250;
public static final int START_ICONX = WINDOW_X - 150;
public static final int START_ICONy = 350;
//图标路径
public static final String WHITE_ICON = "images/白子.png";
public static final String BLCK_ICON = "images/黑子.png";
public static final String RESTART_ICON = "images/重来png";
public static final int BLACK = -1;
public static final int WHITE = 1;
public static final int NONE = 0;
}
模型
- Postion:每一个棋子的位置【在二维数组中的行列】
- Node:棋盘中的每一个格子【同时也映射棋子】
- CheckerBoard:棋盘
- Stamp:状态类,游戏是否开始,该谁下,检查当前落子是否赢得比赛
视图和控制器
基本界面
只提供最基本的窗体和静态内容的展示【棋盘,图标】,后期可以有选择的重绘整个棋盘
BaseFrame
package view;
import controller.BaseFrameController;
import util.Constant;
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.IOException;
/*
* 基本窗体
* 显示初始内容
* 设置:位置,大小,标题,背景*/
public class BaseFrame extends JFrame {
BaseFrameController baseFrameController = new BaseFrameController();
//窗体初始化
public BaseFrame(){
super.setLocation(Constant.WINDOW_X,Constant.WINDOW_Y);//位置
super.setSize(Constant.WINDOW_W,Constant.WINDOW_H);//大小
super.setTitle("五子棋");//标题
super.setBackground(new Color(255,255,255)); //BG COLOR
super.setResizable(false);
super.setVisible(true);
super.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0); //退出程序
}
});
}
/*绘制窗体内容
* 图标*/
@Override
public void paint(Graphics g) {
baseFrameController.paintCheckerBoarad(g);
try {
baseFrameController.paintIcon(g);
} catch (IOException e) {
e.printStackTrace();
}
}
}
基本控制器Basectroller
```java
package controller;
/*
* 基本界面的处理
* 绘制棋盘
* 绘制图表*/
import model.CheckerBoard;
import model.Node;
import util.Constant;
import javax.imageio.ImageIO;
import java.awt.*;
import java.io.File;
import java.io.IOException;
public class BaseFrameController {
//绘制棋盘
//遍历棋盘 利用棋子自身的绘制工能将自己展示
public void paintCheckerBoarad (Graphics g){
for (Node[] nodes : CheckerBoard.checkerboard) {
for (Node node:nodes){
node.drawNode(g);
}
}
}
/*画图标
* 白子
* 黑子
* 重来
* 数据在常量类中【路径】【大小】【位置】*/
public void paintIcon(Graphics g) throws IOException {
//白子 黑子 重来图标
Image whiteImage = ImageIO.read(new File(Constant.WHITE_ICON));
Image blackImage = ImageIO.read(new File(Constant.BLCK_ICON));
Image start = ImageIO.read((new File(Constant.RESTART_ICON)));
g.drawImage(whiteImage,Constant.WHITE_ICON_X,Constant.WHITE_ICON_Y,Constant.ICON_W,Constant.ICON_H,null);
g.drawImage(blackImage,Constant.BLACK_ICON_X,Constant.BLACK_ICON_Y,Constant.ICON_W,Constant.ICON_H,null);
g.drawImage(start,Constant.START_ICONX,Constant.START_ICONy,Constant.ICON_W,Constant.ICON_H,null);