java疯狂讲义 第6章练习

第一题,创建一个关于车的抽象类,并派生其他具体车类

public abstract class Car{
	//车的名称和作业属性
	private String carName;
	private String carFunction;
	//无参数构造器和含参构造器
	public Car(){}
	public Car(String carName,String carFunction){
		this.carName=carName;
		this.carFunction=carFunction;
	}
	//类里面的抽象方法
	public abstract void drink();
	//属性的getter
	public String getCarName(){
		return this.carName;
	}
	public String getCarFunction(){
		return this.carFunction;
	}
}
public class Tractor extends Car
{
	//抽象方法的实现
	public void drink(){
		System.out.println("拖拉机需要人驾驶");
	}
	//构造器
	public Tractor(String carName,String carFunction){
		super(carName,carFunction);
	}
	public static void main(String[] args){
		var br=new Tractor("拖拉机","减少人力负担");
		System.out.println("这是"+br.getCarName()+"它可以"+br.getCarFunction());
	}
}

第二题,定义一个接口,用匿名内部类实现它

interface TestInterface{
	int add(int a,int b);
	int multiply(int a,int b);
}
public class Test{
	//定义一个需要接口函数的方法
	public void test(TestInterface p){
		System.out.println(p.add(4,4)==p.multiply(2,4));
	}
	public static void main(String[] args){
		var br = new Test();
		br.test(new TestInterface(){
			public int add(int a,int b){
				return a+b;
			}
			public int multiply(int a,int b){
				return a*b;
			}
		});
	}
}

第三题,定义一个函数接口,用lambda表达式定义方法体

interface TestInterface{
	void print();
	default void println(){
		print();
		System.out.println("print方法已调用");
	}
}
public class Test{
	public static void main(String[] args){
		TestInterface br = ()-> {
			System.out.println("print方法");
		};
		br.println();
	}
}

第4题,做一部分梭哈游戏,记录玩家状态,实现发牌功能

public class Player{
	//对应存放牌的数组
	private int[][] chess=new int[4][13];
	private String status;
	//自定义构造器
	public Player(){
		this.status = "正在游戏中";
	}
	//放弃游戏的方法
	public void giveUp(){
		System.out.println("你已放弃游戏");
		this.status = "放弃游戏";
	}
	//chess某个元素的setter方法
	public void setChess(int hand,int line){
		chess[hand][line] = 1;
	} 
	//status的getter方法
	public String getStatus(){
		return this.status;
	}
}
import java.util.Random;
import java.util.Scanner;
public class PlayGame{
	//定义一个数组存取已发出的牌
	private static int[][] record = new int[4][13];
	public static void main(String[] args){
		//创建5个player对象
		Player[] player = new Player[5] ;
		for(int i=0;i<5;i++){
			player[i] = new Player();
		}
		var br = new PlayGame();
		//此处本该循环多次发牌游戏,但题目不要求判断是否获胜,所以这里只做初始发牌再加两次发		牌,有兴趣的可以自己写个判断游戏是否接受的方法
		for(int j=0;j<3;j++){
			//初始发牌
			if(j==0){
				for(int i=0;i<5;i++){
					br.setRandom(player[i],2);
				}}
			else {
				for(int i=0;i<5;i++)
					if(player[i].getStatus().equals("正在游戏中"))
					{
					System.out.print("玩家"+i+"分到牌:");
					br.setRandom(player[i],1);
					br.ifGiveUp(player[i]);
			}}
		}
	}
	//随机取牌
	public void setRandom(Player p,int times){
		int hand=0,line=0;
		Random rand =new Random();
		for(int i=0;i<times;i++){
			hand = rand.nextInt(3);
			line = rand.nextInt(13);
			if(record[hand][line]==1){
				i--;
			}
			else{
				p.setChess(hand,line);
				record[hand][line] = 1;
				if(times == 1)printChess(hand,line);//非初始牌
			}
		}
	}
	public void printChess(int hand,int line){
		//应该将hand分别转为花色,line>10的部分另外处理,我这里就偷点懒,啥都不弄
		System.out.println("["+hand+"]["+line+"]");
	}
	public void ifGiveUp(Player p){
		var sc = new Scanner(System.in);
		System.out.println("是否放弃游戏Y/N?");
		if(sc.next().charAt(0) == 'Y')p.giveUp();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值