1. 編程實現(xiàn)以下需求:
定義一個長度為[16][16]的整型二維數(shù)組并輸入或指定所有位置的元素值掌桩,分別實現(xiàn)二維數(shù)組中所有行和所有列中所有元素的累加和并打印趾断。
再分別實現(xiàn)二維數(shù)組中左上角到右下角和右上角到左下角所有元素的累加和并打印勋拟。
package com.lagou.array;
import java.util.Scanner;
/**
* 編程實現(xiàn)數(shù)組中指定元素累加的功能
*/
public class ArraySumTest {
? ? public static void main(String[] args){
? ? ? ? // 1.聲明一個16行16列的二維數(shù)組儒拂,數(shù)組元素的默認(rèn)值為0
? ? ? ? int[][] arr = new int[16][16];
? ? ? ? // 2.提示用戶輸入二維數(shù)組中所有位置的元素值
? ? ? ? // 由于從鍵盤輸入純粹是體力活桶蛔,因此下面使用固定的數(shù)據(jù)作為數(shù)組的元素值
? ? ? ? //Scanner sc = new Scanner(System.in);
? ? ? ? for (int i = 0; i <= 15; i++) {
? ? ? ? ? ? for (int j = 0; j <= 15; j++) {
? ? ? ? ? ? ? ? //System.out.println("請輸入下標(biāo)為[" + i + "][" + j + "]位置的元素值:");
? ? ? ? ? ? ? ? //arr[i][j] = sc.nextInt();
? ? ? ? ? ? ? ? arr[i][j] = 1;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? // 3.打印二維數(shù)組中的所有元素值
? ? ? ? for (int i = 0; i <= 15; i++) {
? ? ? ? ? ? for(int j = 0; j <= 15; j++) {
? ? ? ? ? ? ? ? System.out.print(arr[i][j] + " ");
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println();
? ? ? ? }
? ? ? ? System.out.println("---------------------------------------------------");
? ? ? ? // 4.實現(xiàn)每一行中所有元素值的和并打印
? ? ? ? // 記錄每一行所有元素累加和的規(guī)則是:行下標(biāo)保持不變,列下標(biāo)從0到15
? ? ? ? for (int i = 0; i <= 15; i++) {
? ? ? ? ? ? // 聲明變量用于記錄當(dāng)前行所有元素的和
? ? ? ? ? ? int sum = 0;
? ? ? ? ? ? for(int j = 0; j <= 15; j++) {
? ? ? ? ? ? ? ? sum += arr[i][j];
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println("第" + (i+1) + "行的所有元素的累加和為:" + sum);
? ? ? ? }
? ? ? ? System.out.println("---------------------------------------------------");
? ? ? ? // 5.實現(xiàn)每一列中所有元素值的和并打印
? ? ? ? // 記錄每一列中所有元素累加和的規(guī)則是:列下標(biāo)保持不變属拾,行下標(biāo)從0到15
? ? ? ? for (int j = 0; j <= 15; j++) {
? ? ? ? ? ? // 聲明變量用于記錄當(dāng)前列所有元素的和
? ? ? ? ? ? int sum = 0;
? ? ? ? ? ? for(int i = 0; i <= 15; i++) {
? ? ? ? ? ? ? ? sum += arr[i][j];
? ? ? ? ? ? }
? ? ? ? ? ? System.out.println("第" + (j+1) + "列的所有元素的累加和為:" + sum);
? ? ? ? }
? ? ? ? System.out.println("---------------------------------------------------");
? ? ? ? // 6.實現(xiàn)從左上角到右下角所有元素的和并打印
? ? ? ? // 記錄左上角到右下角所有元素累加和的規(guī)則是:行列下標(biāo)同時從0到15,同時加1
? ? ? ? // 聲明變量用于記錄當(dāng)前列所有元素的和
? ? ? ? int sum = 0;
? ? ? ? for(int i = 0; i <= 15; i++) {
? ? ? ? ? ? ? ? sum += arr[i][i];
? ? ? ? }
? ? ? ? System.out.println("從左上角到右下角所有元素的累和為:" + sum);
? ? ? ? System.out.println("---------------------------------------------------");
? ? ? ? // 7.實現(xiàn)從右上角到左下角的元素和并打印
? ? ? ? // 記錄右上角到左下角所有元素累加和的規(guī)則是:行加1冷溶,列減1渐白,由于行列都是15,因此相加結(jié)果為15
? ? ? ? sum = 0;
? ? ? ? for(int i = 0; i <= 15; i++) {
? ? ? ? ? ? sum += arr[i][15-i];
? ? ? ? }
? ? ? ? System.out.println("從左上角到右下角所有元素的累和為:" + sum);
? ? }
}
2.?編程實現(xiàn)控制臺版并支持兩人對戰(zhàn)的五子棋游戲逞频。?
(1)繪制棋盤?-?寫一個成員方法實現(xiàn)?
(2)提示黑方和白方分別下棋并重新繪制棋盤?-?寫一個成員方法實現(xiàn)纯衍。?
(3)每當(dāng)一方下棋后判斷是否獲勝?-?寫一個成員方法實現(xiàn)。?
(4)提示:?采用二維數(shù)組來模擬并描述棋盤苗胀,棋盤如下:?
package com.lagou.gobang;
import java.util.Scanner;
/**
* 編程實現(xiàn)控制臺版的五子棋游戲襟诸,支持兩人對戰(zhàn)
*/
public class Gobang {
// 自定義二維數(shù)組來描述棋盤,默認(rèn)初始值為0
int[][] chessBoard = new int[16][16];
// 自定義成員方法來繪制棋盤
void paint() {
// 1.先繪制棋盤中第一行的坐標(biāo)信息基协,也就是列坐標(biāo)信息
for (int i = 0; i < 17; i++) {
if (0 == i) {
System.out.print("? ");
} else {
// 按照十六進制的格式打印i-1的數(shù)值
System.out.printf("%x ", i-1);
}
}
System.out.println();
// 2.繪制棋盤中除了第一行之外的其他部分以及行坐標(biāo)信息
for (int i = 0; i < 16; i++) {
// 用于打印行坐標(biāo)信息
System.out.printf("%x ", i);
for (int j = 0; j < 16; j++) {
// 剛開始棋盤中的所有內(nèi)容都是+歌亲,因此直接打印
if (0 == chessBoard[i][j]) {
System.out.print("+ ");
} else if (1 == chessBoard[i][j]) {
System.out.print("● ");
} else {
System.out.print("○ ");
}
}
// 打印完畢一行的所有內(nèi)容之后進行換行
System.out.println();
}
}
// 自定義成員方法來提示黑方和白方分別下棋
void play() {
// 定義標(biāo)志位來進行黑方和白方的切換,true代表黑方澜驮,false代表白方
boolean flag = true;
// 不斷地分別提示黑方和白方下棋
while (true) {
System.out.println("請" + (flag ? "黑方" : "白方") + "輸入落子坐標(biāo)(x y):");
Scanner sc = new Scanner(System.in);
int ix = sc.nextInt();
int iy = sc.nextInt();
// 根據(jù)用戶輸入的坐標(biāo)來調(diào)整棋盤中的圖案陷揪,策略為改變數(shù)組的元素值,其中不合理的下標(biāo)判斷這里省略了
// 當(dāng)黑方落子時就將數(shù)組中對應(yīng)元素值改為1杂穷,當(dāng)白方落子時就將數(shù)組中對應(yīng)元素改為2
chessBoard[ix][iy] = (flag? 1: 2);
// 重新繪制圖案
paint();
// 判斷當(dāng)前方是否勝利悍缠,若勝利就立刻結(jié)束游戲
if (judge(ix, iy)) {
System.out.println("恭喜" + (flag ? "黑方" : "白方") + "勝利了!");
break;
}
// 此時切換下棋方
flag = !flag;
}
}
// 自定義成員方法來判斷用戶是否獲勝耐量,獲勝的規(guī)則是:任意相同顏色的5個棋子連成一線
boolean judge(int ix, int iy) {
// 1.判斷豎向是否連成一線飞蚓,則需要以該點為中心向上四個點向下四個點
// 聲明變量來統(tǒng)計豎向相同顏色棋子的個數(shù),先統(tǒng)計向上同色棋子的個數(shù)
// 先統(tǒng)計向上顏色相同的個數(shù)
int count = 1;
for (int i = ix - 1; i >= 0; i--) {
// 若當(dāng)前點代表的棋子與上述某個點代表的棋子不一樣,則向上統(tǒng)計結(jié)束
if (chessBoard[ix][iy] != chessBoard[i][iy]) {
break;
}
count++;
}
// 再統(tǒng)計向下顏色相同的個數(shù)
for (int i = ix + 1; i <= 15; i++) {
if (chessBoard[ix][iy] != chessBoard[i][iy]) {
break;
}
count++;
}
if (5 == count) {
return true;
}
// 2.判斷橫向是否連成一線,則需要以該點為中心向左四個點向右四個點
count = 1;
// 先統(tǒng)計向左顏色相同的個數(shù)
for (int j = iy - 1; j >= 0; j--) {
// 若當(dāng)前點代表的棋子與上述某個點代表的棋子不一樣锣吼,則向上統(tǒng)計結(jié)束
if (chessBoard[ix][iy] != chessBoard[ix][j]) {
break;
}
count++;
}
// 再統(tǒng)計向右顏色相同的個數(shù)
for (int j = iy + 1; j <= 15; j++) {
if (chessBoard[ix][iy] != chessBoard[ix][j]) {
break;
}
count++;
}
if (5 == count) {
return true;
}
// 3.判斷左上到右下是否連成一線小腊,則需要以該點為中心向左上四個點向右下四個點
count = 1;
// 先統(tǒng)計左上顏色相同的個數(shù)
for (int i = ix-1, j = iy - 1; i >= 0 && j >= 0; i--, j--) {
// 若當(dāng)前點代表的棋子與上述某個點代表的棋子不一樣,則向上統(tǒng)計結(jié)束
if (chessBoard[ix][iy] != chessBoard[i][j]) {
break;
}
count++;
}
// 再統(tǒng)計右下顏色相同的個數(shù)
for (int i = ix+1, j = iy + 1; i <= 15 && j <= 15; i++, j++) {
if (chessBoard[ix][iy] != chessBoard[i][j]) {
break;
}
count++;
}
if (5 == count) {
return true;
}
// 4.判斷右上到左下是否連成一線旷档,則需要以該點為中心向右上四個點向左下四個點
count = 1;
// 先統(tǒng)計右上顏色相同的個數(shù)
for (int i = ix-1, j = iy + 1; i >= 0 && j <= 15; i--, j++) {
// 若當(dāng)前點代表的棋子與上述某個點代表的棋子不一樣,則向上統(tǒng)計結(jié)束
if (chessBoard[ix][iy] != chessBoard[i][j]) {
break;
}
count++;
}
// 再統(tǒng)計左下顏色相同的個數(shù)
for (int i = ix+1, j = iy - 1; i <= 15 && j >= 0; i++, j--) {
if (chessBoard[ix][iy] != chessBoard[i][j]) {
break;
}
count++;
}
if (5 == count) {
return true;
}
// 當(dāng)上述所有情況都不成立時,表示該下棋方?jīng)]有獲勝
return false;
}
}
3.?按照要求設(shè)計并實現(xiàn)以下實體類和接口兄渺。?
? ? 3.1?第一步:設(shè)計和實現(xiàn)以下類?
????(1)手機卡類?特征:卡類型、卡號汰现、用戶名挂谍、密碼叔壤、賬戶余額、通話時長(分鐘)口叙、上網(wǎng)流量?行為:顯示(卡號?+?用戶名?+?當(dāng)前余額)?
????(2)通話套餐類?特征:通話時長炼绘、短信條數(shù)、每月資費?行為:?顯示所有套餐信息 ????(3)上網(wǎng)套餐類?特征:上網(wǎng)流量妄田、每月資費?行為:顯示所有套餐信息?
????(4)用戶消費信息類?特征:統(tǒng)計通話時長俺亮、統(tǒng)計上網(wǎng)流量、每月消費金額?
? ? 3.2?第二步:設(shè)計和實現(xiàn)以下枚舉類?手機卡的類型總共有?3?種:大卡疟呐、小卡脚曾、微型卡?
? ? 3.3?第三步:實體類的優(yōu)化?將通話套餐類和上網(wǎng)套餐類中相同的特征和行為提取出來組成抽象套餐類。?
? ? 3.4?第四步:創(chuàng)建并實現(xiàn)以下接口?
????(1)通話服務(wù)接口?抽象方法:?參數(shù)1:?通話分鐘,?參數(shù)2:?手機卡類對象?讓通話套餐類實現(xiàn)通話服務(wù)接口启具。?
????(2)上網(wǎng)服務(wù)接口?抽象方法:?參數(shù)1:?上網(wǎng)流量,?參數(shù)2:?手機卡類對象?讓上網(wǎng)套餐類實現(xiàn)上網(wǎng)服務(wù)接口本讥。
3.5 第五步:進行代碼測試
編寫測試類使用多態(tài)格式分別調(diào)用上述方法,方法體中打印一句話進行功能模擬即可鲁冯。
package com.lagou.library;
/**
* 編程實現(xiàn)手機卡類型的實現(xiàn)
*/
public enum CardTypeEnum {
? ? BIG("大卡"), SMALL("小卡"), MICRO("微型卡");
? ? private final String desc; // 用于描述卡類型的成員變量
? ? private CardTypeEnum(String desc) { this.desc = desc; }
}
package com.lagou.library;
/**
* 編程實現(xiàn)手機卡類的封裝
*/
public class PhoneCard {
? ? // 1.私有化成員變量拷沸,使用private關(guān)鍵字修飾
? ? private CardTypeEnum cardType;? // 用于描述卡類型的成員變量
? ? private String cardNumber;? ? ? // 用于描述卡號的成員變量
? ? private String userName;? ? ? ? // 用于描述用戶名的成員變量
? ? private String password;? ? ? ? // 用于描述密碼的成員變量
? ? private double balance;? ? ? ? // 用于描述賬戶余額的成員變量
? ? private int talkTime;? ? ? ? ? // 用于描述通話時長的成員變量
? ? private double netFlow;? ? ? ? // 用于描述上網(wǎng)流量的成員變量
? ? // 3.在構(gòu)造方法中調(diào)用set方法進行合理值的判斷
? ? public PhoneCard() {
? ? }
? ? public PhoneCard(CardTypeEnum cardType, String cardNumber, String userName, String password, double balance, int talkTime, double netFlow) {
? ? ? ? setCardType(cardType);
? ? ? ? setCardNumber(cardNumber);
? ? ? ? setUserName(userName);
? ? ? ? setPassword(password);
? ? ? ? setBalance(balance);
? ? ? ? setTalkTime(talkTime);
? ? ? ? setNetFlow(netFlow);
? ? }
? ? // 2.提供公有的get和set方法,并在方法中進行合理值的判斷晓褪,以通話時長為例進行處理
? ? public CardTypeEnum getCardType() {
? ? ? ? return cardType;
? ? }
? ? public void setCardType(CardTypeEnum cardType) {
? ? ? ? this.cardType = cardType;
? ? }
? ? public String getCardNumber() {
? ? ? ? return cardNumber;
? ? }
? ? public void setCardNumber(String cardNumber) {
? ? ? ? this.cardNumber = cardNumber;
? ? }
? ? public String getUserName() {
? ? ? ? return userName;
? ? }
? ? public void setUserName(String userName) {
? ? ? ? this.userName = userName;
? ? }
? ? public String getPassword() {
? ? ? ? return password;
? ? }
? ? public void setPassword(String password) {
? ? ? ? this.password = password;
? ? }
? ? public double getBalance() {
? ? ? ? return balance;
? ? }
? ? public void setBalance(double balance) {
? ? ? ? this.balance = balance;
? ? }
? ? public int getTalkTime() {
? ? ? ? return talkTime;
? ? }
? ? public void setTalkTime(int talkTime) {
? ? ? ? if (talkTime >= 0) {
? ? ? ? ? ? this.talkTime = talkTime;
? ? ? ? } else {
? ? ? ? ? ? System.out.println("通話時長不合理哦6率!涣仿!");
? ? ? ? }
? ? }
? ? public double getNetFlow() {
? ? ? ? return netFlow;
? ? }
? ? public void setNetFlow(double netFlow) {
? ? ? ? this.netFlow = netFlow;
? ? }
? ? // 4.提供顯示(卡號 + 用戶名 + 當(dāng)前余額)的方法
? ? public void show(){
? ? ? ? System.out.println("卡號為: "+ getCardNumber() + "勤庐,用戶名為: " + getUserName() + ",當(dāng)前余額為: " + getBalance() + "元!");
? ? }
}
package com.lagou.library;
/**
* 編程實現(xiàn)將通話套餐類和上網(wǎng)套餐類中相同的特征和行為提取出來組成抽象套餐類的封裝
*/
public abstract class AbstractPackage {
? ? // 1.私有化成員變量好港,使用private關(guān)鍵字修飾
? ? private double rate; // 用于描述每月資費的成員變量
? ? // 3.在構(gòu)造方法中調(diào)用set方法實現(xiàn)合理值的判斷
? ? public AbstractPackage() {
? ? }
? ? public AbstractPackage(double rate) {
? ? ? ? setRate(rate);
? ? }
? ? // 2.提供公有的get和set方法愉镰,并在方法體中進行合理值的判斷
? ? public double getRate() {
? ? ? ? return rate;
? ? }
? ? public void setRate(double rate) {
? ? ? ? if (rate >= 0) {
? ? ? ? ? ? this.rate = rate;
? ? ? ? } else {
? ? ? ? ? ? System.out.println("每月資費不合理哦!>凇丈探!");
? ? ? ? }
? ? }
? ? // 4.提供顯示所有套餐信息的抽象方法
? ? public abstract void show();
}
package com.lagou.library;
/**
* 編程實現(xiàn)用戶消費信息類的封裝
*/
public class UserConsumption {
? ? // 1.私有化成員變量,使用private關(guān)鍵字修飾
? ? private int talkTime;? ? // 用于描述通話時長的成員變量
? ? private double netFlow;? // 用于描述上網(wǎng)流量的成員變量
? ? private double rate;? ? // 用于描述每月資費的成員變量
? ? // 3.在構(gòu)造方法中調(diào)用set方法進行合理值的判斷
? ? public UserConsumption() {
? ? }
? ? public UserConsumption(int talkTime, double netFlow, double rate) {
? ? ? ? setTalkTime(talkTime);
? ? ? ? setNetFlow(netFlow);
? ? ? ? setRate(rate);
? ? }
? ? // 2.提供公有的get和set方法拔莱,并在方法體中進行合理值的判斷碗降,判斷這里省略了
? ? public int getTalkTime() {
? ? ? ? return talkTime;
? ? }
? ? public void setTalkTime(int talkTime) {
? ? ? ? this.talkTime = talkTime;
? ? }
? ? public double getNetFlow() {
? ? ? ? return netFlow;
? ? }
? ? public void setNetFlow(double netFlow) {
? ? ? ? this.netFlow = netFlow;
? ? }
? ? public double getRate() {
? ? ? ? return rate;
? ? }
? ? public void setRate(double rate) {
? ? ? ? this.rate = rate;
? ? }
? ? // 4.實現(xiàn)用戶消費信息的打印
? ? public void show() {
? ? ? ? System.out.println("用戶消費信息: 通話時間為: " + getTalkTime() + ",上網(wǎng)流量為: " + getNetFlow() + "塘秦,月資費為: " + getRate());
? ? }
}
package com.lagou.library;
/**
* 編程實現(xiàn)通話服務(wù)接口
*/
public interface TalkService {
? ? // 自定義抽象方法描述通話服務(wù)的功能
? ? public abstract void talk(int talkTime, PhoneCard phoneCard);
}
package com.lagou.library;
/**
* 編程實現(xiàn)上網(wǎng)服務(wù)接口
*/
public interface NetService {
? ? // 自定義抽象方法描述上網(wǎng)服務(wù)的功能
? ? public abstract void net(double netFlow, PhoneCard phoneCard);
}
package com.lagou.library;
/**
* 編程實現(xiàn)各種類庫的測試
*/
public class MainTest {
? ? public static void main(String[] args) {
? ? ? ? // 1.聲明PhoneCard類型的引用指向PhoneCard類型的對象作為下面方法的實參
? ? ? ? PhoneCard phoneCard = new PhoneCard();
? ? ? ? // 2.聲明NetService類型的引用指向NetPackage類型的對象讼渊,也就是接口引用指向?qū)崿F(xiàn)類對象從而形成了多態(tài)
? ? ? ? NetService netService = new NetPackageServiceImpl();
? ? ? ? netService.net(66, phoneCard);
? ? ? ? System.out.println("---------------------------------------------------");
? ? ? ? // 3.聲明TalkService類型的引用指向TalkPackage類型的對象,也就是接口引用指向?qū)崿F(xiàn)類對象從而形成了多態(tài)
? ? ? ? TalkService talkService = new TalkPackageServiceImpl();
? ? ? ? talkService.talk(66, phoneCard);
? ? ? ? System.out.println("---------------------------------------------------");
? ? ? ? // 4.聲明AbstractPackage類型的引用指向NetPackage類型的對象尊剔,也就是抽象類引用指向自雷的對象從而形成了多態(tài)
? ? ? ? AbstractPackage abstractPackage = new NetPackageServiceImpl(5, 30);
? ? ? ? abstractPackage.show();
? ? }
}