实现隋朝农民起义的过程:线程的yield与方法random判别的区别

package fengke.game.thread;

import java.util.PriorityQueue;

import javax.swing.plaf.SliderUI;

/**
 * 使用线程的yield()方式实现隋朝农民起义
 * @author 锋客
 *内容:1、创建军队线程===ruannable
 *    2、创建类,存放军队信息
 *    3、演义军队战争
 *    4.演出创建
 *
 */

public class Stage {
 
 public static void main(String[] args) {
  
  //创建军队========》线程
   ArmyRunnable armyRunnable_Sui = new ArmyRunnable();
   ArmyRunnable armyRunnable_Revolt = new ArmyRunnable();
   Thread thread_armyRunnable_Sui=new Thread(armyRunnable_Sui,"隋朝军队");
   Thread thread_armyRunnable_Revolt=new Thread(armyRunnable_Revolt,"起义军");
  //定义各个军队人数和军队名
  int number_armyRunnable_Sui=100;//隋朝军队人数
  int number_armyRunnable_Revolt=80;//起义军人数
  //将军队信息存放入类中信息
  Information infor=new Information();
  infor.number_army=number_armyRunnable_Sui;
  infor.number_revolt=number_armyRunnable_Revolt;
  armyRunnable_Sui.infor=infor;
  armyRunnable_Revolt.infor=infor;
  /*
   * 开始作战
   * 使用start()与run()有区别
   *    前者进程交替使用,后者先执行完当前的run()犯法,再执行下一个代码;
   */
  System.out.println("演出即将开始:请大家带好眼镜,做好准备!!!!");
  try {
   Thread.sleep(2000);
  } catch (InterruptedException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  //战争模拟
  thread_armyRunnable_Sui.start();
  thread_armyRunnable_Revolt.start();
  try {
   Thread.sleep(2000);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  System.out.println("欢迎大家下次再来!!!");
 }

}

package fengke.game.thread;

/**
 * 军队线程
 *
 * @author 锋客 内容:1.实现军队线程的创建 2.模拟战争情况
 */

public class ArmyRunnable implements Runnable {
 Information infor;

 @Override
 public void run() {
  // 下列定义的变量在各个情况下,只调用一次,不会改变值
  // int number_armykilled = 0;
  // int number_revoltkilled = 0;
  // int number_army = infor.number_army;
  // int number_revolt = infor.number_revolt;

  int number_army = infor.number_army;
  int number_revolt = infor.number_revolt;
  switch (Thread.currentThread().getName()) {
  case "隋朝军队":

   while (true) {
    // infor.number_revolt <= 0 || infor.number_army <= 0判断单方人数是否为0
    if (infor.number_revolt <= 0 || infor.number_army <= 0) {
     if (infor.number_revolt <= 0) {
      System.out.println("隋朝军队胜利!!!");
      System.out.println("误伤平民"+(0-infor.number_revolt)+"人");
     } else {
      System.out.println("起义军胜利!!!");
      System.out.println("误伤平民"+(0-infor.number_army)+"人");
     }
     break;
    }
    int number_temp1 = 0;
    // 模拟军队的战争情况
    number_temp1 = (int) (Math.random() * 10);
    System.out.println(Thread.currentThread().getName() + "发起了强烈的进攻," + "以" + (infor.number_army) + "兵力"
      + "重伤敌军" + number_temp1 + "人!!!");
    // 可以实现累加功能,累计被杀敌军数
    infor.number_revolt = infor.number_revolt - number_temp1;
    Thread.yield();

   }

   break;
  case "起义军":
   while (true) {
    //记录本次杀敌人数
    int number_temp = 0;
    if (infor.number_revolt <= 0 || infor.number_army <= 0) {
     break;
    }
    number_temp = (int) (Math.random() * 10);
    System.out.println(Thread.currentThread().getName() + "发起了强烈的进攻," + "以" + (infor.number_revolt) + "兵力"
      + "重伤敌军" + number_temp + "人!!!");
    infor.number_army = infor.number_army - number_temp;
    Thread.yield();

   }

   break;

  default:
   System.out.println("演出结束!!!");
   break;
  }

 }

}

=============================================================================================
package fengke.game.random;

import java.util.PriorityQueue;
import java.util.Random;
import javax.swing.plaf.SliderUI;

/**
 * 通过随机数的方法实现隋唐演义(不使用yield)
 *
 * @author 锋客
 * 内容:1、创建军队线程===ruannable
 *     2、创建类,存放军队信息
 *     3、演义军队战争
 *     4、演出创建
 * 异常:线程的创建使用extends Thread的方法时出现异常
 *     java.lang.IllegalThreadStateException===同一个Thread不能重复调用start方法
 *
 */

public class Stage {

 public static void main(String[] args) {

  // 创建军队========》线程
  ArmyRunnable armyRunnable_Sui = new ArmyRunnable();
  ArmyRunnable armyRunnable_Revolt = new ArmyRunnable();
  
    /*
     * 该创建的线程有问题,在下面代码中会有提到
  * Thread thread_armyRunnable_Sui = new Thread(armyRunnable_Sui, "隋朝军队");
  * Thread thread_armyRunnable_Revolt = new Thread(armyRunnable_Revolt, "起义军");
  */
  // 定义各个军队人数和军队名
  int number_armyRunnable_Sui = 100;// 隋朝军队人数
  int number_armyRunnable_Revolt = 80;// 起义军人数
  // 将军队信息存放入类中信息
  Information infor = new Information();//专门存放军队信息
  infor.number_army = number_armyRunnable_Sui;
  infor.number_revolt = number_armyRunnable_Revolt;
  armyRunnable_Sui.infor=infor;
  armyRunnable_Revolt.infor=infor;
  //开始演出
  System.out.println("演出即将开始:请大家带好眼镜,做好准备!!!!");
  System.out.println();
  try {
   Thread.sleep(2000);
  } catch (InterruptedException e1) {
   // TODO Auto-generated catch block
   e1.printStackTrace();
  }
  /*
   * 战争模拟 内容:
   * 使用Random类 产生随机数,確定軍隊紛爭
   * 战争结束的条件:单方军队数为0
   */
  Random random = new Random();
  while(infor.number_revolt > 0 && infor.number_army > 0){
   if(random.nextInt(2)>0){
      Thread thread_armyRunnable_Sui = new Thread(armyRunnable_Sui, "隋朝军队");
      thread_armyRunnable_Sui.start();
   }else{
    Thread thread_armyRunnable_Revolt = new Thread(armyRunnable_Revolt, "起义军");
    thread_armyRunnable_Revolt.start();
   }
   try {
    Thread.sleep(200);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }
/*
 * 不使用下列代码的原因:
 *      对于一个线程来说,他只能被启动一次,不能重复启动;
 *     
 *      while(infor.number_revolt > 0 && infor.number_army > 0){
 *  if (random.nextInt(2) > 0) {
 *   thread_armyRunnable_Sui.start();
 *  } else {
 *   thread_armyRunnable_Revolt.start();
 *    }
 *      }
 */    
  System.out.println();
  System.out.println("欢迎大家下次再来!!!");
 }

}

package fengke.game.thread;

public class Information {
 public  int number_army=0;
 public  int number_revolt=0;
 

}


package fengke.game.random;

import java.util.Random;

/**
 * 军队线程
 * @author 锋客
 *  内容:
 *      1.实现军队线程的创建
 *      2.模拟战争情况
 */

public class ArmyRunnable implements Runnable {
 //存放军队信息
 Information infor;
 @Override
 public void run() {
  // 下列定义的变量在各个情况下,只调用一次,不会改变值
  // int number_armykilled = 0;
  // int number_revoltkilled = 0;
  // int number_army = infor.number_army;
  // int number_revolt = infor.number_revolt;

  int number_army = infor.number_army;
  int number_revolt = infor.number_revolt;
  switch (Thread.currentThread().getName()) {
  case "隋朝军队":
    
    int number_temp1 = 0;
    // 模拟军队的战争情况
    //number_temp1为起义军死亡人数,random类产生0----(infor.number_revolt+1)的数,防止双方最后剩一个人,造成死循环
    number_temp1 = new Random().nextInt(infor.number_revolt+1);
    System.out.println(Thread.currentThread().getName() + "发起了强烈的进攻," + "以" + (infor.number_army) + "兵力"
      + "重伤敌军" + number_temp1 + "人!!!");
    // 可以实现累加功能,累计被杀敌军数
    infor.number_revolt = infor.number_revolt - number_temp1;
    // infor.number_revolt <= 0 || infor.number_army <= 0判断单方人数是否为0
    if (infor.number_revolt <= 0 || infor.number_army <= 0) {
     if (infor.number_revolt <= 0) {
      System.out.println("隋朝军队胜利!!!");
      System.out.println("误伤平民"+(0-infor.number_revolt)+"人");
     } else {
      System.out.println("起义军胜利!!!");
      System.out.println("误伤平民"+(0-infor.number_army)+"人");
     }
    }
 

   break;
  case "起义军":
    //记录本次杀敌人数
    int number_temp = 0;
    //number_temp1为隋朝军队死亡人数,random类产生0----(infor.number_army+1)的数,防止双方最后剩一个人,造成死循环
    Random random=new Random();
    number_temp = random.nextInt(infor.number_army+1);
    System.out.println(Thread.currentThread().getName() + "发起了强烈的进攻," + "以" + (infor.number_revolt) + "兵力"
      + "重伤敌军" + number_temp + "人!!!");
    infor.number_army = infor.number_army - number_temp;
    if (infor.number_revolt <= 0 || infor.number_army <= 0) {
     if (infor.number_revolt <= 0) {
      System.out.println("隋朝军队胜利!!!");
      System.out.println("误伤平民"+(0-infor.number_revolt)+"人");
     } else {
      System.out.println("起义军胜利!!!");
      System.out.println("误伤平民"+(0-infor.number_army)+"人");
     }
    }
   break;

  default:
   
   break;
  }

 }

}


package fengke.game.random;
/**
 * 存放基本军队信息
 * @author 锋客
 *
 */
public class Information {
 public  int number_army=0;
 public  int number_revolt=0;
 

}

 


=============================================================================================

 

posted on 2015-10-28 00:01  锋客person  阅读(142)  评论(0编辑  收藏  举报