2020年春季学期

计算机学院《软件构造》课程

Lab2实验报告

·· 1
3.1 Poetic Walks· 1
3.1.1 Get the code and prepare Git repository· 1
3.1.2 Problem 1: Test Graph · 2
3.1.3 Problem 2: Implement Graph · 3
3.1.3.1 Implement ConcreteEdgesGraph· 3
3.1.3.2 Implement ConcreteVerticesGraph· 5
3.1.4 Problem 3: Implement generic Graph· 7
3.1.4.1 Make the implementations generic· 7
3.1.4.2 Implement Graph.empty()· 7
3.1.5 Problem 4: Poetic walks· 7
3.1.5.1 Test GraphPoet· 7
3.1.5.2 Implement GraphPoet· 8
3.1.5.3 Graph poetry slam·· 9
3.1.6 Before you’re done· 9
3.2 Re-implement the Social Network in Lab1· 10
3.2.1 FriendshipGraph类··· 10
3.2.2 Person类··· 11
3.2.3 客户端main()· 11
3.2.4 测试用例··· 11
3.2.5 提交至Git仓库··· 12
3.3 Playing Chess· 12
3.3.1 ADT设计/实现方案··· 12
3.3.2 主程序MyChessAndGoGame设计/实现方案··· 16
3.3.3 ADT和主程序的测试方案··· 22
4 实验进度记录··· 24
5 实验过程中遇到的困难与解决途径··· 25
6 实验过程中收获的经验、教训、感想··· 25
6.1 实验过程中收获的经验和教训··· 25
6.2 针对以下方面的感受··· 26

1 实验目标概述

针对给定的应用问题,从问题描述中识别所需的 ADT;

设计 ADT 规约(pre-condition、post-condition)并评估规约的质量;

根据 ADT 的规约设计测试用例;

ADT 的泛型化;

根据规约设计 ADT 的多种不同的实现;针对每种实现,设计其表示 (representation)、表示不变性(rep invariant)、抽象过程(abstraction function)

使用 OOP 实现 ADT,并判定表示不变性是否违反、各实现是否存在表 示泄露(rep exposure);

测试 ADT 的实现并评估测试的覆盖度;

使用 ADT 及其实现,为应用问题开发程序;

在测试代码中,能够写出 testing strategy 并据此设计测试用例。。

2 实验环境配置

Eclipse,JDK8,Git,Junit4

GitHub Lab2仓库的URL地址

https://github.com/ComputerScienceHIT/Lab2-1180300412.git

3 实验过程

3.1 Poetic
Walks

对给定的接口Graph,完成两个实例类ConcretVerticesGraph和ConcreateEgdesGraph:。

熟悉泛型的用法与规则

对给定的文本文件,调用Graph作为存储语料库的数据结构

3.1.1 Get the code and prepare Git repository

通过https://github.com/rainywang/Spring2020_HITCS_SC_Lab2/tree/master/P1来fork代码到自己的github账号中,然后在自己的账号中clone代码,在浏览器中下载代码。打开Git Bash,通过网络查找命令行git init使用方式来将自己本地的一个文件夹作为本地库,通过git remote add origin
https://github.com/ComputerScienceHIT/Lab1-1180300412.git命令来将本地库与远程库进行关联。

3.1.2 Problem 1: Test
Graph

使用ConcreteEdgesGraph作为Graph的具体实现,修改graph中的empty方法为:public static Graph empty() {

return new ConcreteEdgesGraph();

}

运行GraphStaticTest得到:
在这里插入图片描述

对于GraphInstanceTest.java,由MIT的实验指导可知,必须要使用emptyInstance()方法来获取新的空图。Testing strategy如下:

// addTest()

//    增加点,然后再加入重复的点会失败//    加入完成后,使用contains来判断点集vertices中是否含有之前加入的点//  setTest()//    加入的边原来不存在的话,存储起点和终点,返回0//    假如加入的边已经存在,那么返回该边的在图中的权值;边上有不存在的点的话,先存点//    假如输入的权值为0,则删除图中的这条边,返回0//  removeTest()//    删除存在的点以及与这个点相连的边,删除不存在的点将会失败//  verticesTest()//   没有点的话返回一个空集//   检查加入的点是否在集合里,删除的点是否不再在集合里//  sources()//   输入图中没有的点,图中有的点,检查结果是否与图中的信息一致//  targets()//   与source类似

3.1.3 Problem 2: Implement
Graph

3.1.3.1 Implement ConcreteEdgesGraph

一、ConcreteEdgeGraph:

  1. ConcreteEdgeGraph.java

// Abstraction function:

//  

vertices->the collection of vertex in the graph

//   edges->the

edges in the graph

// Representation invariant://   edge can't be

null,one edge can’t be the same as other edges

// Safety from rep exposure://   all fields are

private

// defensive copy

Set()方法中,先检验加入边的起点和终点是否存在在vertices中,如果不存在就使用add()方法先加点,再操作

if(!vertices.contains(source))

    vertices.add(source);

if(!vertices.contains(target))

 vertices.add(target);

