📄 adventuredragon.java
字号:
import Utilities.*;
import Synchronization.*;
class Adventurer extends MyObject implements Runnable {
private int cntStones;
private int cntRings;
private int cntNecklaces;
private int cntFortune;//record fortune number
static int f_size;//max fortune size
//private ADmonitor admon = null;
private EstablishRendezvous er = null;
//public Adventurer(String name,int f_size,ADmonitor admon){
public Adventurer(String name,int f_size,EstablishRendezvous er){
super(name);
this.f_size = f_size;
//this.admon = admon;
this.er = er;
cntFortune =0;
cntStones =(int)(Math.random() * 2 + 0.5); //init
cntRings =(int)(Math.random() * 2 + 0.5);
cntNecklaces =(int)(Math.random() * 2 + 0.5);
new Thread(this).start();
}
public void goHome(){
System.out.println(getName()
+ " have enough fortune,he go home now" );
Thread.interrupted();
}
public int canMakeJewel(){
if (cntStones<1) return -1;
if (cntRings>=1)return 1;//magic ring
if (cntNecklaces>=1)return 2;//magic necklace
return -1; //1,0,0 case
}
public void makeJewel(int f_type){
if (f_type==1)cntRings--;
if (f_type==2)cntNecklaces--;
cntStones--;
cntFortune++;
System.out.println("age=" + age() + ", " + getName()
+ " accumulate a new jewel!Now his fortune size:" +cntFortune);
}
public int playDice(){ //return 1:win -1:lose
int dice_A =(int)(Math.random() * 6);
int dice_D =(int)(Math.random() * 6);
if (dice_A >= dice_D ){ //adventurer win
int item = (int)(Math.random() * 2+0.5);
switch (item){
case 0:
cntStones++;
break;
case 1:
cntRings++;
break;
case 2:
cntNecklaces++;
break;
default:
}
System.out.println("age=" + age() + ", " + getName()+ " win an item in playing dice" );
return 1;
}else { //adventurer lose
System.out.println("age=" + age() + ", " + getName()
+ " lose in playing dice" );
//admon.loseDragon();
//admon.leaveDragon();
//admon.meetDragon();
return -1;
}
}
public void run() {
int tt;
System.out.println("age=" + age() + ", " + getName()
+ " stones:" + cntStones + " rings:" + cntRings + " Necklaces:"+ cntNecklaces);
tt = canMakeJewel();
AdvMessage rrr;
do{
if (tt>0){
rrr = new AdvMessage(getName(),"MakeJewel");
System.out.println("age()=" + age() + ", " + getName()
+ " wants to MakeJewel");
//admon.enterShop();
//admon.findClerk();
rrr = (AdvMessage)
er.clientToServer().clientMakeRequestAwaitReply(rrr);
makeJewel(tt);
System.out.println("age()=" + age() + ", " + getName()
+ " after MakeJewel");
//admon.leaveClerk();
//admon.leaveShop();
}
tt = canMakeJewel();
}while(tt>0);
if (cntFortune==f_size)goHome();
while(cntFortune<f_size){
//admon.meetDragon();
rrr = new AdvMessage(getName(),"PlayDice");
System.out.println("age()=" + age() + ", " + getName()
+ " wants to PlayDice");
do{ //play dice with dragon util can make jewel
rrr = (AdvMessage)
er.clientToServer().clientMakeRequestAwaitReply(rrr);
int success = playDice();
if(success<0){ //lose
//admon.leaveDragon();
//admon.meetDragon();//??go back end of line
}
tt = canMakeJewel();
}while(tt<0);
//admon.leaveDragon();
//go to shop
//admon.enterShop();
//admon.findClerk();
rrr = new AdvMessage(getName(),"MakeJewel");
System.out.println("age()=" + age() + ", " + getName()
+ " wants to MakeJewel");
rrr = (AdvMessage)
er.clientToServer().clientMakeRequestAwaitReply(rrr);
makeJewel(tt);
//admon.leaveClerk();
//admon.leaveShop();
}
rrr = new AdvMessage(getName(),"goHome");
System.out.println("age()=" + age() + ", " + getName()
+ " wants to goHome");
rrr = (AdvMessage)
er.clientToServer().clientMakeRequestAwaitReply(rrr);
goHome();
}
}
class Dragon extends MyObject implements Runnable {
private int cNap = 0; // milliseconds
public Dragon(String name) {
super(name);
new Thread(this).start();
}
public void run() {
double item;
int napping;
}
}
class AdventureDragon extends MyObject {
public static void main(String[] args) {
// parse command line arguments, if any, to override defaults
GetOpt go = new GetOpt(args, "Ua:c:g:f:");
go.optErr = true;
String usage = "Usage: -a numAdv -c numClerk -g group_size -f fortune_size";
int numAdv = 9; // defaults
int numClerk = 2;
int group_Size = 3;
int fortune_size = 5;
int ch = -1;
while ((ch = go.getopt()) != go.optEOF) {
if ((char)ch == 'U') {
System.out.println(usage); System.exit(0);
}
else if ((char)ch == 'a')
numAdv = go.processArg(go.optArgGet(), numAdv);
else if ((char)ch == 'c')
numClerk = go.processArg(go.optArgGet(), numClerk);
else if ((char)ch == 'g')
group_Size = go.processArg(go.optArgGet(), group_Size );
else if ((char)ch == 'f')
fortune_size = go.processArg(go.optArgGet(), fortune_size);
else {
System.err.println(usage); System.exit(1);
}
}
System.out.println("AdventureDragon: numAdv =" + numAdv + ", numClerk ="
+ numClerk + ", group_Size=" + group_Size + ", fortune_size=" + fortune_size);
//ADmonitor admon = new ADmonitor(group_Size, numClerk);
boolean threadedServer = true;//false;
if (threadedServer)
System.out.println
("Each client request will be handled in its own server thread");
// create the server
EstablishRendezvous er = new EstablishRendezvous();
MultiThreadedServer s = new MultiThreadedServer(er, threadedServer);
for (int i = 0; i < numAdv; i++)
//new Adventurer("Adventurer"+i, fortune_size,admon );
new Adventurer("Adventurer"+i, fortune_size,er );
new Dragon("Dragon");
System.out.println("All threads started");
// let them run for a while
nap(10*1000);
System.out.println("age()=" + age()
+ ", time to stop the threads and exit");
System.exit(0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -