黑马程序员技术交流社区

标题: 一家Android游戏公司的面试题 求助啊! [打印本页]

作者: Chelsea_Lampard    时间: 2013-5-9 12:30
标题: 一家Android游戏公司的面试题 求助啊!
本帖最后由 Chelsea_Lampard 于 2013-5-12 00:39 编辑

最近学完Java基础,想了解下要java要掌握到什么程度才能进公司,磕磕绊绊面试一家公司,结果不必多说。。自然悲催了。。。其中面试题有一题是这样的。
公司现在有个项目,要设计一款游戏,其中等级设置模块功能需求如下:
1、英雄升级,从0级升到1级,概率100%。
从1级升到2级,有1/3的可能成功;1/3的可能停留原级;1/3的可能下降到0级;
从2级升到3级,有1/9的可能成功;4/9的可能停留原级;4/9的可能下降到1级。
每次升级要花费一个元宝,不管成功还是停留还是降级。
求英雄从0级升到3级平均花费的元宝数目。

当时有点蒙。。感觉有一点点思路又抓不住。求大神们来指点!!!提供思路,有伪码就更好了!!拜谢各位!
作者: 钱冰    时间: 2013-5-9 12:37
这么难。。。。。
真佩服啊,学了一点基础就去面试了。。。。。。
作者: 谭威    时间: 2013-5-9 13:10
不用看。一多半是他们自己的项目遇到的问题做不下去了,就找人面试做的
作者: 刘学明       时间: 2013-5-9 13:18
{:soso_e136:}没思路
作者: 飞鸟青崖    时间: 2013-5-9 14:12
本帖最后由 飞鸟青崖 于 2013-5-9 14:22 编辑
  1. import java.util.ArrayList;
  2. import java.util.Random;
  3. class E1 {
  4.         public static int num = 0,sum = 0;//前一个代表宝石数,后一个代表总数
  5.         public static int grade = 0;//等级
  6.         public static ArrayList<Integer> als = new ArrayList<Integer>();
  7.         public static void main(String[] args) {               
  8.                 for (int i = 0; i < 2000; i++) {//求2000个人的平均数,这个数可以放大。
  9.                         grade = 0;//将一个新人的级数,宝石数都置为0
  10.                         num = 0;
  11.                         in:while (grade != 3) {//求一个人升到3级时候需要的宝石数。
  12.                                 switch (grade) {
  13.                                 case 0:
  14.                                         Z2O();
  15.                                         continue in;
  16.                                 case 1:
  17.                                         O2T();
  18.                                         continue in;
  19.                                 case 2:
  20.                                         T2T();
  21.                                         continue in;
  22.                                 }
  23.                         }
  24.                         als.add(num);
  25.                 }
  26.                 for(Integer al : als){
  27.                         sum +=al;//求2000个人的总需要的宝石数。
  28.                 }
  29.                 System.out.println("平均:"+(int)(sum/als.size()));
  30.         }
  31.         public static void Z2O()        {//0级升到1级
  32.                 grade++;
  33.                 num++;
  34.         }
  35.         public static void O2T()//1级升到2级
  36.         {
  37.                 int a =new Random().nextInt(3)+1;//模拟成功的概率。产生1,2,3三个数。
  38.                 switch(a)
  39.                 {
  40.                         case 1://代表失败
  41.                                 grade--;
  42.                                 num++;
  43.                                 break;
  44.                         case 2://代表留在原级
  45.                                 num++;
  46.                                 break;
  47.                         case 3://代表成功
  48.                                 grade++;
  49.                                 num++;
  50.                                 break;
  51.                 }
  52.         }
  53.         public static void T2T(){//2级升到3级。原理同上。
  54.                 int a =new Random().nextInt(9)+1;
  55.                 switch(a)
  56.                 {
  57.                         case 1:
  58.                                 grade++;
  59.                                 num++;
  60.                                 break;
  61.                         case 2:
  62.                         case 3:
  63.                         case 4:
  64.                         case 5:
  65.                                 num++;
  66.                                 break;
  67.                         default:
  68.                                 grade--;
  69.                                 num++;
  70.                                 break;
  71.                 }
  72.         }

  73. }