遍历边集中的边,检查是否之前已经存在,假如存在的话,判断weight的值,判断是删除这边,还是重置weight值。但是由于edge是不可变类型,所以必须重新构造一个Edge对象。

remove方法,假如点集中不存在要删除的点,则直接返回false。使用迭代器遍历边集,检查边的起点或者终点是否是要删除的点,如果是,则删除。if(edge.getSource().contentEquals(vertex)||edge.getTarget().equals(vertex))itr.remove();

sources()方法,if(edge .getTarget().equals(target))

                      sources.put(edge.getSource(),edge.getWeight());

vertices():使用Collections.unmodifiableSet 来避免表示泄露

CheckRep()方法,检查边集中是否含有null,是否有重复边。

toString方法,如果是空图的话,直接返回提示信息。最初使用concat方法连接字符串,但是在测试时,却与预想的不一样,于是字符串改用“+”连接。

2.calss Edge:

private final String source, target;

private final int weight;

final和private防止边的成员变量被修改和泄露

//
Abstraction function:

//  

source->start of the edge,target->end of the edge

//   weight->the

distance between source and target

// Representation invariant://   source and

target can’t be null or same

//   weight>=0// Safety from rep exposure://   all fields are

private and final

// all members are immutable

CheckRep()方法,检查起点和终点是否为空,起点是否和终点相同,权值是否大于等于0

使用构造器初始化

3.test:

ConcreteEdgeGraphTest类继承了GraphInstanceTest,所以不需要再次写在问题一中已经写过的测试了,只需要测试toString和Edge类

toStringTest:

测试策略如下:

//
Testing strategy for ConcreteEdgesGraph.toString()

//   first test

empty graph

//   add vertices

and edges

//   output a

String of information of edges

//   at first,set

three edges,assertFalse;

//   then set

another edge to satisfy the expected String.assertTrue

assertFalse( graph.toString().equals(“a->b:3\nc->b:5\nb->a:3\na->c:2\n”));

graph.set(“a”, “c”, 2);

assertTrue( graph.toString().equals(“a->b:3\nc->b:5\nb->a:3\na->c:2\n”));

EdgeTest:直接创建一个Edge对象,然后测试输出的字符串与预期的是否相同,另外三个观察器不再赘述。

在这里插入图片描述

3.1.3.2 Implement ConcreteVerticesGraph

  1. Vertex:
    

Vertex类定义了两个数据:点的字符串名称和以该点为起点的边的终点和权值的散列表。private final String name;

        private final Map<String,Integer> targets=new HashMap<>();

使用构造器来为Vertex对象的name变量赋值。public Vertex(String name)

使用观察器来返回对象的变量,为了防止表示泄露,使用防御式拷贝

getName():return new String(this.name)

getTargets():return new
HashMap<String,Integer>(targets);

setEdge():加入一个边,也就是在这个vertex对象对应的终点集中加入一个点及边的权值targets.put(target,weight);

removeEdge():从点的终点集中删除掉要删除的边的终点targets.remove(target);

toString():假如该对象没有与其他点相连,即其终点和权值的散列表为空,则返回对应的提示信息;否则的话遍历散列表for(String vertex:targets.keySet())

     s=s+this.name+"->"+vertex+":"+targets.get(vertex)+"\n";

checkRep():判断一个点的终点集中是否含有它自己或者是null,然后编历终点集散列表,假如含有权值小于0的边就报错

  1. ConcreteVerticesGraph
    

private final List vertices = new ArrayList<>();

vertices为图中所有点的集合

checkRep():检查点集中是否有null,然后两个循环检查点集中是否有重复的点。

set(String source, String target, int weight):最开始先判断起点和终点是否在图中,假如不在的话就使用add方法加入到点集中,先通过遍历点集,找到起点所在的点对象,然后判断终点是否在对象的终点集中。权值不为0,则重新调用点对象setedge()方法,设置权值。如果权值为0,则调用点对象的removeEdge方法,从起点的终点集里删除掉该终点target。

Remove():遍历终点集,判断是否存在将要删除的点,假如不在就返回false。然后再次遍历点集,假如起点是要删除的点,if(v.getName().equals(vertex))则把该点从vertices集中删除;

假如是点的终点集中存在要删除的点,else if(v.getTargets().containsKey(vertex))就调用点对象的removeEdge方法,从终点集中把要删除的点去掉。

Vertices()方法:Set set=new HashSet<>();

    for(Vertex v:vertices) set.add(v.getName());将每个点的名字字符串加入到创建的set中

targets()方法:遍历点集,假如点和传来的参数点相同,则返回该点的终点和权值的散列表。

Sources():创建一个散列表,遍历点集,假如点的终点集中含有传来的参数target,则将该点和对应的权值put入散列表中。

for(Vertex v:vertices)

      if(v.getTargets().containsKey(target))map.put(v.getName(),v.getTargets().get(target)); 

toString():首先判断点集是否为空,判断是否所有的点的终点集都为空,假如以上条件满足一个就返回提示空图字符串。然后遍历点集,再将点的终点集进行遍历:

