final int DIR_NONE = 0; final int DIR_UP = 1; final int DIR_DOWN = 2; final int DIR_LEFT = 4; final int DIR_RIGHT = 8; int playerX = 0; int playerY = 0; void drawPlaying() { background(#000000); drawGrid(); } void drawPlayer(int x, int y) { fill(#0000FF); noStroke(); ellipseMode(CENTER); ellipse(xOffset + x * cellSize + cellSize / 2, yOffset + y * cellSize + cellSize / 2, 4 * cellSize / 5, 4 * cellSize / 5); } void drawObject(char object, int x, int y, boolean fittingHere) { if (object < 'a' || object > 'z') return; noStroke(); fill(fittingHere ? #00FF00 : #FFFF00); rectMode(CENTER); rect(xOffset + x * cellSize + cellSize / 2, yOffset + y * cellSize + cellSize / 2, 4 * cellSize / 5, 4 * cellSize / 5); if (hasMultipleTargetsOrBoxes) { textFont(headingFont); textAlign(CENTER, CENTER); fill(#000000); text(object, xOffset + x * cellSize + cellSize / 2, yOffset + y * cellSize + cellSize / 2); } } void drawTile(char tile, int x, int y) { if (tile != '#' && (tile < 'A' || tile > 'Z')) return; if (tile == '#') { fill(#FFFFFF); } else if (tile >= 'A' && tile <= 'Z') { fill(#FF0000); } noStroke(); rectMode(CENTER); rect(xOffset + x * cellSize + cellSize / 2, yOffset + y * cellSize + cellSize / 2, cellSize, cellSize); if (hasMultipleTargetsOrBoxes && tile >= 'A' && tile <= 'Z') { textFont(headingFont); textAlign(CENTER, CENTER); fill(#000000); text(tile, xOffset + x * cellSize + cellSize / 2, yOffset + y * cellSize + cellSize / 2); } } void drawGrid() { if (grid == null || grid.length <= 0) return; for (int y = 0; y < rows; y++) { String tileRow = grid[y]; String objectRow = objects[y]; for (int x = 0; x < columns; x++) { char tile = tileRow.charAt(x); char object = objectRow.charAt(x); drawTile(tile, x, y); drawObject(object, x, y, ("" + tile).equalsIgnoreCase("" + object)); if (playerX == x && playerY == y) { drawPlayer(x, y); } } } stroke(#222222); for (int x = 0; x <= columns; x++) { line(xOffset + x * cellSize, yOffset, xOffset + x * cellSize, height - yOffset); } for (int y = 0; y <= rows; y++) { line(xOffset, yOffset + y * cellSize, width - xOffset, yOffset + y * cellSize); } } void move(int direction) { char tile; char object; char nextTile; char nextObject; switch (direction) { case DIR_UP: moves.append("U"); if (playerY <= 0) return; tile = grid[playerY - 1].charAt(playerX); object = objects[playerY - 1].charAt(playerX); if (object >= 'a' && object <= 'z') { if (playerY <= 1) return; nextTile = grid[playerY - 2].charAt(playerX); nextObject = objects[playerY - 2].charAt(playerX); if (nextTile != '#' && nextObject == ' ') { objects[playerY - 1] = objects[playerY - 1].substring(0, playerX) + ' ' + objects[playerY - 1].substring(playerX + 1); objects[playerY - 2] = objects[playerY - 2].substring(0, playerX) + object + objects[playerY - 2].substring(playerX + 1); playerY--; } } else if (tile != '#') { playerY--; } break; case DIR_DOWN: moves.append("D"); if (playerY >= rows) return; tile = grid[playerY + 1].charAt(playerX); object = objects[playerY + 1].charAt(playerX); if (object >= 'a' && object <= 'z') { if (playerY >= rows - 1) return; nextTile = grid[playerY + 2].charAt(playerX); nextObject = objects[playerY + 2].charAt(playerX); if (nextTile != '#' && nextObject == ' ') { objects[playerY + 1] = objects[playerY + 1].substring(0, playerX) + ' ' + objects[playerY + 1].substring(playerX + 1); objects[playerY + 2] = objects[playerY + 2].substring(0, playerX) + object + objects[playerY + 2].substring(playerX + 1); playerY++; } } else if (tile != '#') { playerY++; } break; case DIR_LEFT: moves.append("L"); if (playerX <= 0) return; tile = grid[playerY].charAt(playerX - 1); object = objects[playerY].charAt(playerX - 1); if (object >= 'a' && object <= 'z') { if (playerX <= 1) return; nextTile = grid[playerY].charAt(playerX - 2); nextObject = objects[playerY].charAt(playerX - 2); if (nextTile != '#' && nextObject == ' ') { objects[playerY] = objects[playerY].substring(0, playerX - 1) + ' ' + objects[playerY].substring(playerX - 1 + 1); objects[playerY] = objects[playerY].substring(0, playerX - 2) + object + objects[playerY].substring(playerX - 2 + 1); playerX--; } } else if (tile != '#') { playerX--; } break; case DIR_RIGHT: moves.append("R"); if (playerX >= columns) return; tile = grid[playerY].charAt(playerX + 1); object = objects[playerY].charAt(playerX + 1); if (object >= 'a' && object <= 'z') { if (playerX >= columns - 1) return; nextTile = grid[playerY].charAt(playerX + 2); nextObject = objects[playerY].charAt(playerX + 2); if (nextTile != '#' && nextObject == ' ') { objects[playerY] = objects[playerY].substring(0, playerX + 1) + ' ' + objects[playerY].substring(playerX + 1 + 1); objects[playerY] = objects[playerY].substring(0, playerX + 2) + object + objects[playerY].substring(playerX + 2 + 1); playerX++; } } else if (tile != '#') { playerX++; } break; } boolean hasWrongObjects = false; for (int y = 0; y < rows; y++) { for (int x = 0; x < columns; x++) { object = objects[y].charAt(x); tile = grid[y].charAt(x); if (object >= 'a' && object <= 'z') { if (!("" + object).equalsIgnoreCase("" + tile)) { hasWrongObjects = true; } } } } if (!hasWrongObjects) { endGame(); } } void keyPressedPlaying() { if (key == 'r') { startGame(selectedLevel); } else if (key == 'l') { gameState = GAME_LEVEL_SELECT; } else if (keyCode == UP) { move(DIR_UP); } else if (keyCode == DOWN) { move(DIR_DOWN); } else if (keyCode == LEFT) { move(DIR_LEFT); } else if (keyCode == RIGHT) { move(DIR_RIGHT); } } void endGame() { if (selectedLevel >= unlockedLevel) { unlockedLevel = selectedLevel + 1; } gameState = GAME_OVER; }