复制代码

作者: zms2100    时间: 2013-5-9 14:15
仅记得的是感觉这个跟高中数学中的一个概率学有点类似,不过具体的说不上来,可能相对较难些(自己也没什么印象),楼主可以去了解下概率学或者常有人说的"算法"等。
(这道题先存着,觉得是挺实用的,谢谢LZ分享)
作者: 飞鸟青崖    时间: 2013-5-9 14:31
飞鸟青崖 发表于 2013-5-9 14:12

这个只是我自己的思路,不知道对不对。概率的计算已经忘记了,所以也没办法进行验证。
作者: 王靖远    时间: 2013-5-9 15:12
牵涉到掉级,感觉挺难的。收藏了。
作者: 陈圳    时间: 2013-5-9 16:12
  1. import java.awt.FlowLayout;
  2. import java.awt.LayoutManager;
  3. import java.awt.event.ActionEvent;
  4. import java.awt.event.ActionListener;
  5. import java.text.NumberFormat;
  6. import javax.swing.JButton;
  7. import javax.swing.JFrame;
  8. import javax.swing.JLabel;
  9. import javax.swing.JOptionPane;
  10. import javax.swing.JPanel;
  11. import javax.swing.JTextArea;
  12. import javax.swing.JTextField;
  13. import javax.swing.border.TitledBorder;

  14. public class Example12{

  15.         /**1、英雄升级,从0级升到1级,概率100%。
  16.         从1级升到2级,有1/3的可能成功;1/3的可能停留原级;1/3的可能下降到0级;
  17.         从2级升到3级,有1/9的可能成功;4/9的可能停留原级;4/9的可能下降到1级。
  18.         每次升级要花费一个元宝,不管成功还是停留还是降级。
  19.         求英雄从0级升到3级平均花费的元宝数目。
  20.          * @param args
  21.          */
  22.         JFrame login;
  23.         JFrame test;
  24.         private int gold;
  25.         private static int level=1;
  26.         private double rate;
  27.         private JLabel goldLabel;
  28.         private JLabel levelLabel;
  29.         private JLabel rateMsg;
  30.         private JButton levelUp;
  31.         private JButton exit;
  32.         private JTextArea result;
  33.         private JLabel prompt;
  34.         private Status status;
  35.         public Example12(){
  36.                 loginInit();
  37.                 testInit();
  38.         }
  39.         public void testInit(){
  40.                 //信息面板
  41.                 JPanel msgPanel=new JPanel();
  42.                 //提示面板
  43.                 JPanel promptPanel=new JPanel();
  44.                 //接扭面板
  45.                 JPanel btnPanel=new JPanel();
  46.                 //升级结果
  47. //                JPanel panel=new JPanel();
  48.                 test=new SwingFrame().getFrame("测试窗口",550,350,new FlowLayout());
  49.                 test.setVisible(false);
  50.                 //元宝数
  51.                 //初始化控件
  52.                 conInit();
  53.                 //设置面板提示信息
  54.                 msgPanel.setBorder(new TitledBorder("人物信息:"));
  55.                 promptPanel.setBorder(new TitledBorder("升级提醒:"));
  56.                 btnPanel.setBorder(new TitledBorder("操作"));
  57.                
  58.                 msgPanel.add(goldLabel);
  59.                 msgPanel.add(levelLabel);
  60.                 msgPanel.add(rateMsg);
  61.                 promptPanel.add(result);
  62.                 promptPanel.add(prompt);
  63.                 btnPanel.add(levelUp);
  64.                 btnPanel.add(exit);
  65.                 //增加面板到窗体
  66.                 test.add(msgPanel);
  67.                 test.add(promptPanel);
  68.                 test.add(btnPanel);
  69.                 addAction();
  70.         }
  71.         public void conInit(){
  72.                 goldLabel=new JLabel();
  73.                 //等级数提示
  74.                 levelLabel=new JLabel("你目前的等级为:"+level);
  75.                 //成功机率
  76.                 rateMsg=new JLabel("目前提升的成功率为:"+getRate());
  77.                 //升级提示
  78.                 prompt=new JLabel();
  79.                 //结果
  80.                 result=new JTextArea(5,2);
  81.                 result.append(getMsg());
  82.                 result.setEditable(false);
  83.                 levelUp=new JButton("升级");
  84.                 exit=new JButton("结束");
  85.         }
  86.         public void addAction(){
  87.                 levelUp.addActionListener(new ActionListener(){
  88.                         @Override
  89.                         public void actionPerformed(ActionEvent e) {
  90.                                 if(gold>0){
  91.                                         status=getStatus();
  92.                                         goldLabel.setText("你目前的元宝数:"+--gold+"个");
  93.                                         levelLabel.setText("你目前的等级为:"+status.getLevel());
  94.                                         prompt.setText(getResult());
  95.                                         rateMsg.setText("目前提升的成功率为:"+getRate());
  96.                                         result.setText(getMsg());
  97.                                 } else {
  98.                                         goldLabel.setText("你目前的元宝数不足,不能继续提升!");
  99.                                 }
  100.                                
  101.                         }
  102.                 });
  103.                 exit.addActionListener(new ActionListener(){
  104.                         @Override
  105.                         public void actionPerformed(ActionEvent e) {
  106.                                 System.exit(0);
  107.                         }
  108.                 });
  109.         }
  110.         public void loginInit(){
  111.                 login=new SwingFrame().getFrame("登录窗口",250,120,new FlowLayout());
  112.                 JLabel label=new JLabel("请设置测试元宝数量");
  113.                 final JTextField txt=new JTextField(10);
  114.                 JButton testBtn=new JButton("测试");
  115.                 JButton exitBtn=new JButton("退出");
  116.                 testBtn.addActionListener(new ActionListener(){
  117.                         @Override
  118.                         public void actionPerformed(ActionEvent e) {
  119.                                 if(!txt.getText().equals(""))
  120.                                         gold=Integer.parseInt(txt.getText());
  121.                                 if(gold>0){
  122.                                         goldLabel.setText("你目前的元宝数:"+gold+"个");
  123.                                         login.setVisible(false);
  124.                                         test.setVisible(true);
  125.                                 }
  126.                                 else JOptionPane.showMessageDialog(null,"输入的元宝数必须大于0,否则无法提升!");
  127.                         }
  128.                 });
  129.                 exitBtn.addActionListener(new ActionListener(){
  130.                         @Override
  131.                         public void actionPerformed(ActionEvent e) {
  132.                                 System.exit(0);
  133.                         }
  134.                 });
  135.                 login.add(label);
  136.                 login.add(txt);
  137.                 login.add(testBtn);
  138.                 login.add(exitBtn);
  139.         }
  140.         public String getResult(){
  141.                 status=getStatus();
  142.                 System.out.println(status);
  143.                 switch(status){
  144.                         case LEVEL_UP:return "提升成功,等级 +1";
  145.                         case LEVEL_DOWN:return "提升失败,等级 -1";
  146.                         default:return "等级不变!";
  147.                 }
  148.                
  149.         }
  150.         //根据成功率判定是否升级成功
  151.         public Status getStatus(){
  152.                 int bfLevel=level;
  153.                 rate=1.0;
  154.                 for(int i=0;i<level;i++,rate/=3);//以/3率增加提升难度,写循环是为了更多等级
  155.                 double num=Math.random();
  156.                 if(num<rate)  //最开始是1.0也就是100%,然后是1/3,1/9,1/27...所以这里难度会越来越高.与题意也相符
  157.                         return Status.LEVEL_UP;
  158.                 else if((num-rate)/2>0){//判断是否降级
  159.                         return Status.LEVEL_DOWN;
  160.                 }
  161.                 else return Status.LEVEL;
  162.         }
  163.         public String getRate(){
  164.                 NumberFormat f=NumberFormat.getInstance();
  165.                 for(int i=0;i<level;i++,rate/=3);
  166.                 f.setMaximumFractionDigits(2);
  167.                 double value=Double.parseDouble(f.format(rate));
  168.                 return (value*100)+"%";
  169.         }
  170.         public String getMsg(){
  171.                 String msg=null;
  172.                 switch(level){
  173.                         case 1:rate=1.0;msg="目前升级"+(rate*100)+"%成功率,无失败逞罚";break;
  174.                         case 2:rate=0.3;result.append("目前升级"+(rate*100)+"%成功率有1/3的可能成功,\n"+"1/3的可能停留原级;\n1/3的可能下降到0级");break;
  175.                         case 3:rate=0.1;msg="目前升级"+(rate*100)+"%有1/9的可能成功;\n4/9的可能停留原级;\n4/9的可能下降到1级";break;
  176.                 }
  177.                 return msg;
  178.         }
  179.        
  180.         public static void main(String[] args) {
  181.                 new Example12();
  182.         }
  183.         enum Status{
  184.                 LEVEL_UP,LEVEL_DOWN,LEVEL;
  185.                 public  int getLevel(){
  186.                         switch(this){
  187.                         case LEVEL_UP:level++;break;
  188.                         case LEVEL_DOWN:level--;break;
  189.                         default:break;
  190.                         }
  191.                         return level;
  192.                 }
  193.         }

  194. }
  195. class SwingFrame{
  196.         JFrame frame=new JFrame();
  197.         SwingFrame(){
  198.                 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  199.                 frame.setResizable(false);
  200.                 frame.setLocation(200,100);
  201.                 frame.setVisible(true);
  202.         }
  203.         public  JFrame getFrame(String title,int width,int height,LayoutManager layout){
  204.                 frame.setTitle(title);
  205.                 frame.setSize(width,height);
  206.                 frame.setLayout(layout);
  207.                 return frame;
  208.         }
  209. }
