HomepageTeaching PageResearch PageResources Page

Popping Balloons Tournament!

Round 0

Standings Summary


0 - 0
  • Random #0
  • Random #1
  • Random #2
  • Random #3
  • Random #4
  • Depth One #0
  • Depth One #1
  • Depth One #2
  • Depth One #3

Matches


Full Standings

  1. Random #0: (0 - 0, opp matches: 0 - 0, games: 0 - 0, opp games: 0 - 0)
    • Depth One #2: (0 - 0, opp matches: 0 - 0, games: 0 - 0, opp games: 0 - 0)
      • Random #3: (0 - 0, opp matches: 0 - 0, games: 0 - 0, opp games: 0 - 0)
        • Depth One #0: (0 - 0, opp matches: 0 - 0, games: 0 - 0, opp games: 0 - 0)
          • Random #1: (0 - 0, opp matches: 0 - 0, games: 0 - 0, opp games: 0 - 0)
            • Random #4: (0 - 0, opp matches: 0 - 0, games: 0 - 0, opp games: 0 - 0)
              • Depth One #3: (0 - 0, opp matches: 0 - 0, games: 0 - 0, opp games: 0 - 0)
                • Depth One #1: (0 - 0, opp matches: 0 - 0, games: 0 - 0, opp games: 0 - 0)
                  • Random #2: (0 - 0, opp matches: 0 - 0, games: 0 - 0, opp games: 0 - 0)

                    Make-Your-Own Player

                    (It is recommended that you write your code in a separate text editor, then copy-paste it here.)


                    (This does not submit your player to the tournament we're planning on having.)

                    Here is an example that just pops the first button it sees:

                    function userGetMove(poppingBalloonsPosition) {
                        var option = poppingBalloonsPosition.clone();
                        var numColumns = option.getWidth();
                        var numRows = option.getHeight();
                        for (var columnIndex = 0; columnIndex < numColumns; columnIndex++) {
                            for (var rowIndex = 0; rowIndex < numRows; rowIndex++) {
                                if (option.columns[columnIndex][rowIndex]) {
                                    //there is an unpopped balloon at columns[columnIndex][rowIndex]
                                    option.columns[columnIndex][rowIndex] = false;
                                    return option;
                                }
                            }
                        }
                        console.log("Error: didn't find an unpopped balloon.  Returning null.");
                        return null;
                    }

                    EFAQ: Expected Frequently-Asked Questions

                    What is Popping Balloons?

                    Popping Balloons is an impartial combinatorial game played on a rectangular array of balloons. On their turn, the current player chooses to pop some balloons. They can either pop any single balloon, or two adjacent balloons, or all balloons (2, 3, or 4) in a 2x2 square. We have a page where you can manually play Popping Balloons.

                    What is this for?

                    We are holding a computer player tournament as part of Sprouts 2022. People can use this to test their players. Instructions to submit a player are below.

                    How big will the boards be in the tournament? How many games will be played per match?

                    I think 10x10 is pretty good, and 15 games seems to work pretty well.

                    Why doesn't my symmetry player always win?

                    The positions start with some balloons automatically popped, so they won't always be symmetric. I do think a symmetry player would fare pretty well, though. Submit it!

                    I wrote a brute-force player that always finds the optimal solution. Do I win?

                    We'll need players to run efficiently. For the actual conference tournament, if we run this with a bunch of contestants at the same time as we're running Zoom, it will get bogged down quickly. (And Kyle's laptop is not very powerful.) Please make sure your player takes their turn in less than 4 seconds on a 10x10 board on your own machine. (If your machine isn't too overpowered, that should equate to about 10 seconds on my laptop.) If specific players are running too long, we'll have to exclude them from the tournament. (If you disagree with these rules, feel free to talk to me.)

                    I got a player working real well! How do I submit it to your tournament?

                    Check out the instructions below. (After this EFAQ.)

                    How do I get updates about the tournament?

                    Keep watching this space, or watch @CGTKyle (Twitter) for updates.

                    Kyle, this code is awful! Did you write this? I see tons of scripting code in the HTML source and inline styling. What have you done?

                    Oh yeah. I got it working, but I definitely need to clean it up. Please don't tell my software engineering students! I'll refactor it when I have time (famous last words).


                    Submitting Your Player to the (Actual) Tournament

                    If you get a player working as above, you'll need to make a few changes to get it working for the actual Sprouts tournament.

                    1. Choose a name for your player. The name should (1) be something no one else will choose, (2) be in PascalCase, and (3) be appropriate to read and speak in an academic setting. We reserve the right to drop players without notice, and vulgar or inappropriate language is part of that. We recommend keeping the name length to 15 characters.
                    2. Your class will need to subclass the ComputerPlayer class I've created, so you'll need to add some extra code to wrap your function in. Copy/paste the following code into a text file named <YourPlayerName>.js, with <YourPlayerName> replaced by the name you chose above.
                      //author: <Your name or your team's name>, yourcontactemail@example.com
                      var <YourPlayerName> = Class.create(ComputerPlayer, {
                          initialize: function() {
                              //nothing needed here.
                          },
                      
                          givePosition: function(playerIndex, position, referee) {
                              referee.moveTo(this.userGetMove(position));
                          },
                      
                          userGetMove: function(poppingBalloonsPosition) {
                              //paste your code in here.
                          },
                      
                          getName: function() {
                              return "<YourPlayerName>";
                          },
                      
                          getAuthor: function() {
                              return "<Your name or your team's name>";
                          }
                      });
                    3. Copy paste the body of your userGetMove function into the function of the same name there. Feel free to add to your player's initialize (constructor) if you need to hold any info between moves.
                    4. Modify the name of the class to be your player's name. Modify the body of getName to also return your player's name as a string. Modify the body of getAuthor to return your name or your team's name. Finally, modify the first line to include your team name and a contact email address so we can get in touch with you if necessary.
                    5. If you make significant modifications, ensure again that your player makes moves within 4 seconds on a 10 x 10 board.
                    6. Use our Dropbox to submit your code. By submitting your player to us, you are giving us permission to run the code in a public setting. As mentioned above, we reserve the right to not include your submission in the tournament. We have two separate Dropboxes set up:
                    7. The submission deadline is Wednesday, April 20, 2022, at 11pm EST.
                    8. If you create an even better player, please resubmit your code with the same (file) name. If this system works, we'll use the latest version provided before the deadline above.