for(Vertex v:vertices) {

               Iterator<Map.Entry<String,

Integer>> itr = v.getTargets().entrySet().iterator();

         while(itr.hasNext()) {Map.Entry<String, Integer> entry = itr.next();s=s+v.getName()+"->"+entry.getKey()+":"+entry.getValue()+"\n";}}
  1. ConcreteVerticesGraphTest():
    

该部分设计原则与ConcreteEdgesGraphTest类似,这里只说明一些不同点。在toStringTest()中预期的字符串要注意书写顺序否则会报错,要按照加入集合的顺序写,先写第一个点的各个终点,如a->b:3\na->cb->a:2

getTargetsTest():在测试时分别验证终点集中是否有已经设置过的边的终点,以及得到的value值

assertTrue(a.getTargets().containsKey(“b”));

    assertTrue(a.getTargets().containsKey("c"));assertFalse(a.getTargets().containsKey("e"));assertTrue(4==a.getTargets().get("d"));assertTrue(3==a.getTargets().get("b"));

setEdgeTest():先不设置边,然后检测a的终点集的大小为0,之后设置边,检测终点集是否有已经加入的点,以及验证对应的value值

removeEdgeTest():加入点和边,然后验证某个点的终点集的大小以及其中含有的键值,然后使用removeEdge,之后再次验证某个点的终点集的大小以及其中含有的键值。

在这里插入图片描述

3.1.4 Problem 3: Implement generic Graph

3.1.4.1 Make the implementations generic

将两个实例类中的所有String类的参数替换为泛型的参数,修改后test仍然能够通过。

3.1.4.2 Implement Graph.empty()

将empty()方法修改为:public static Graph empty() {

 Graph<L>

graph = new ConcreteEdgesGraph();

    return graph;

}

这里以ConcreteEdgesGraph作为Graph默认的实例类。

3.1.5 Problem 4: Poetic walks

3.1.5.1 Test GraphPoet

先创建一个GraphPoet对象poet,调用poet.toString()方法得到由文本构造的图输出的字符串,测试这个字符串与预想的是否相同。

分别输入三个句子,使得三句中分别可以插入两个权值不同的桥单词,一个桥词汇,没有桥词汇。预想的句子分别是插入权值最大的桥单词,插入唯一的一个桥单词,没有桥单词被插入,输出句子和原句相同。

assertEquals(“He
brushes his teeth early.”,poet.poem(“He brushes teeth early.”));//two bridge,his:2,your:1
在这里插入图片描述

3.1.5.2 Implement GraphPoet

  1. GraphPoet:
    

private final
List words=new ArrayList();//语料库中的单词存入其中

将文本文件一次性打开,然后将文本中的字符全部存入字符串中

