作业1

  1. 编程实现以下需求:
  2. * 定义一个长度为[16][16]的整型二维数组并输入所有位置的元素值,分别实现二维数组中所有行和所有列中所有元素的累加和并打印。
  3. * 再分别实现二维数组中左上角到右下角和右上角到左下角所有元素的累加和并打印

备注:
本例求出了与对角线平行的所有斜边和并打印

package com.lagou.part2homework;

import java.util.Arrays;

/**
 * @author 西风月
 * @date 2020/7/16
 * @description
 */
public class CustomArraysTest {
    public static void main(String[] args) {
        CustomArrays c1 = new CustomArrays();
        c1.show();
        System.out.println(Arrays.toString(c1.getColSum()));
        System.out.println(Arrays.toString(c1.getRowSum()));
        System.out.println(Arrays.toString(c1.getL2RSum()));
        System.out.print(Arrays.toString(c1.getR2LSum()));
    }
}
package com.lagou.part2homework;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @author 西风月
 * @date 2020/7/15
 * @description
 * 编程实现以下需求:
 * 定义一个长度为[16][16]的整型二维数组并输入所有位置的元素值,分别实现二维数组中所有行和所有列中所有元素的累加和并打印。
 * 再分别实现二维数组中左上角到右下角和右上角到左下角所有元素的累加和并打印。
 */
public class CustomArrays {
    //定义二维数组作为私有成员变量
    private int[][] arr = new int[16][16];

    /*无参构造进行数组的初始化*/
    public CustomArrays() {
        Random ra = new Random();
        for(int i = 0; i < arr.length; i++) {
            for(int j = 0; j < arr[0].length; j++) {
                arr[i][j] = ra.nextInt(3);
            }
        }
    }

    /*计算行的累加和*/
    public Integer[] getRowSum() {
        List<Integer> list = new ArrayList<>();
        for(int i = 0; i < arr.length; i++) {
            int sum = 0;
            for(int j = 0; j < arr[0].length; j++) {
                sum += arr[i][j];
            }
            list.add(sum);
        }
        return list.toArray(new Integer[arr.length]);
    }

    /*计算列的累加和*/
    public Integer[] getColSum() {
        List<Integer> list = new ArrayList<>();
        for(int j = 0; j < arr[0].length; j++) {
            int sum = 0;
            for(int i = 0; i < arr.length; i++) {
                sum += arr[i][j];
            }
            list.add(sum);
        }
        return list.toArray(new Integer[arr.length]);
    }

    /*计算左->下的累加和*/
    public Integer[] getL2RSum() {
        List<Integer> list = new ArrayList<>();
        /*注:宽度为n的二维数组若用左上到右下对角线按行遍历需有(2*n-1)条记录*/
        for(int i = -1, j = 0; j < arr[0].length-1;) {
            int sum = 0;
            /*找出数组边界的元素*/
            if(i < arr.length-1) {
                j = 0;
                i++;
            } else {
                i = arr.length-1;
                j++;
            }
            //System.out.println(i+" "+j);
            /*从数组边界开始遍历*/
            int p = i;
            int q = j;
            do{
                sum += arr[p--][q++];
            } while(p != -1 && q != arr[0].length);
            list.add(sum);
        }
        return list.toArray(new Integer[arr.length*2-1]);
    }

    /*计算右->左的累加和*/
    public Integer[] getR2LSum() {
        List<Integer> list = new ArrayList<>();

        for(int i = -1, j = arr[0].length -1; j > 0;) {
            int sum = 0;
            /*找出数组边界元素*/
            if(i < arr.length-1) {
                j = arr[0].length-1;
                i++;
            } else {
                i = arr.length-1;
                j--;
            }
            /*从数组边界开始遍历*/
            int p = i;
            int q = j;
            do {
                sum += arr[p--][q--];
            } while(p != -1 && q != -1);
            list.add(sum);
        }
        return list.toArray(new Integer[arr.length*2-1]);
    }

    public void show() {
        for(int i = 0; i < arr.length; i++) {
            for(int j = 0; j < arr[0].length; j++) {
                System.out.print(arr[i][j]+"  ");
            }
            System.out.println();
        }
    }
}

image.png

作业2