复制代码
功能全部实现了.因为GUI的问题代码写的太多了.布局出了问题.很难看.还有提示信息出了错.很麻烦,不改了,如果不实现GUI.那么里面的功能都实现了.

作者: 陈圳    时间: 2013-5-9 16:54
  1. import java.util.Arrays;

  2. import bluecup.Hero.Status;

  3. public class Example13 {

  4.         /**1、英雄升级,从0级升到1级,概率100%。
  5.          从1级升到2级,有1/3的可能成功;1/3的可能停留原级;1/3的可能下降到0级;
  6.          从2级升到3级,有1/9的可能成功;4/9的可能停留原级;4/9的可能下降到1级。
  7.          每次升级要花费一个元宝,不管成功还是停留还是降级。
  8.          求英雄从0级升到3级平均花费的元宝数目。
  9.          * @param args
  10.          */
  11.         public static void main(String[] args) {
  12.                 start(10);
  13.         }
  14.         public static void start(int n){
  15.                 int[] arr=new int[n];//统计下数组,不清楚这是让程序得出结果还是我们自己心算...
  16.                 Hero hero;
  17.                 int sum=0;
  18.                 for(int i=0;i<n;i++){
  19.                         int gold=0;
  20.                         hero=new Hero();
  21.                         while(hero.getLevel()!=3){
  22.                                 hero.setLevel(getStatus(hero).getResult(hero.getLevel()));
  23.                                 gold++;
  24.                         }
  25.                         arr[i]=gold;
  26.                         sum+=gold;
  27.                 }
  28.                 System.out.println(Arrays.toString(arr));
  29.                 System.out.println("平均元宝数:"+(sum/n)+"个");
  30.         }
  31.         public static Status getStatus(Hero hero){
  32.                 int bfLevel=hero.getLevel();
  33.                 double rate=1.0;
  34.                 for(int i=0;i<bfLevel;i++,rate/=3);//以/3率增加提升难度,写循环是为了更多等级
  35. //                System.out.println("rate="+rate);
  36.                 double num=Math.random();//产生>0<1的数
  37.                 if(num<rate)  //最开始是1.0也就是100%,然后是1->1/3->1/9
  38.                         return Status.LEVEL_UP;
  39.                 else if((num-rate)/2>0){//判断是否降级
  40.                         return Status.LEVEL_DOWN;
  41.                 }
  42.                 else return Status.LEVEL;
  43.         }
  44. }

  45. class Hero{
  46.         //英雄只有等级...
  47.         private  int level;
  48.         public int getLevel() {
  49.                 return level;
  50.         }

  51.         public void setLevel(int level) {
  52.                 this.level = level;
  53.         }
  54.         enum Status{
  55.                 LEVEL_UP,LEVEL_DOWN,LEVEL;
  56.                 public int getResult(int level){
  57.                         switch(this){
  58.                                 case LEVEL_UP:System.out.println("恭喜你,提升成功,等级+1,目前等级:"+(++level));return level;
  59.                                 case LEVEL_DOWN:System.out.println("不幸,提升失败,等级-1,目前等级:"+(--level));return level;
  60.                                 default:System.out.println("等级保待不变!目前等级:"+level);return level;
  61.                         }
  62.                 }
  63.         }
  64. }
