0

所以我正在为我的男女混合垒球队创建一个名册应用程序。联盟规则规定,如果两个男人连续击球,则必须有一个女孩跟随。如果男女比例不平衡,这会导致问题,例如,如果有 4 个女孩和 14 个男孩,则至少有一个女孩必须在同一击球顺序中击球两次才能满足“男”女孩的规则,然后她必须排在女孩队列的后面,所以下一次通过第二个女孩移动到第一个女孩的位置,第三个到第二个,依此类推。所以第三个或第四局我们在收据或其他东西的背面疯狂地写下修改后的击球顺序,因为我们试图跟踪谁在什么时候击球。

那么,我正在创建的应用程序的目的是允许用户输入击球顺序,按下一个按钮,然后查看该击球顺序外推,比如说,通过顺序四次(obv 用户可以决定多少),相应地移动阵容中的女孩。

到目前为止,该应用程序允许您添加玩家、设置他们的性别并按所需的顺序排列他们。这一切都在数据库中进行跟踪。现在我要“按下一个按钮,查看订单的 x 次”。我有什么工作,假设订单严格是“男男女”。但它无法处理其中的任何变化,例如,初始顺序是“guy girl guy guy”或“girl guy guy”。我编写的逻辑只是忽略了这一点,并将其更改为“男男女”。

我可以使用什么逻辑来正确处理任何初始击球顺序?

这是我的代码:

//pos == numerical position in the roster
public void computeKickingOrder() {
    String TAG = "cKO";
    // instantiate dbhandler
    DatabaseHandler db = new DatabaseHandler(this);

    // get all tasks
    List<Player> players = db.getAllPlayers();
    List<Player> guys = new ArrayList<Player>();
    List<Player> girls = new ArrayList<Player>();
    List<Player> theRoster = new ArrayList<Player>();

    int pCount = players.size();
    int cycles = 4;
    Log.d(TAG, "Total Players: " + pCount);

    Log.d(TAG, "Generating " + cycles + " runs through the order.");

    //one cycle = guycount + guycount/2

    //Iterator<Player> itr = players.iterator();
    Iterator<Player> itr;

    // first cycle through the whole roster and separate out guys and girls
    // use cycles + 5 to ensure that there are plenty of players available in each list 
    for (int i = 0 ; i < cycles + 5 ; i++) {
        itr = players.iterator();
        while(itr.hasNext()) {
            Player p = itr.next();
            if(p.getGender().equals("M")) { guys.add(p); }
            else { girls.add(p); }
        }
    }

    Log.d(TAG, "guys.size(): " + guys.size());
    Log.d(TAG, "girls.size(): " + girls.size());




    //below code automatically creates guy guy girl order IGNORES that a girl might be first or second
    int girlSpot = 0;
    int guyKicks = 1;
    int pos = 1;
    for(int i=0; i<guys.size(); i++) {
        if(guyKicks<3) {
            Player p = guys.get(i);
            p.setPos(pos);
            theRoster.add(p);
            guyKicks++;
            Log.d(TAG, pos + " | " + p.getGender() + " | " + p.getName());

        }

        else {
            guyKicks = 1;
            Player p = girls.get(girlSpot);
            p.setPos(pos);
            theRoster.add(p);
            girlSpot++;
            Log.d(TAG, pos + " | " + p.getGender() + " | " + p.getName());
        }

        pos++;

    }
4

2 回答 2

1

您可以创建一个简单的状态机。看看起始顺序的前两项,就知道自己处于什么状态了。也就是说,如果你有三种状态:

state 1: guy
state 2: guy
state 3: girl

程序流程从状态 1 到状态 2,然后从 2 到 3,然后从 3 返回到 1。

现在,如果您查看起始顺序中的前两项,您就会知道您开始时所处的状态:

[guy, guy]:  starting state 1
[guy, girl]: starting state 2
[girl, guy]: starting state 3
于 2013-03-25T19:54:33.570 回答
1

保留两个队列:男生和女生。生成没有特定名称的“旋转模板”,只有 gal 或 gal 表示。所以你说,

1: guy
2: guy
3: gal
4: guy
5: gal
6: guy
7: guy
8: gal
9: gal

或其他任何东西,只要它满足男-男-女规则。您通过处理旋转模板生成初始旋转。对于每个位置,你从他们各自的队列中拉出一个男人或女孩。

每次有人从队列中拉出并插入到轮换中时,他们都会被重新插入队列中。当他们面前的所有男人或女孩都用尽时,他们将再次投入战斗。

Queue<String> guys = new LinkedList<String>();
Queue<String> gals = new LinkedList<String>();

guys.add("John");
guys.add("Jeff");
guys.add("Bill");
guys.add("Frank");

gals.add("Mary");
gals.add("Tricia");

enum Gender { GUY, GAL };

Gender[] template = new Gender[] { GUY, GUY, GAL, GUY, GUY, GAL, GUY, GAL, GAL };

String[] getRotation() {
  String[] rotation = new String[9];
  for (int i = 0; i < template.length; i++) {
    String batter;
    if (template[i] == GUY) {
      batter = guys.poll();
      guys.offer(batter);
    } else {
      batter = gals.poll();
      gals.offer(batter);
    }
    rotation[i] = batter;
  }  
  return rotation;
}
于 2013-03-25T20:16:13.667 回答