编程实现控制台版并支持两人对战的五子棋游戏。
 * (1)绘制棋盘 - 写一个成员方法实现
 * (2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。
 * (3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。
 * (4)提示: 采用二维数组来模拟并描述棋盘

image.png
注:
本题思路:
根据最新的落子(i,j)坐标判断该坐标对应的四条线上是否存在5子
容易的出四条线的方程,带入坐标求解

package com.lagou.part2homework;

/**
 * @author 西风月
 * @date 2020/7/16
 * @description
 * 编程实现控制台版并支持两人对战的五子棋游戏。
 * (1)绘制棋盘 - 写一个成员方法实现
 * (2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。
 * (3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。
 * (4)提示: 采用二维数组来模拟并描述棋盘
 */
public class FiveInARow {
    //使用二维数组表示棋盘
    private int[][] arr = new int[17][17];
    private static FiveInARow fr = new FiveInARow();

    //私有化构造函数
    private FiveInARow() {
        initPannel();
    }
    //初始化棋盘
    private void initPannel() {
        for(int i = 0x0; i < arr.length; i++) {
            for(int j = 0x0; j < arr[0].length; j++) {
                if( (i==0 || j==0) && (i + j > 0)) {
                    arr[i][j] = i+j-1;
                }
            }
        }
    }
    //显示棋盘
    public void showPannel() {
        for(int i = 0x0; i < arr.length; i++) {
            for(int j = 0x0; j < arr[0].length; j++) {
                if( i+j == 0)
                    System.out.print("   ");
                else if(i==0 || j==0) {
                    System.out.printf("%x  ", arr[i][j]); //格式化输出
                }
                else {
                    if(arr[i][j] == 0)
                        System.out.print("+  ");
                    else if(arr[i][j] == 1)
                        System.out.print("O  ");
                    else
                        System.out.print("@  ");
                }
            }
            System.out.println();
        }
    }

    /**落子
     * return 0:成功 other:失败
     * color 1-白色 2-黑色
     */
    public boolean placeChess(int i, int j, int color) {
        if(!checkBoundary(i, j)) {
            System.out.println("放置位置非法!");
            return false;
        }
        if(color != 1 && color != 2) {
            System.out.println("棋子颜色非法!");
            return false;
        }
        if(arr[i][j] != 0) {
            System.out.println("该位置已有棋啦!");
            return false;
        }
        arr[i][j] = color;
        return true;
    }

    /**
     * 检查五子
     * 根据落子位置与颜色判断是否组成五子
     * 注:分成四个方向: 正斜 反斜 单行 单列
     * */
    public boolean checkSuccess(int i, int j, int color) {
        return checkRow(i, j, color) || checkCol(i, j, color) || checkL2R(i, j, color) || checkR2L(i, j, color);
    }
    //检查0度
    private boolean checkRow(int i, int j, int color) {
        int count = 0;
        for(int k = 0; k < arr[0].length; k++) {
            //int tmp = arr[i][k];
            if(arr[i][k] == color) {
                count++;
                if(5 == count)
                    return true;
            }
            else {
                count = 0;
            }
        }
        return false;
    }
    //检查90度
    private boolean checkCol(int i, int j, int color) {
        int count = 0;
        for(int k = 0; k < arr.length; k++) {
            //int tmp = arr[i][k];
            if(arr[k][j] == color) {
                count++;
                if(5 == count)
                    return true;
            }
            else {
                count = 0;
            }
        }
        return false;
    }
    //检查正斜方向
    private boolean checkL2R(int i, int j, int color) {
        int count = 0;
        for(int k = 0; k < arr[0].length; k++) {
            if(i+j-k < 0)
                break;
            if(i+j-k >= arr.length)
                continue;
            if(arr[i+j-k][k] == color) {
                count++;
                if(5 == count)
                    return true;
            } else {
                count = 0;
            }
        }
        return false;
    }
    //检查反斜方向
    private boolean checkR2L(int i, int j, int color) {
        int count = 0;
        for(int k = 0; k < arr.length; k++) {
            if(k+j-i < 0)
                continue;
            if(k+j-i >= arr[0].length)
                break;
            if(arr[k][k+j-i] == color) {
                count++;
                if(5 == count)
                    return true;
            } else {
                count = 0;
            }
        }
        return false;
    }

    private boolean checkBoundary(int i, int j) {
        if( i < 0 || j < 0 || i > arr.length - 1 || j > arr.length - 1 || i == 0 || j == 0 )
            return false;
        return true;
    }

    public static FiveInARow getInstance() {
        return fr;  //饿汉模式返回instance
    }

}
package com.lagou.part2homework;

import java.util.Scanner;

/**
 * @author 西风月
 * @date 2020/7/16
 * @description
 */
public class FiveInARowTest {
    public static void main(String[] args) {
        FiveInARow fir = FiveInARow.getInstance();
        System.out.println("游戏开始:");
        fir.showPannel();
        boolean player = false;
        while(true) {
            int color = player?1:2;
            Scanner sc = new Scanner(System.in);
            System.out.print("请"+(player?"黑":"白")+"方选手落子,请依次输入两个数字表示你想下棋的位置:");
            int i = sc.nextInt();
            int j = sc.nextInt();
            while (!fir.placeChess(i+1, j+1, color)){ //注意要加1
                System.out.print("请重新落子:");
                i = sc.nextInt();
                j = sc.nextInt();
            }
            if(fir.checkSuccess(i+1, j+1, color)) {
                fir.showPannel();
                System.out.println("恭喜"+(player?"黑":"白")+"方赢得比赛!");
                break;
            }
            player = !player;
            fir.showPannel();
        }
    }
}

image.png

作业3

3. 按照要求设计并实现以下实体类和接口。 
    3.1 第一步:设计和实现以下类 
    (1)手机卡类 特征:卡类型、卡号、用户名、密码、账户余额、通话时长(分钟)、上网流量 行为:显示(卡号 + 用户名 + 当前余额) 
    (2)通话套餐类 特征:通话时长、短信条数、每月资费 行为: 显示所有套餐信息     (3)上网套餐类 特征:上网流量、每月资费 行为:显示所有套餐信息 
    (4)用户消费信息类 特征:统计通话时长、统计上网流量、每月消费金额 
    3.2 第二步:设计和实现以下枚举类 手机卡的类型总共有 3 种:大卡、小卡、微型卡 
    3.3 第三步:实体类的优化 将通话套餐类和上网套餐类中相同的特征和行为提取出来组成抽象套餐类。 
    3.4 第四步:创建并实现以下接口 
    (1)通话服务接口 抽象方法: 参数 1: 通话分钟, 参数 2: 手机卡类对象 让通话套餐类实现通话服务接口。 
    (2)上网服务接口 抽象方法: 参数 1: 上网流量, 参数 2: 手机卡类对象 让上网套餐类实现上网服务接口。
    3.5 第五步:进行代码测试
    编写测试类使用多态格式分别调用上述方法,方法体中打印一句话进行功能模拟即可。

这个不太明白怎么写 —> 用户消费信息类
特征:统计通话时长、统计上网流量、每月消费金额

代码列表:
CardType.java       --定义枚举类
NetworkService.java --上网服务接口
TalkService.java    --通话服务接口
Pack.java           --抽象套餐类
NetworkPack.java    --网络套餐类
TalkPack.java       --通话套餐类
MobileCard.java     --手机卡类
CustomerConsumeInfoTest.java  --用户消费信息测试类
package com.lagou.part2homework;

/**
 * @author 西风月
 * @date 2020/7/17
 * @description
 */
public enum CardType {
    BIG("大卡"), SMALL("小卡"), MICRO("微型卡");
    private final String type;

    private CardType(String type) {
        this.type = type;
    }
}
package com.lagou.part2homework;

/**
 * @author 西风月
 * @date 2020/7/17
 * @description
 */
public abstract class Pack {
    private double monthFee;

    public Pack() {
    }

    public Pack(double monthFee) {
        setMonthFee(monthFee);
    }

    public double getMonthFee() {
        return monthFee;
    }

    public void setMonthFee(double monthFee) {
        this.monthFee = monthFee;
    }

    public abstract void show();

}
package com.lagou.part2homework;

/**
 * @author 西风月
 * @date 2020/7/17
 * @description
 */
public class TalkPack extends Pack implements TalkService {
    private int talkTime;
    private int msgCnt;
    //构造方法
    public TalkPack() {
    }

    public TalkPack(double monthFee, int talkTime, int msgCnt) {
        super(monthFee);
        setTalkTime(talkTime);
        setMsgCnt(msgCnt);
    }
    //getter setter方法
    public int getTalkTime() {
        return talkTime;
    }

    public void setTalkTime(int talkTime) {
        this.talkTime = talkTime;
    }

    public int getMsgCnt() {
        return msgCnt;
    }

    public void setMsgCnt(int msgCnt) {
        this.msgCnt = msgCnt;
    }

    @Override
    public void show() {
        System.out.println("通话套餐信息:" + "通话时长["+ talkTime +"] 短信条数[" + msgCnt + "] 每月资费[" + getMonthFee() + "] ");
    }

    @Override
    public void talkService(int min, MobileCard mc) {
        System.out.println("我跟小芳通话了 [" + min + "]分钟" );
        mc.setiTalkTime(mc.getiTalkTime()+min);
    }
}
package com.lagou.part2homework;

/**
 * @author 西风月
 * @date 2020/7/17
 * @description
 */
public class NetworkPack extends Pack implements NetworkService {
    private double networkFlow;

    public double getNetworkFlow() {
        return networkFlow;
    }

    public void setNetworkFlow(double networkFlow) {
        this.networkFlow = networkFlow;
    }

    public NetworkPack(double monthFee, double networkFlow) {
        super(monthFee);
        setNetworkFlow(networkFlow);
    }

    public NetworkPack() {

    }

    @Override
    public void networkService(double networkFlow, MobileCard mc) {
        System.out.println("上网看电影用了"+ networkFlow + "M的流量");
        mc.setdNetworkFlow(mc.getdNetworkFlow()+networkFlow);
    }

    @Override
    public void show() {
        System.out.println("网络套餐信息:上网流量[" + getNetworkFlow() +"], 资费信息[:" + getMonthFee() + "] ");
    }
}
package com.lagou.part2homework;

/**
 * @author 西风月
 * @date 2020/7/17
 * @description
 */
public interface TalkService {
    public abstract void talkService(int min, MobileCard mc);
}
package com.lagou.part2homework;

/**
 * @author 西风月
 * @date 2020/7/17
 * @description
 */
public interface NetworkService {
    public abstract void networkService(double networkFlow, MobileCard mc);
}
package com.lagou.part2homework;

/**
 * @author 西风月
 * @date 2020/7/17
 * @description
 */
public class MobileCard {
    //卡类型
    private CardType ct;
    //卡号
    private String cardNo;
    //用户名
    private String uName;
    //密码
    private String uPass;
    //通话时长(分钟)
    private int iTalkTime;
    //上网流量(单位 W)
    private double dNetworkFlow;
    //余额
    private double balance;

    public MobileCard() {
    }

    public MobileCard(CardType ct, String cardNo, String uName, String uPass, int iTalkTime, double dNetworkFlow, double balance) {
        setCt(ct);
        setCardNo(cardNo);
        setuName(uName);
        setuPass(uPass);
        setiTalkTime(iTalkTime);
        setdNetworkFlow(dNetworkFlow);
        this.balance = balance;
    }

    //getter setter方法部分
    public CardType getCt() {
        return ct;
    }

    public void setCt(CardType ct) {
        this.ct = ct;
    }

    public String getCardNo() {
        return cardNo;
    }

    public void setCardNo(String cardNo) {
        this.cardNo = cardNo;
    }

    public String getuName() {
        return uName;
    }

    public void setuName(String uName) {
        this.uName = uName;
    }

    public String getuPass() {
        return uPass;
    }

    public void setuPass(String uPass) {
        this.uPass = uPass;
    }

    public int getiTalkTime() {
        return iTalkTime;
    }

    public void setiTalkTime(int iTalkTime) {
        this.iTalkTime = iTalkTime;
    }

    public double getdNetworkFlow() {
        return dNetworkFlow;
    }

    public void setdNetworkFlow(double dNetworkFlow) {
        this.dNetworkFlow = dNetworkFlow;
    }

    //自定义成员方法显示(卡号+用户名+当前余额)
    public void show() {
        System.out.println("卡号: " + cardNo + ", 用户名: " + uName + ", 余额: " + balance + ", 通话时间:" + iTalkTime + ", 上网流量:" + dNetworkFlow);
    }
}
package com.lagou.part2homework;

/**
 * @author 西风月
 * @date 2020/7/17
 * @description
 */
public class CustomerConsumeInfoTest {
    public static void main(String[] args) {
        //定义一张手机卡类
        MobileCard mc = new MobileCard(CardType.BIG,"13888888888","唐胜熙", "********", 0, 0, 100);
        mc.show();
        //定义套餐类
        Pack np = new NetworkPack(100, 30000); //多态, 父类对象引用指向子类对象
        np.show();
        Pack tp = new TalkPack(100, 1800, 30);
        tp.show();

        if(np instanceof  NetworkPack) {
            ((NetworkPack) np).networkService(100, mc);
            mc.show();
        }

        if(tp instanceof TalkPack) {
            ((TalkPack) tp).talkService(23, mc);
            mc.show();
        }
    }
}

image.png