package com.ming.test;
/**
* Drunkard
* <p>
* 钱2=酒1+瓶1+盖1
*
* <p>
* 酒1+瓶1+盖1=瓶2
* <p>
* 酒1+盖1=瓶1
*
* <p>
* 酒1+瓶1+盖1=盖4
* <p>
* 酒1+瓶1=盖3
*
* <p>
* 瓶1-盖1=盖3-瓶1
* <p>
* 瓶1=盖2
*
* <p>
* 瓶1=酒2
* <p>
* 盖1=酒1
*
* <p>
* 钱2=酒1+瓶1(酒2)+盖1(酒1)=酒4
*
* <p>
* 钱10=酒20
*
* @author ming
*
*/
public class Drunkard {
// 已喝啤酒瓶数
static int drinkTimes;
// 剩余可喝啤酒数
static int beerNum;
// 剩余空瓶数
static int bottleNum;
// 剩余盖子数
static int coverNum;
// 兑换啤酒需要的空瓶数
static int bottleExNum;
// 兑换啤酒需要的盖子数
static int coverExNum;
// 啤酒单价
static int price;
// 剩余钱
static int money;
/**
* 初始化参数
*/
static void init() {
// 已喝啤酒瓶数
drinkTimes = 0;
// 剩余可喝啤酒数
beerNum = 0;
// 剩余空瓶数(喝到最后总会剩余1个)
bottleNum = 1;
// 剩余盖子数(喝到最后总会剩余1个)
coverNum = 1;
// 兑换啤酒需要的空瓶数
bottleExNum = 2;
// 兑换啤酒需要的盖子数
coverExNum = 4;
// 啤酒单价
price = 2;
// 剩余钱
money = 10;
}
/**
* 买了就喝,喝完接着买
*/
static void buyBeer() {
if (money >= price) {
money = money - price;
beerNum++;
drinkBeer();
buyBeer();
}
}
/**
* 喝完兑换,换完接着喝
*/
static void drinkBeer() {
if (beerNum > 0) {
beerNum--;
drinkTimes++;
bottleNum++;
coverNum++;
exchangeBeer();
drinkBeer();
}
}
/**
* 换完就喝,喝完接着换
*/
static void exchangeBeer() {
exchangeBeerByBottle();
exchangeBeerByCover();
// exchangeBeerByBottleAndCover();
drinkBeer();
}
/**
* 用空瓶换
*/
static void exchangeBeerByBottle() {
if (bottleNum >= bottleExNum) {
bottleNum = bottleNum - bottleExNum;
beerNum++;
exchangeBeerByBottle();
}
}
/**
* 用盖子换
*/
static void exchangeBeerByCover() {
if (coverNum >= coverExNum) {
coverNum = coverNum - coverExNum;
beerNum++;
exchangeBeerByCover();
}
}
/**
* 用空瓶和盖子组合换
*/
static void exchangeBeerByBottleAndCover() {
if ((coverExNum % 2 == 0) && (bottleExNum % 2 == 0)
&& (coverNum >= coverExNum / 2 && bottleNum >= bottleExNum / 2)) {
coverNum = coverNum - coverExNum / 2;
bottleNum = bottleNum - bottleExNum / 2;
beerNum++;
exchangeBeerByBottleAndCover();
}
}
/**
* 开始
*/
public static void start() {
init();
buyBeer();
}
public static void main(String[] args) {
start();
/*只给赊1瓶*/
System.out.println("剩余钱: " + money);
System.out.println("已喝啤酒瓶数: " + drinkTimes);
System.out.println("剩余可喝啤酒数: " + beerNum);
/* 前面借了空瓶和盖子各1个 */
System.out.println("剩余空瓶数: " + (bottleNum - 1));
System.out.println("剩余盖子数: " + (coverNum - 1));
}
}