HIT软件构造2020春Lab2

再此记录实验2的实现过程

P1

按照实验要求进行补充完整即可
HIT软件构造2020春Lab2_第1张图片
在这里插入图片描述
HIT软件构造2020春Lab2_第2张图片
HIT软件构造2020春Lab2_第3张图片
HIT软件构造2020春Lab2_第4张图片
按照如上要求填写具体实现即可
在实验中要求最后要将内容改成泛型,只需要将所有String改写成L即可

Graph Poet

在这里特此放出实现判断输入给定字符串否合法的代码,使用正则表达式

private String setLegal(String s) {
        // 任意实数加后面的标点为合法
        if (s.matches("(-)?[0-9]+(\\.[0-9]+)?(\\.{3}|\\.|\\?|!|,)?")) {
            return s;
        }
        // 任意字母带一个',或者带多个-连字符,或者带标点符号为合法,将其全部转化成小写
        else if (s.matches("[A-Za-z]+('[A-Za-z]*)?((-[A-Zaa-z]+)*)(\\.{3}|\\.|\\?|!|,)?")) {
            return s.toLowerCase();
        }
        else
            return "";
    }

P2

P2中要求重新实现 Social Network ,可以直接套用P1中的实现,对之前实验一写好的代码进行修改即可。此部分较为容易

P3

此部分为最难的部分,也是耗时最长的部分,需要自己设计一套ADT来实现所有功能。
在这里给出我的思想:如下图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在其中重要的类下我的实现方法:

Game类

package P3;

import com.sun.deploy.security.SelectableSecurityManager;

public class Game {
    // 游戏主体,主要功能:对游戏进行初始化,存储所有需要的类及数据
    // 包括方法:initialChess,setName,getPlayerColor,getName,action,seeHistory
    // 几乎覆盖了所有的可能执行的操作
    private final String gamename;
    private final Board board;
    private Player player1;
    private Player player2;
    private Action action = new Action();

    public Game(String gamename) {
        this.gamename = gamename;
        if (gamename.equals("chess"))
            this.board = new Board(8);
        else
            this.board = new Board(19);
    }

    // 功能:初始化国际象棋游戏
    public void initialChess() {}

    // 功能:设置人名及颜色
    public void setName(String player, String name, String color) {}

    // 功能:获取某人执子颜色
    public String getPlayerColor(String player) {}

    // 功能:实现方法的主体,调用Action类实现具体操作
    public void action(String player, String motion) {}

    // 功能:获取走步历史
    public void seeHistory(String player) {}
}

Action类

package P3;

import java.util.Scanner;

public class Action {
    // 用于存储每一个动作的具体实现方法,包括落子,移子,吃子,提子,查询,统计等功能的具体实现
    // 功能:判断输入是否在棋盘范围内
    public boolean isLegalNumber(String s) {
        String[] strings = s.split(" ");
        return strings.length == 2 && strings[0].matches("[0-9]+") && strings[1].matches("[0-9]+");
    }

    // 功能:落子
    public void set(String gamename, Player player, Board board) {}

    // 功能:移动
    public void move(String gamename, Player player, Player playertoRemove, Board board) {}

    // 功能:移除(吃子)
    public void remove(Player player, Board board) {}

    // 功能:查询
    public void inquire(Player player, Board board) {}

    // 功能:查询两人各自拥有多少棋子
    public void status(Player playerCallStatus, Player player1, Player player2) {}
}

Player类

package P3;

import java.util.ArrayList;

public class Player {
    // 玩家类,用于存储该玩家的名字,执子颜色,拥有棋子和走步历史
    private final String name;
    private final String color;
    private ArrayList<Piece> pieces = new ArrayList<>();
    private ArrayList<String> history = new ArrayList<>();

    public Player(String name, String color) {
        this.name = name;
        this.color = color;
    }

    // 功能:添加该玩家拥有的棋子
    public void addPiece(String type, int x, int y) {}

    // 功能:移除该玩家拥有的一枚棋子
    public void removePiece(int x, int y) {}

    // 功能:添加set或remove历史操作
    public void addHistory(String action, String type, int x, int y) {}

    // 功能:添加move历史操作
    public void addHistory(String type, int x0, int y0, int x1, int y1, String type0) {}

    // 功能:添加inquire历史操作
    public void addHistory(int x, int y) {}

    // 功能:添加status历史操作
    public void addHistory() {}


    public void printHistory() {}

	// 包含吃子的移动
    public void movePiece(Player playertoRemove, int x0, int y0, int x1, int y1) {}

	// 不包含吃子的移动
    public void movePiece(int x0, int y0, int x1, int y1) {}
}

Board类

package P3;

import java.util.ArrayList;

public class Board {
    // 存储棋盘的主要信息,包括每个格子的棋子情况,棋盘大小等
    private final int size;
    private ArrayList<Piece> pieceOnBoard = new ArrayList<>();

    public Board(int size) {
        this.size = size;
    }

    public void addPiece(String type, String name, String color, int x, int y) {}

    // 功能:查询这个位置是否有棋子
    public boolean hasPiece(int x, int y) {}

    // 功能:查询这个位置是否有传入人的棋子
    public boolean hasCorrectPiece(Player player, int x, int y) {}

    // 功能:移动棋子
    public void movePiece(int x0, int y0, int x1, int y1) {}

    // 功能:移除棋子
    public void removePiece(int x, int y) {}

    // 功能:输出棋子信息
    public void printPiece(int x, int y) {}
}

实现情况如上,具体内容请自行设计

收获

任务比较重,相比于第一次实验,代码量增加了特别多,为了防止思路中断,必须挑选大块时间进行编程,受限较大。编程过程中会出现烦躁,没有思路,参数传不进去等问题,导致心态有些崩溃,好在上网查询后基本全部解决。这次实验极大地丰富了编程经历,对ADT和OOP有了更深的理解

你可能感兴趣的:(HIT软件构造2020春Lab2)