复制代码
程序变动性很大.做了几次测试,几率与变动是正确的.
作者: 吴文彬    时间: 2013-5-9 17:37
f[i]表示目前在第i级,升到满级的元宝期望
f[2] = 1 + 1/9 f[3] + 4/9 f[2] + 4/9  f[1]
f[1] = 1 + 1/3 f[2] + 1/3 f[1] + 1/3 f[0]
f[0] = 1 + f[1]
f[3] = 0
解方程即可。
楼主看看马尔可夫....
作者: 吴文彬    时间: 2013-5-9 17:51
http://baike.baidu.com/view/340221.htm 这是马尔可夫链的解释。
楼主有兴趣可以研究研究!

作者: 曹德君    时间: 2013-5-9 17:56
能人真多啊............
作者: 张旺达    时间: 2013-5-9 18:14
有大神出没~。。
作者: DMY2008    时间: 2013-5-9 18:25
勇气可嘉、、、可以哈!
作者: lipingan0520    时间: 2013-5-9 20:40
陈圳 发表于 2013-5-9 16:12
功能全部实现了.因为GUI的问题代码写的太多了.布局出了问题.很难看.还有提示信息出了错.很麻烦,不改了,如果 ...

到处都有你的影子啊,有时间做个俄罗斯方块试试吧。
图形界面、人机对战、两人对弈、排名什么的,如果可以来个局域网对战的....:)
作者: 卫奔    时间: 2013-5-9 21:00
吴文彬 发表于 2013-5-9 17:37
f表示目前在第i级,升到满级的元宝期望
f[2] = 1 + 1/9 f[3] + 4/9 f[2] + 4/9  f[1]
f[1] = 1 + 1/3 f[2]  ...

