Skip to content
operational.txt 2.18 KiB
Newer Older
-*- mode: org -*-
ֻݵĵ

* notes
** game design
- buttons are named Button1 to Button15. last empty block is named Button0.
- 
* current
** 
Yuanle Song's avatar
Yuanle Song committed
** 2018-01-15 add step and timer count.
* done
** 2018-01-14 make the basic work
- make blocks move in GUI when I click it.
  when click a non-movable block, do nothing.
- generate a game and reflect it in GUI using buttons.

Yuanle Song's avatar
Yuanle Song committed
  Board board = Board.GenerateBoard();
  // update GUI to show the board
  showBoard(board);

  Just set Content and visibility for each button.

- problems
  - how to write the click event for all buttons?
    decide which button is it.
    decide where is the button, where should it move.

    I decide to change button label and visibility.
    don't change button margin.

    create a model for the current board. then just relfect the board on the
    GUI. when user click a block, send a event to the model, then the model
    should decide which commands to send to the GUI components.

    class Board {
      initState: int[16];
      // block1 to block15 is just 1 to 15.
      // block0 is 0.

      currentState: int[16];
    }

    Button12 click.
    decide the block int id using reflection.

    blockId = getClickButtonId();
    String clickBlockLabel = eventTarget.Content;
    if board.blockCanMove(blockId) {
      String oldBlock0Name = board.getBlock0ButtonName();
      board.moveBlock(blockId);  // change currentState array.
      getButtonByName(board.getBlock0ButtonName()).Visibility = Hidden;
      getButtonByName(oldBlock0Name).Content = clickBlockLabel;
    }

    works on first try.

Yuanle Song's avatar
Yuanle Song committed
  - how to generate a valid game board?

    just move empty block randomly. just don't go backwards.

    easy: move 30 steps
    normal: move 60 steps
    hard: move 90 steps

    path = List<int>{};
    while true:
        directions = board.GetEmptyBlockDirections();
        directions.removeElement(getOppositeDirection(path[-1]));
        if directions is empty:
            Console.WriteLine("should not happen");
            break
        randomDirection = randomChoice(directions);
        board.MoveEmptyBlock(randomDirection);
        path.add(randomDirection);
        if path.length >= difficulty:
            break