Introduction

Using applet, create a working version of ‘fifteen puzzle’. The puzzle contains a grid with four rows and four columns. The cells of the grid are filled with numbers from 1 to 15 leaving one cell empty. On clicking the mouse on a cell adjacent to the empty cell, the number in the cell moves to the empty cell. The puzzle is completed when the user arranges the number in the cells in ascending order.

Source Code

import java.awt.*;
import java.applet.*;
import java.awt.event.*;
public class Puzzle extends Applet implements MouseListener {
    final int ncols = 4, nrows = 4;
    int nummax = ncols * nrows;
    int xstart = 10, ystart = 10;
    int gwidth = 55, gheight = 40;
    int[][] grd = new int[ncols][nrows];
    public void init() {
        addMouseListener(this);
    }
    public void start() {
        int k = 1;
        for (int i = 0; i < ncols; ++i)
            for (int j = 0; j < nrows; ++j) grd[i][j] = k++;
    }
    void swap(int x1, int y1, int x2, int y2) {
        if (x1 >= 0 && x1 < ncols && y1 >= 0 && y1 < nrows)
            if (x2 >= 0 && x2 < ncols && y2 >= 0 && y2 < nrows)
                if (grd[x2][y2] == nummax) {
                    grd[x2][y2] = grd[x1][y1];
                    grd[x1][y1] = nummax;
                }
    }
    public void mousePressed(MouseEvent e) {
        int x = e.getX();
        x -= xstart;
        int y = e.getY();
        y -= ystart;
        if (x > 0 && x < gwidth * (ncols) && y > 0 && y < gheight * (nrows)) {
            int col = x / gwidth;
            int row = y / gheight;
            swap(col, row, col + 1, row);
            swap(col, row, col - 1, row);
            swap(col, row, col, row + 1);
            swap(col, row, col, row - 1);
            repaint();
        }
    }
    public void mouseClicked(MouseEvent e) {}
    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    public void paint(Graphics g) {
        for (int i = 0; i < ncols + 1; ++i) g.drawLine(xstart + i * gwidth, ystart, xstart + i * gwidth, ystart + nrows * gheight);
        for (int j = 0; j < nrows + 1; ++j) g.drawLine(xstart, ystart + j * gheight, xstart + ncols * gwidth, ystart + j * gheight);
        g.setFont(new Font("TimesRoman", Font.BOLD, 28));
        g.setColor(Color.black);
        for (int j = 0; j < nrows; ++j)
            for (int i = 0; i < ncols; ++i) {
                if (grd[i][j] != nummax) g.drawString("" + grd[i][j], xstart + i * gwidth + 15, ystart + j * gheight + 28);
            }
    }
}

Save the file as Puzzle.java in a folder like E:\java\

and compile it...

Open up the other Editor, and write the HTML code as

<applet code="Puzzle.class" width=250  height=200>
</applet>

Save the HTML file as Puzzle.html in the same folder as E:\java

Code Functionality

The meaning of all the instance variables used in the Puzzle class are given below:

Run the Source code

Compile the Puzzle.java in a folder as E:\java>

After compilation of code, type the following command as

E:\Java>appletviewer Puzzle.html

Output

Summary

An applet is like a small executable code that needs a full application to contain it or execute it. Applets are event driven, an applet represents a set of interrupt service routines. It will wait for an event to happen. Once the event takes place, the AWT notifies the applet that an event has taken place by calling the event handler, which has been provided by the applet. Once the applet has taken appropriate action, the control returns to the AWT. An applet should never have control for a long period of time and the control should return to AWT runtime system as soon as possible.