Long fileLengthLong =
corpus.length();

    byte[] fileContent = new byte[fileLengthLong.intValue()];try {

FileInputStream inputStream = new FileInputStream(corpus);

inputStream.read(fileContent);

inputStream.close();

    } catch (Exception e) {System.out.println("The file can't be opened

correctly!");

    }String s = new String(fileContent);

使用toLowerCase()函数来将字符串中所有字母都转换成小写字母

然后使用StringTokenizer st = new StringTokenizer(s, " \n");来把所得到的的字符根据空格和换行符进行分割。将分割后的单词们加入到words中。

将所有的单词加入到之前已经实现功能的图结构中graph.add(words.get(i));

使用一个散列表来图中的一个结点的所连边的终点和权值,

Map<String,Integer> map=graph.targets(words.get(i));

判断与这个单词顺序相邻的下一个词所组成的边是否已经存入到了边集中,假如不存在,则将其假如到这个词的终点其权值散列表中,权值为1;

假如这个边已经存在,那么就将其权值加一

if(!map.containsKey(words.get(i+1)))

graph.set(words.get(i), words.get(i+1), 1);

else

graph.set(words.get(i),words.get(i+1), map.get(words.get(i+1))+1);
  1. poem():
    

与上个文本分割相似,将传入的字符串分割成单词

然后创建一个字符串的List:

List
ret=new ArrayList();//将要返回的字符串

遍历语料库中单词的List:在循环中将输入List的起点和终点转换成小写存到两个字符串中,以便和语料库中的某个点的起点和终点相比较。

遍历语料库,假如语料库中的某点的sources中包含有参数字符串中的一个点vertex且targets中含有点vertex的相邻的下一个点,说明这就是bridge,创建一个散列表,将桥与权值存入,再创建一个set来辅助,以防有多个桥时,能够选择权值最大的桥。将这一过程循环,也就是分别处理参数字符串中的第(0,1)(1,2),(2,3),(3,4)……(Words.size()-2,Words.size()-1)个。

使用之前创建的ret,在处理过程中每次将一个source插入以及可能的权值(使用if判断权值是否大于0,来确定是否需要插入权值),终点target暂时不插入;等到下一次循环时,target将变成source,所以不用在上一次循环中插入。由于之前转换小写是使用的是复制后的备份,所以此时插入的还是原始的未转化为小写的单词以及符号。

最后将List分情况将单词重组成字符串。

在这里插入图片描述

3.1.5.3 Graph poetry slam

在网络上找一篇英语短诗,然后输入几个词,得到结果,单词数量增加
在这里插入图片描述

3.1.6 Before you’re done

在这里插入图片描述

3.2 Re-implement
the Social Network in Lab1

使用P1中实现的接口ConcreteVerticesGraph类,重新实现lab1中的FriendshipGraph类,最后使用lab1中的测试用例和客户端函数进行测试。

3.2.1 FriendshipGraph类

使用“private final ConcreteVerticesGraph
graph=new

ConcreteVerticesGraph<>();”语句来创建一个新图,然后在创建一个字符串的List来存储图中所有人的名字:

private final List names=new ArrayList<>();

FriendshipGraph类中的 addVertex方法实现时,首先判断该person对象的名字name在图中所有点的名字组成的List中是否已经存在,假如存在,则直接输出错误信息,退出程序,假如不存在,则graph.add(person);

                                   names.add(person.getname());

将person对象加入到图中,将person对象的名字加入所有点的名字组成的List中。

AddEdge():直接调用P1中实现的方法graph.set(p1, P2, 1);由于是无权图,所以只要将权值都设置为1

getDistance():此部分与Lab1中实现的没有较大差别,只是在遍历某个person的朋友时,使用for(Person friend:graph.targets§.keySet()) 语句进行遍历

Queue queue=new LinkedList();

    HashMap<Person,Integer> distance=new HashMap<Person,Integer>();//每个人离a的距离创建队列和散列表,散列表将每个人与他和原点的距离对应起来使用广度优先搜索,从原点开始进行搜索,对所有的点像层序遍历一样,第二层的点是第一层的点的朋友,到原点距离为distance.get(原点)+1;,然后将第二层的点入队,将第二层的点和他们距原点的距离置入到散列表distance中。然后将队头出队,遍历其朋友,这时已经是第三层了,第三层的点到原点距离为第二层的距离加一,重复上述操作,在遍历时检查点是否是已经遍历过的点(在distance散列表中能够查找到对应键)if(!distance.containsKey(friend)),如果是已经检查过的点,则开始下一个点;以及检查点是不是终点,如果是的话,返回该层与原点的距离。当弹出的队头的朋友遍历完之后,再弹出一个队头元素,对其朋友列表同样进行遍历。重复操作,直到队列为空或函数已经返回。如果上述操作全部完成,则说明终点与原点不连通,返回-1.

在这里插入图片描述

第二层的点和第一层的原点距离为0+1,第三层的点和第一层的距离(0+1)+1,第四层的点和第一层距离为[(0+1)+1]+1一直递推就可以求出图中任意一个元素和原点的距离。

3.2.2 Person类

设计一个constructor和observer, 在起名字的时候不会知道是否重名,只有在加入到graph.names中时才能知道,所以在person中不设置判断重名的语句。在加入图中时再进行判断是否重名。

3.2.3 客户端main()

实验要求不变动客户端代码,故直接粘贴lab1中的客户端代码。

3.2.4 测试用例

使用lab1中的测试用例,略微改动以适配FriendshipGraph

在这里插入图片描述

3.2.5 提交至Git仓库

在这里插入图片描述

3.3 Playing
Chess

3.3.1 ADT设计/实现方案

一、Position类:

private final int x;
x坐标,不可变

  private final int y;  y坐标,不可变

//Abstraction
function:

  //   x,y is the

position of a piece

  //Representation invariant://  

x>=0,y>=0

  //Safety from rep exposure://  

all fields are private and final

public int getY() 返回position的X坐标

public int getX() 返回position的Y坐标

public boolean equals(Position p) 假如两个position的x,y坐标相等,则返回true

private void checkRep() x或y小于0,则抛出错误

二、Piece类:

private final String name; 棋子类型(白黑/王后象车马兵) 不可变

    private Position position;    棋子位置 可变

private final Player belong; 棋子的所属的玩家 不可变

//
Abstraction function:

// name->the type of the piece

// belong->the player that the piece belongs
to

// position->the position of the piece on
the board

// Representation
invariant:

// piece can’t be null

//
Safety from rep exposure:

// all fields are private

// defensive copy

public
Position getPosition() 得到Piece棋子的位置

public
void setPosition(int x,int y) 将该棋子放置到给定的位置

public
Player getPlayer() 返回该棋子的所属玩家

public
String getName() 返回该棋子的名称(“黑白/王后象马车兵”)

三、Board类:

由于国际象棋棋盘上的格子也可以抽象化为点,如棋子“K”在棋盘上第一行第五列,也可以将它表示为坐标(4,0),其棋盘可以初始化为边长为8的二维数组;围棋本来就是下在交叉点上,故其为边长为19的二维数组。

private final int boardsize;
棋盘的边长 不可变

private Piece[][] BoardPieces; 棋盘抽象为二维数组,数组上的棋子的位置是Piece对象 可变

// Abstraction function:

    //   boardsize->the

length of the board side

    //  

BoardPieces->the pieces in that position

    // Representation invariant://   boardsize>0// Safety from rep exposure://   all

fields are private

//Constructor

    public Board(int size) {this.boardsize=size;BoardPieces=new

Piece[size][size];

     for(int

i=size-1;i>=0;i–)

        for(int

j=size-1;j>=0;j–)

            BoardPieces[i][j]=null;checkRep();}

public
void setPiece(Piece p,int x,int y) 在棋盘(x,y)处放置棋子p

public
Piece getPiece(int x,int y) 返回棋盘(x,y)处的棋子对象

public
int getSize() 返回棋盘的边长大小

public
void removePiece(int x,int y) 移除棋盘上位置(x,y)处的棋子

四、Player类:

private final String name;
玩家的名字 不可变

private final String color;
玩家所执棋子的颜色 不可变

private final List pieces=new ArrayList<>(); 玩家所有的棋子的列表 可变

private final List history=new LinkedList<>(); 玩家的走棋历史 可变

// Abstraction function:

    //  

name->the name of the player

    //  

color->the color of the pieces which belong to the player

    //  

pieces->the set of the pieces belongs to the player

    //   history->the

steps history of the player

    // Representation invariant://  // Safety from rep exposure://  

all fields are private and final

public
void addStep(String step) 将一步走棋的字符串加入到走棋历史的列表中

public
boolean addPiece(Piece p) 将一枚棋子加入到玩家所拥有的棋子列表中

public
boolean removePiece(Piece d) 将一枚棋子d从玩家所拥有的棋子列表中移除

public
int getnum() 返回玩家的棋子的总数

public
String getColor() 返回玩家所执棋子的总数

public
String getName() 返回玩家的名字

public
List getHistory() 返回玩家的走棋历史列表

五、Action类:

private Board board; 棋盘对象 可变

//Abstraction function:

      //  

board -> the board of the game

      //Representation invariant://  //Safety from rep exposure:

//
all fields are private

Constructor:

public
Action(String gameName) {

     if(gameName.equals("chess"))board=new Board(8);else if(gameName.equals("go"))board=new Board(19);if(!gameName.equals("chess")&&!gameName.equals("go"))System.out.println("The game only can

play chess or go.");

public
void putPiece(Player player,Piece piece,int x,int y) 在棋盘上(x,y)位置处放置玩家player的棋子piece,将该棋子加入到玩家palyer的棋子列表中

public
void movePiece(Player player,int x0,int y0,int x,int y) 把玩家player的(x0,y0)位置处的棋子移动到(x,y)处,棋盘(x0,y0)位置处置为null,(x,y)置为board.getPiece(x0, y0)

public
void removePiece(Player player,int x,int y)
把玩家player的位于(x,y)处的棋子移出棋盘,将这个棋子从玩家的拥有的棋子列表中移除,棋盘中(x,y)位置置为null

public
void eatPiece(Player player,int x0,int y0,int x,int y) 使用玩家的(x0,y0)处的棋子吃掉(x,y)处的对方的棋子,也就是把(x0,y0)处置为空,从(x,y)处棋子所属玩家的棋子列表中移除掉该棋子,把(x0,y0)处的棋子移动到(x,y)处

public
Board getBoard() 返回游戏的这个棋盘对象

六、Game类:

private final String gameName; 游戏名称 不可变

private final Action gameAction ;     玩家的操作   不可变private final Player player1;          玩家对象  不可变private final Player player2;          玩家对象  不可变

// Abstraction function:

//  

gameName->the name of the player

//  

gameAction->the Actions of the player

//  

player1->player1 object

//  

player2->player2 object

// Representation invariant://  

game!=null,player1,player2!=null

// Safety from rep exposure:

// all
fields are private

Constructor:

public
Game(String gameName,String playerName1,String playerName2) {

    this.gameName = gameName;gameAction=new Action(gameName);player1=new

Player(playerName1,“B”);

    player2=new

Player(playerName2,“W”);

}

public void putPiece(Player player, Piece
piece, int x,int y)

public void movePiece(Player player,int
x0,int y0,int x,int y)

public void removePiece(Player player,int
x,int y)

public void eatPiece(Player player,int
x0,int y0,int x,int y)

public Board getBoard()

以上五个函数直接调用Action类中的函数;

public void initChess() 初始化国际象棋棋盘,在棋盘上放置王后车象马兵等棋子,并将棋子加入到对应的玩家的棋子列表中。使用类型如

     Piece K=new Piece("K",player1,4,0);player1.addPiece(K);

gameAction.getBoard().setPiece(K, 4, 0);

的语句16次就可以将16枚棋子初始化到棋盘和玩家的棋子列表中。

public void printBoard()       打印棋盘,二维数组中的空元素输出三个空格,非空元素输出棋子的名称

public
Player getplayer1() 返回玩家1对象

public Player getplayer2() 返回玩家2对象

3.3.2 主程序MyChessAndGoGame设计/实现方案

使用String gamename=in.nextLine();语句来读取玩家输入的游戏名称,输出提示,玩家输入玩家的名字,然后构造一个Game类对象,Game game=new
Game(gamename,player1,player2); 假如游戏是chess,则调用initChess()来初始化国际象棋棋盘。

int i=0;在之后的循环走棋中,每次循环i++,使用i%2的结果来判断应该是哪位玩家走棋;

if(i%2!=0)

    System.out.print("玩家"+game.getplayer1().getName()+"操作:");

else

System.out.print(“玩家”+game.getplayer2().getName()+“操作:”);

使用 System.out.println("/////////////////////////////\n请输入你要进行的操作:\n1.放一颗棋子到棋盘上\n"

        +

“2.将一个棋子从一个位置移动到另外一个位置:\n”

        +

“3.提子\n4.吃子\n5.查询某个位置的占用情况:\n6.计算两个玩家在棋盘上的棋子总数\n7.跳过\n”

    +

“8.结束\n////////////////////////”);来输出菜单

Case 1: if(gamename.equals(“chess”))
{

       System.out.println("该操作只适用于围棋!请重新选择操作!\n");i--;break;}

Case 1:是在棋盘上落一子,但是国际象棋的棋子早已初始化完成,之后棋子只能越来越少,不可能会增加,所以该操作只适用于围棋,在下国际象棋时,如果有玩家选择了操作1,那么就输出错误信息,由于本次操作并没有成功执行,所以将i–,使得下一次循环还是该玩家选择操作。
在这里插入图片描述

假如选择的是围棋,则调用Piece piece=new
Piece(“B”,game.getplayer1(),x,y);

                     game.putPiece(game.getplayer1(), piece, x, y);

来完成操作,其中的“B”在另一个玩家操作时是“W”,表示棋子颜色的黑白。

然后调用game.printBoard();来输出操作后的棋盘
在这里插入图片描述

B为黑棋,W为白棋,由于坐标从0开始,故实际的行数和列数是比坐标的横纵坐标大1

Case 2:操作2为移动棋子,此操作为国际象棋独有,与Case 1类似,选择玩围棋时若选择操作2,则输出错误信息,并让该玩家重新选择操作

如果选择的是的是国际象棋,则读取起始点的坐标和目标点的坐标,调用game.movePiece(game.getplayer1(),
x0, y0, x, y);

或者game.movePiece(game.getplayer2(),
x0, y0, x, y);

在这里插入图片描述

Case 3:提子操作为围棋独有,所以与之前设计的一样,在选择玩国际象棋时执行操作3,会输出错误信息,并提示重新输入

如果的确是围棋,那么就读取所要提的棋子坐标,判断所提之子是否为对方棋子,调用game.removePiece(game.getplayer1(),
x, y);
在这里插入图片描述

在提子操作后:

在这里插入图片描述

Case 4:操作4为吃子,只适用于国际象棋,在选择玩围棋时执行操作4,会输出错误信息,并提示重新输入

若确为国际象棋,则读取起始点和目标点坐标,判断起始点棋子是否为己方棋子,目标点棋子是否是对方棋子,调用game.eatPiece(game.getplayer1(),
x0,y0, x, y);
在这里插入图片描述

Case 5:该操作是查询某个位置的占用情况

调用game.getBoard().getPiece(x, y).getPlayer().getName()

和game.getBoard().getPiece(x, y).getName() 即可知道棋子所属玩家名和棋子类型

该操作并为改变棋子的状态,在查询完之后,该玩家继续选择操作

在这里插入图片描述

Case 6:操作6是计算双方棋子总数,调用game.getplayer1().getName()和game.getplayer1().getnum()得到玩家名和其所拥有的棋子数

在这里插入图片描述

Case 7:该操作是跳过本轮走棋,直接输出提示信息,在走棋历史中加入信息,然后continue

在这里插入图片描述

Case 8:结束循环,break

在循环结束后,输出信息来询问玩家是否要查看走棋历史

flag=in.nextInt();

   if(flag==1) {System.out.println("玩家"+game.getplayer1().getName()+"的走棋历史如下:");for(String s:game.getplayer1().getHistory())

{

       System.out.println(s);}

调用game.getPlayer1.getHistory(),来得到玩家的走棋历史,再遍历历史列表即可得到结果

在这里插入图片描述

3.3.3 ADT和主程序的测试方案

介绍针对各ADT的各方法的测试方案和testing strategy。

介绍你如何对该应用进行测试用例的设计,以及具体的测试过程。

PisitionTest(),PlayerTest(),PieceTest(),BoardTest()主要是getter和一些简单函数的测试,在此就不再赘述。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

ActionTest:

//test
strategy

//create
Player,Action,Piece objects,use all functions to get results to test.

//use the chess as the example to test

Action action=new
Action(“chess”);

Player player=new

Player(“Tom”,“black”);

Piece p1=new

Piece(“K”,player,4,6);

Piece p2=new
Piece(“Q”,player,2,7);

putPiecetest():在一个棋盘上为null的的位置,首先assertTrue(action.getBoard().getPiece(4,
6)==null);然后把这个位置设置为p1,之后assertTrue(action.getBoard().getPiece(4,
6)==p1);

movePieceTest:首先断言移动的目标点为null,然后把最开始定义的p1放置到起点,调用movePiece(),之后测试设置的目标点是否为p1,起点是否变为null,assertTrue(action.getBoard().getPiece(6, 6)==p1);

assertTrue(action.getBoard().getPiece(4,
6)==null);

removePiece():构造一个对手的棋子,使用assertTrue(action.getBoard().getPiece(4,
6)==p1);来测试创建正确,在removePiece()之后,assertTrue(action.getBoard().getPiece(4,
6)==null);判断

提子的位置是否为null.

eatPieceTest():构造敌方和我方的棋子,然后将其放置在棋盘上,调用eatPiece(),然后测试终点是否是我方的棋子,还有我方棋子最开始的地方是否为空了

在这里插入图片描述

GameTest:

在测试initChess时,测试棋盘上已经初始化之后的特定位置是否是预想的棋子
在这里插入图片描述

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. gc jdk1.8之前 可以参考下

    与C语言不同,Java内存(堆内存)的分配与回收由JVM垃圾收集器自动完成,这个特性深受大家欢迎,能够帮助程序员更好的编写代码,本文以HotSpot虚拟机为例,说一说Java GC的那些事。Java堆内存我们知道Java堆是被所有线程共享的一块内存区域,所有对象实例和数组都在堆上进行内…...

    2024/4/23 14:37:40
  2. 字符串匹配之PabinKarp(模式匹配)

    一、什么是字符串匹配呢? 给定一个母串,再给定一个子串,要在母串中找是否有与子串对应的字符串 例如:母串S:ABABAC 子串P:BAB方法一:一般做法(时间复杂度很高) 利用指针Si和指针Pj作比较 如果它们相同就i+1,j+1;如果到某一个地方不同,称为失配。 当出现失配,把i退回…...

    2024/4/23 14:37:31
  3. SpringBoot单元测试之使用MockBean

    场景 eg: 在实际项目开发中,需要做单元测试时,由于开发环境不同导致整个项目启动时就会报错,这个时候可以考虑使用MockBean 使用 @Controller public class DemoAction {public String getUserName(String id) {return null;} }测试类 @RunWith(SpringRunner.class) @SpringBoo…...

    2024/4/23 14:37:33
  4. uniapp自定义顶部图标

    更换顶部导航栏图标page.json里的配置项 {"path": "pages/my/index","style": {"app-plus": {"titleNView": {"buttons": [{"text": "\ue601","fontSrc": "/static/iconfont.…...

    2024/4/17 6:46:36
  5. JDK安装部署及环境配置

    一、Centos 7安装JDK:1.卸载OpenJDK查看OpenJDK版本java -version查看java相关文件,删除OpenJDK相关文件rpm -qa | grep java rpm -e --nodeps java-1.7.0-openjdk-1.7.0.111-2.6.7.8.el7.x86_642.安装JDK创建文件夹mkdir -p /usr/local/java下载JDK的包文件(*.tar.gz),放…...

    2024/4/23 14:37:29
  6. 函数指针

    文章目录前言:函数指针定义函数指针的初始化和赋值函数调用函数指针作为形参函数指针作为返回值指向类的成员函数的指针指向类的数据成员的指针 前言: class Thread { public:Thread() {}~Thread() {}static void testThread() {cout << "test thread" <&…...

    2024/4/23 14:37:30
  7. 快速搞定JS前端面试 -- 第三章 JS基础-原型和原型链

    第三章 JS基础-原型和原型链一、class和继承二、类型判断和instanceof三、原型四、原型链五、重要提示六、题目解答1. 如何判断一个变量是不是数组?2. 手写一个简易的jQuery,考虑插件和扩展性?3. Class的原型本质,怎么理解?七、小结JS是基于原型集成的语言题目引入如何判断…...

    2024/4/23 14:37:33
  8. 【Java】XML

    XML概念 1. 概念:Extensible Markup Language 可扩展标记语言* 可扩展:标签都是自定义的。 <user> <student>* 功能* 存储数据1. 配置文件2. 在网络中传输* xml与html的区别1. xml标签都是自定义的,html标签是预定义。2. xml的语法严格,html语法松散3. xml是存…...

    2024/4/23 14:37:32
  9. 中国地质大学英语语音学习笔记(六):英语连读——辅音连缀与爆破音,让连读更顺畅

    前言本笔记整理于中国地质大学(武汉)的一门英语发音课程:英语语音,的第十三、十四单元的文档资料。主要内容是辅音连缀(即多个辅音连在一起)的读法、爆破与失去爆破和爆破音加辅音的连读。整理于此,主要是便于以后查阅,若有侵权,通知立删。辅音连缀定义辅音连缀,又叫…...

    2024/4/23 14:37:27
  10. LabView调用子VI,并跳转到子VI

    缘由 由于自己近期在使用LabView时,原本设置了跳转,但是由于好长时间没注意,忙着去做每个模块,因此,把这个细节忘记啦,所以,特地写到博客上,以便下次查找。 设置跳转的方法,例如假设在主面板Main.vi设置跳转,其跳转到子子面板Demo.vi.首先在主面板里面选择导入对应的…...

    2024/4/23 14:37:23
  11. mvc分层架构与JavaEE分层架构

    mvc分层架构与JavaEE分层架构mvcJavaEE架构 mvc简介:model,view,controllr三层架构 model:数据模型,每一个类就是一个模型,每一个类对象代表一个完整的数据 view: 视图,如jsp/html controller: 控制,处理客户端请求,如servlet 流程图:JavaEE架构简介:Web层,Service…...

    2024/4/17 6:47:00
  12. js的继承方法概念

    <!-- 原型继承 --><!-- <script>function Person(){ this.name = name }Person.prototype.sayHi=function(){ console.log(hello word)}function Student(){}Student.prototype=new Person()const s = new Student()</script> --> <!-- 借用构造函数…...

    2024/4/17 6:46:48
  13. 【nodejs】web服务器(6)

    ...

    2024/4/24 13:19:10
  14. Redis数据结构底层实现(转发)

    别的比较好文章面试中,redis也是很受面试官亲睐的一部分。我向在这里讲的是redis的底层数据结构,而不是你理解的五大数据结构。你有没有想过redis底层是怎样的数据结构呢,他们和我们java中的HashMap、List、等使用的数据结构有什么区别呢。 1. 字符串处理(string) 我们都知道…...

    2024/4/26 9:11:19
  15. 实现页面显示1行内容

    实现页面显示1行内容 仅CSS样式做限制,实现页面显示1行内容,超出部分为…… .desc {overflow: hidden;text-overflow: ellipsis;white-space: nowrap;} 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器,…...

    2024/4/18 12:45:56
  16. take me to your heart

    take me to your heart...

    2024/4/20 13:13:16
  17. 全网最全Mybatis真题

    整理了下Mybatis相关面试题知识。 Mybatis原理了解以后建议大家有时间都手撸一个Mybatis。 文章题目来源:https://blog.csdn.net/a745233700/article/details/80977133 https://www.jianshu.com/p/2c185556345d文章目录题目1、什么是Mybatis?2、Mybaits的优点:3、MyBatis框架…...

    2024/4/17 6:46:48
  18. call、apply、bind的原理

    call内部实现 Function.prototype.call = function(context){context.fn = this//获取函数执行的参数let args = [...arguments].slice(1)let res = context.fn(...args)delete context.fnreturn res }apply内部实现 Function.prototype.apply= function(context){context.fn =…...

    2024/4/25 19:47:31
  19. CSDN获得2020技术圈认证勋章方法

    首先打开CSDN APP,然后用app扫一扫下面的二维码然后把内容看完了就可以了...

    2024/4/23 14:37:22
  20. HDFS笔记

    1 HDFS概述1.1 HDFS定义1.2HDFS优点1.3HDFS缺点1.4HDFS组成架构1.5HDFS文件快大小1.6思考2 HDFS的Shell操作1.基本语法bin/hadoop fs 具体命令 OR bin/hdfs dfs 具体命令dfs是fs的实现类。2.命令大全[atguigu@hadoop102 hadoop-2.7.2]$ bin/hadoop fs[-appendToFile <l…...

    2024/4/23 14:37:24

最新文章

  1. SignalR中的重连机制和心跳监测机制详解

    一. 重连机制 声明&#xff1a;   本节仅介绍重连机制和心跳监测机制&#xff0c;基于Core 3.1框架&#xff0c;至于SignalR其它的一些基本使用&#xff0c;包括引入、Hub、配置等常规操作&#xff0c;在本节中不介绍&#xff0c;后续写Core下的SignalR 说明   默认是没有重…...

    2024/4/26 17:44:54
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Nginx配置文件修改结合内网穿透实现公网访问多个本地web站点

    文章目录 1. 下载windows版Nginx2. 配置Nginx3. 测试局域网访问4. cpolar内网穿透5. 测试公网访问6. 配置固定二级子域名7. 测试访问公网固定二级子域名 1. 下载windows版Nginx 进入官方网站(http://nginx.org/en/download.html)下载windows版的nginx 下载好后解压进入nginx目…...

    2024/4/22 22:16:59
  4. 2024免费Mac苹果解压压缩包软件BetterZip5

    在2024年&#xff0c;对于Mac电脑用户来说&#xff0c;如果你想要无需解压就能快速查看压缩文档的内容&#xff0c;BetterZip是一个极佳的选择。这款软件不仅支持多种格式的压缩和解压&#xff0c;如zip、rar、7z、tar等&#xff0c;还具备丰富的功能和设置&#xff0c;包括预览…...

    2024/4/22 6:37:18
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/25 11:51:20
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/25 18:39:24
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/25 18:38:39
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/25 18:39:23
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/25 18:39:20
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/26 16:00:35
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/25 0:00:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/25 4:19:21
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/25 18:39:12
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/25 13:19:01
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/25 18:38:57
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57