;P;P;P仰慕大神啊
作者: 陈圳    时间: 2013-5-9 21:30
lipingan0520 发表于 2013-5-9 20:40
到处都有你的影子啊,有时间做个俄罗斯方块试试吧。
图形界面、人机对战、两人对弈、排名什么的,如果可 ...

有这样的一个教程的,教的很好.但是已经没时间了,明天就去黑马了.在家闲的时候太长.学起来又没有动力,就喜欢在论坛找些题做做.现在除了做题有点感觉,其他的基础知识忘了很多话,一个多月没有复习过了...
作者: Super_Class    时间: 2013-5-9 23:08
看看老师的移动收费问题,这就不是问题了
作者: lipingan0520    时间: 2013-5-10 08:05
陈圳 发表于 2013-5-9 21:30
有这样的一个教程的,教的很好.但是已经没时间了,明天就去黑马了.在家闲的时候太长.学起来又没有动力,就喜 ...

好的,一路顺风啊:)
作者: 刘胜寒    时间: 2013-5-10 10:13
概率论里面的东西。。。。
这类题目好像是采用高斯消元定理来处理。。
好象是的。。。。

作者: Sword    时间: 2013-5-10 20:30
如果问题已经解决,请将问题改为“已解决”,谢谢
作者: 李志敏    时间: 2013-5-10 22:24
这貌似考数学的。。。
作者: Chelsea_Lampard    时间: 2015-6-1 10:50
感谢各位同学无私的回复




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2