兹撰写GM.java类别和RC.java类别,其代码如下:

/*---- GM.java ----*/

package GameFramework;

import java.util.Random;

 

public class GM {

 public String state_var;

 public int current_amount = -1;;

 public int current_rank = -1;

 public Boolean status = null; 

 //----------------------------------------------

 public GM(){  this.go_state_0();  }

 public void go_state_0(){  state_var = "0";  }

 public void go_connected_state_1(int amt){

 if(! state_var.contains("0")){ 

status = false;

return;  }

 state_var = "1";

 current_amount = amt;

      this.go_state_2(); 

   }

 public void go_state_2(){

   state_var = "2";

   status = true;

     }

 public void go_prizes_state_3(int amt, int bet){

if(! state_var.contains("2")){ 

status = false; return;  }

state_var = "3";

     // 计算奖金

     RC obj = new RC();

     current_rank = obj.getRandomInt(0, 1000);

     int prize = current_rank * bet; 

     if(prize > 0) amt += bet;

     current_amount = amt + prize;

     this.go_state_2();

         }

public void go_finished_state_4(){

 if(! state_var.contains("2")){ 

status = false;  return;  }

      state_var = "4";

 this.go_state_2(); 

   }

public class RC{   

    public int getRandomInt(int min,int max) {   

        try { Thread.sleep(2);   

        } catch (InterruptedException ex)  {  ex.printStackTrace();  }   

        Random randomizer = new Random(System.currentTimeMillis());   

        int k = randomizer.nextInt(max-min+1)+min;  

        if(k < 500) return 0; 

   if(k<750) return 1;  

   if(k<875) return 2; 

   if(k<938) return 3; 

   if(k<969) return 4;

   if(k<984) return 5; 

   if(k<994) return 6; 

   if(k<1000) return 7;

   return 0;  }   

}}

 

    此RC类别是依据随机值而换算出获奖的奖项(Rank),其实各家游戏场都有不一样的奖项决定规则,而且随时都可能更换新的奖项规则。上述RC类别只是一个简单范例而已。接着,兹撰写smConsoleStub类别,其程序代码如下:

/*---- smConsoleStub.java ----*/

package GameFramework;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;   

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import com.google.appengine.api.users.User;

import com.google.appengine.api.users.UserService;

import com.google.appengine.api.users.UserServiceFactory;

 

@SuppressWarnings("serial")

public abstract class smConsoleStub extends HttpServlet {   

 private GM gm = null;

 private User user = null; 

 private String strResult;

 protected void doGet(HttpServletRequest req, HttpServletResponse resp)   

            throws ServletException, IOException {  

UserService userService = UserServiceFactory.getUserService();

user = userService.getCurrentUser();

gm = new GM();  String gm_state = null; 

HttpSession session = req.getSession();

Object obj = session.getAttribute("gmState");

if(obj != null ){

         gm_state = (String)obj;

         gm.state_var = gm_state;  }

         String strCode = req.getParameter("code");

         String sv1 = req.getParameter("value1");

         String sv2 = req.getParameter("value2");

         int code = Integer.valueOf(strCode);

         if(code == 0) {

process(sv1);

if(gm.status == false) strResult = "Fail:99,99";  }

    else strResult = Test(sv1, sv2);

    session.setAttribute("gmState", gm.state_var);

    resp.setContentType("text/plain");

resp.getWriter().println(strResult);

}  

private void process(String msg){

char cmd = msg.charAt(0);

if(cmd == 'I'){ 

gm.go_state_0();

gm.go_connected_state_1(onInitialAmount(user));

String strAmt = String.valueOf(gm.current_amount);

strResult = "Init:" + strAmt + ",99";

}

    if(cmd == 'B'){

int idx = msg.indexOf(",");

String str_a = msg.substring(5, idx);

String str_b = msg.substring(idx+1);

int amt = Integer.parseInt(str_a);  int bet = Integer.parseInt(str_b);

gm.go_prizes_state_3(amt, bet);

String strAmt = String.valueOf(gm.current_amount);

strResult = "Bett:" + strAmt + "," + String.valueOf(gm.current_rank);

       }

    if(cmd == 'F'){

int idx = msg.indexOf(",");

String str_amt = msg.substring(5, idx);

int amt = Integer.parseInt(str_amt);

boolean ret = onFinished(user, amt);

if(ret){

gm.go_finished_state_4();

strResult = "Fini:99,99";  }

else  strResult = "Fail:99,99";

}}

private String Test(String sv1, String sv2) {  return "***";   }

abstract protected int onInitialAmount(User user);

abstract protected boolean onFinished(User user, int final_amount);

}