Sokoban


Java Source:

/**********************************************************
   Sokoban.java - My First Java Game
**********************************************************/

import java.applet.*;
import java.awt.*;
import java.awt.image.*;
import java.net.*;
import java.util.*;

/******** TEST ********/

public class Sokoban extends Applet
{
  static int MAX_X=17, MAX_Y=13, MAX_LVL=200, MAX_IMG=8, MAX_HIST=100;
  static int X_0 = 5, Y_0 = 5;

  private Sokoban main;

  private Image mainImg;
  private Graphics g;
  private TextField txt1;
  private Image[] xImg = new Image[MAX_IMG+1];
  private int xPos, yPos, gLevel, mvPos;
  private byte[][] currCanvas = new byte[MAX_Y+1][MAX_X+1];
  private byte[] xMove = new byte[MAX_HIST];
  private byte firstTime;

  private Button btn1  = new Button("X");
  private Button btnN2 = new Button(">>");
  private Button btnN  = new Button(">");
  private Button btnP  = new Button("<");
  private Button btnP2 = new Button("<<");
  private Button btnU  = new Button("U");

  private static String mCode = " 01234567, :o#@XHB";
  private static int xCoord[][] =
    {{ 0, 0,20,20}, { 20, 0,20,20}, { 40, 0,20,20},
     { 0,20,20,20}, { 20,20,20,20}, { 40,20,20,20},
     { 0,40,20,20}, { 20,40,20,20}, { 40,40,20,20}};

  private static String biDat[] = {
    " , , ,      ###,      #o#,      #:####,    ###H:Ho#,    #o:H@###,    ####H#,       #o#,       ###",
    " , ,    #####,    #@::#,    #:HH# ###,    #:H:# #o#,    ###:###o#,     ##::::o#,     #:::#::#,     #:::####,     #####",
    " , , ,    #######,    #:::::###,   ##H###:::#,   #:@:H::H:#,   #:oo#:H:##,   ##oo#:::#,    ########",
    " , , ,     ####,    ##::#,    #@H:#,    ##H:##,    ##:H:#,    #oH::#,    #ooBo#,    ######",
    " , ,     #####,     #@:###,     #:H::#,    ###:#:##,    #o#:#::#,    #oH::#:#,    #o:::H:#,    ########",
    " ,    #######, ####:::::#, #:::o###:#, #:#:#::::##, #:#:H:H#o:#, #:#::B::#:#, #:o#H:H:#:#, ##::::#:#:###,  #:###o::::@#,  #:::::##:::#,  ############",
    " , , , ,      #######,     ##::#:@#,     #:::#::#,     #H:H:H:#,     #:H##::#,   ###:H:#:##,   #ooooo::#,   #########",
    " , , ,      ######,    ###::::#,   ##o:H##:##,   #ooH:H::@#,   #oo:H:H:##,   ######::#,        ####",
    " , ,   #########,   #::##:::#,   #:::H:::#,   #H:###:H#,   #:#ooo#:#,  ##:#ooo#:##,  #:H::H::H:#,  #:::::#:@:#,  ###########",
    " , , , ,      ######,      #::::#,    ###HHH:#,    #@:Hoo:#,    #:Hooo##,    ####::#,       ####",
    " , , , ,   ####  #####,  ##::#  #:::#,  #:H:####H::#,  #::Hoooo:H:#,  ##::::#:@:##,   ##########",
    " , , ,      #####,    ###::@#,    #::Ho:##,    #::oHo:#,    ###:BH:#,      #:::##,      #####",
    " , , ,      ####,      #oo#,     ##:o##,     #::Ho#,    ##:H::##,    #::#HH:#,    #::@:::#,    ########",
    " , , ,    ########,    #::#:::#,    #:HooH:#,    #@HoB:##,    #:HooH:#,    #::#:::#,    ########",
    " , , ,     ######,    ##::::##,    #:H:HH:#,    #oooooo#,    #:HH:H:#,    ###:@###,      ####, , , , ",
    " , ,    ######,    #::::###,    #:H::::#,  ###:H:##:#,  #ooo:H:::#,  #oooH#H:##,  ####:#:H:#,     #::@::#,     #######, , , ",
    " , , ,   ######,   #::::#,   #:HHH##,   #::#oo###,   ##::ooH:#,    #:@::::#,    ########, , , , ",
    " , , ,     ########,     #:::#o:#,    ##::Hooo#,    #::H:#Bo#,   ##:##H#:##,   #:::H::H:#,   #:::#::::#,   #######@:#,         ####, , ",
    " , , ,    #######,    #oooo:#,   ###oooH###,   #::H#H:H:#,   #:HH::#H:#,   #::::#:::#,   ####:@:###,      #####, , , ",
    " , , ,    #######,    #ooHoo#,    #oo#oo#,    #:HHH:#,    #::H::#,    #:HHH:#,    #::#@:#,    #######, , , ",
    " , , ,     ######,     #:ooo#,  ####oooo#,  #::###H:###,  #:H:H::HH:#,  #@:H:H::::#,  #:::###:::#,  ##### #####, , , ",
    " , ,    ########,    #::::::#,    #:#HH::#,    #:ooo#:#,    ##oooH:##,     #:##:H:#,     #H::H::#,     #::#::@#,     ########, , , ",
    " , , ,     #####,   ###:::####,   #:::H:H::#,   #:H:::H:@#,   ###HH#####,     #::oo#,     #oooo#,     ######, , , ",
    " , , ######   #####, #::::### #::o#, #::H:H:# #ooo#, #:#::H:###::o#, #::HHH:::H:@o#, ###::H::H#::o#,   #::H#H:#ooo#,   ##:::::#::o#,    ###########",
    " , ,       ######,   #####o:::#,   #::#oo##:#,   #::Hoo:::#,   #::#:o#:##,  ###:##H#::#,  #:H::::HH:#,  #:#H#::#::#,  #@::#######,  #####",
    " ,   #########,   #:::##::####,   #:H::::::::#,   ##H###:##::#,   #::##:B:#:##,   #:Hoooooo:#,  ##:###:o:#:#,  #:::::H###H#,  #:::#::::H@#,  #####H#:####,      #:::#,      #####",
    " ,       #########,       #:::::::#,       #:#:#:#:#,       #::H:H#:#, #######:::H:::#, #oo#::##:H:H#:#, #oo:::##:H:H::#, #oo#::##:######, #oo#:#:H:H:#, #oo:::::H::#, #::###:@:###, #### #####",
    "    ####,#####::#,#::H:H:# #######,#:::H::# #BoBoB#,##:H:H:###oBoBo#, #H:H::#::BoBoB#, #@H:H::::oBoB##, #H:H::#::BoBoB#,##:H:H:###oBoBo#,#:::H::# #BoBoB#,#::H:H:# #######,#####::#,    ####, ",
    " , , ,    ########,    #oooooo#,    #::H:#:##,    #:H:#:H:#,    ##H:H:H:#,     #::@:::#,     ########, , , , ",
    " , , ,    ##########,  ###:::o::::#,  #:::##H##::#,  #:@Ho:o:oH##,  ##:H##H##:#,   #::::o:::#,   ##########, , , , ",
    " , ,       ######,    ####o::@#,    #::HHH::#,    #o##o##o#,    #:::H:::#,    #::Ho#:##,    ####:::#,       #####, , , , ",
    " , , ,    ######,    #o:oo#,    #o:Ho#,   ###::H##,   #:H::H:#,   #:#H##:#,   #:::@::#,   ########, , , ",
    " ,     ######,   ###::::###,   #:::#H:::###,   #:::H:::HH:#,   #:HH:#H::::#,   ##:::H:::H:#, ######:#H#####, #oo@:#H::#, #o#oo::H##, #ooooH#:#, #oooo:::#, #########, ",
    "###############,#::::::#::::::#,#:H:#H:#:H##H:#,#:#::H:#::::::#,#:::##H#H##HH:#,#:#:#:ooo:#:::#,#:H::o:#:oH:#:#,#:H#@Hooo#:#::#,#::::o:#:o::H:#,#:##oH###Ho:#:#,#:#:Hooooo:##:#,#:::::::::::::#,###############, ",
    " , ,   #########,   #:::##::#,   #:#:H:H:#,   #::Bo#::#,   ##:#o@o##,   ##H###B###,   #::::::::#,   #:::##:#:#,   ######:::#,        #####, , ",
    "########,#::::::#,#:HH:::###,#::H:HHH:#####,##:##:ooo::::##, #:#@#ooo###H:#, #:#:Hooo:::::#,##:#:HoooH:#:##,#::#####:###:#,#::::::H:::H:#,###########::#,          ####, , ",
    " , , ,       #####,       #:@:#,       #HHH#,    ####:::#,    #:::o#H##,    #:HoHo:o#,    #::#o#o##,    ########, , , ",
    "  ############,  #ooo:#:::::#,  #oo::#:##::#,  #oo:::::#::#,  #oo::#:H##:#,  #ooo:#H:H::#,  ######::HH:#,   ##::H:HH::#,   #@:HHH::#:#,   ##:H:##:::#,    #::::::::#,    ##########, , ",
    " , ,   #########,   #:::::::#,   #::H:H:H#,   ##:#H##:#,    #:oo:oo##,    ##oo:oo:#,     #:##H#:##,     #H:H:H::#,     #::::::@#,     #########, , ",
    "#####      ####,#@::########::#,##:H:::::::H::#, #:#:#::####::#, #::H:::####H##, #H:##:#:H:H:#,##:H::H#:::::#,#:::#::::::#:#,#:::#####H####,#####:::#:::#,    #ooo::H:#,    #oooo#::#,    #oooo####,    ######",
    " , , ,        #####,    #####:::#,    #:oo:H#:#,    #:#oB:::#,   ##:Bo#H:##,   #:H::H::#,   #:::##:@#,   #########, , , ",
    " , ,  ##### #######,  #:::###::#::#,  #:H:::::H:@:#,  ##:#H##o##::#,   #::oooBo:H:#,   #:H#:#o#:#:#,   ##::::H::::#,    #::########,    ####, , , ",
    "         ###,    ######@##,    #oooo#H:##,    #oooo#:H:#,    #oooo:H::#,    #:ooo#:::#,######:#####:##,#:H:H:::H::#::#,#::::HH:::H:H:#,###:H:H:H::####,  ##:::H:H:#,   #::######,   ####, ",
    " ,     #####,   ###:::###,  ##::@H:H:#,  #::##:##:##,  #:Ho#oH:::#,  #:#o#B#:::#,  #:Hooo::###,  ###H#:###,    #:::#,    #####, , , ",
    " ,      ####,      #::######,      #::::#::#,      #:HH::::#,#######H#::#::#,#::#o:oo:###H##,#::#o#BoH:::::#,#::#o#oB#:#:::#,#:HHoooo#:#####,#:@H:#:##:#,#:HHH#::::#,#::::######,######",
    "####,#::###,#:H::###,#:H:H::###,#:H:H:H::###,#:H:H:H::::#,#:H:H::#:::##,#:H::##:HHH:#,#@:####:::::##,##:#:#oHHHHHo#, #:###ooooooo##, #:::oBBBBBBBo#, ####ooooooooo#,    ###########",
    " , ,  #######,  #:@#::#####,  #:HH::H:::#,  #::#o##H#:#,  ##H#ooo:::#,  ##:ooo##H##,  #::##o##::#,  #::H::H:::#,  #::#:::#::#,  ###########, , ",
    " , ,     #####,     #:@:#,     #:H:#,     #HoH#,   ###oHo##,  ##:oHoHo###,  #::HoHoH::#,  #::::o::::#,  ###########, , , ",
    " ,  #############,  #::H:H:HoBoo#,  #:H:H:H:Booo#,  #::H:H:HoBoo#,  #:H:H:H:Booo#,  #::H:H:HoBoo#,  #:H:H:H:Booo#,  #::H:H:HoBoo#,  #:H:H:H:Booo#,  #::H:H:HoBoo#,  #@H:H:H:Booo#,  #############, ",
    "             #,            ##,           ###,          #:::#,   ########:#:#,  #:H:H:H:H:::#, ##:#o#o#o#@H#,###ooooooo:::##, ##:#:#:#:#H##,  #:H:H:H:H:::#,   ########:#:#,          #:::#,           ###,            ##",
    " , , ,   #######,   #::oH:###,   #:oHoH::#,   #BHoHo@:#,   #:oHoH:##,   #::oH::#,   ########, , , , ",
    " , ,         #####,         #:::#,##########:B:###,#::::::::::o:::#,#:HHHHBBBBHooo@#,#::::::::::o:::#,##########:B:###,         #:::#,         #####, , , ",
    " , ,       ####,  ######::#####,  #@H::::H::H:#,  #H###:H:#:#:#,  #::#::#:H:::#,  #:H#::::#:###,  #::H:#H#:::#,  #ooooooooo:#,  ########:::#,         #####, , ",
    " ,    #####,    #:::#,    #H::#,  ###::H###,  #::H::H:#,###:#:###:#######,#:::#:###:##::oo#,#:H::H::::::@:oo#,#####:####:#::oo#,    #::::::######,    ########, , ",
    " , ,  ###########,  #::::#::::#,  #:H@HHHHH:#,  #:::::::::#,  #####:#####,     #o::#,     #o::#,     #ooo#,     #o::#,     #####, , ",
    " ,    #####,    #:@:#,    #:H:#,  ###:o:###,  #:::B:::#,  #:BBBBB:#,  #:::B:::#,  ###HBH###,    #:o:#,    #:B:#,    #:o:#,    #####, ",
    " , ##############, #o:::::::::::#, #oH:H:H:H:H::#, #o#########::#, #o#oB:H:ooHB##, #o#:H:H:BoH@#, #o#o::H:ooHH#, #o#########o#, #o::::::::::#, #o#H#H#H#H#H#, #o::::::::::#, #############, ",
    " , , ############, #oo::#:::::###, #oo::#:H::H::#, #oo::#H####::#, #oo::::@:##::#, #oo::#:#::H:##, ######:##H:H:#,   #:H::H:H:H:#,   #::::#:::::#,   ############, , ",
    "        ####, ########::####, #:::##ooooo::#, #::H::##ooo#:#, ##::H::###:#:#,  #:#:H::#::::#,  #::#:H::#:::#,  #:::#:H::#::#,  #::::#:H:#:##,  ####::#:H::#,     ##::#:H:#,      ##@#:::#,       #######, ",
    " , , ####      ####, #oo########oo#, #BoBoooooBoBo#, #:H:H:H:H:H:H#, #H:H:H@H:H:H:#, #:H:H:H:H:H:H#, #H:H:H:H:H:H:#, #oBoBoooooBoB#, #oo########oo#, ####      ####, , ",
    " , ,      #####,     ##:::####,     #:ooB:H:#,  ####:#o#:::#,  #::::oBo#@##,  #:#H##H##:#,  #:::::H:H:#,  ##::#:::###,   ########, , , ",
    " , , ,   ######,   #::::#,   #:H::####,   #:HBooB:#,   #:BooBH:#,   ####::H:#,      #:@::#,      ######, , , ",
    " , , ,      #####,   ####o::##,   #:HoHo::#,   #@H#:#H:#,   #:Ho:o::#,   ####H#H:#,     #o:o::#,     #######, , , ",
    " , , , ,  ############,  #::::ooo:H:#,  #:HHHBBB:H@#,  #::::ooo:H:#,  ############, , , , , ",
    " , , , ,   ##########,   ##:::::::#,   #:::#H#H:#,   #:HH::oHo#,   #:@###ooo#,   ##########, , , , ",
    " , ,   ####,   #::#####,  ##H:##::#,  #::H@H::#,  #:::##H:#,  ###o##:###,   #oooH:H:#,   ##oo::::#,    ########, , , ",
    "##### ####,#ooo# #::####,#ooo###::H::#,#oooo##:H::H###,##oooo##:::H::#,###ooo:##:H:H:#,#:##::::#::H::#,#::##:#:###:####,#:H:#:#H::H::::#,#::H:@:H::::H::#,#:::#:H:HH:H:###,#::######::###,#:##    ####,###",
    " , , ,   #######,   #o:o:o#,   #:HHH:#,   #oH@Ho#,   #:HHH:#,   #o:o:o#,   #######, , , , ",
    " ,        ####,  #######::#,  #:::::H::#,  #:::H##@H#,  ##H#ooo#:#,   #:Hooo::#,   #:#o:o#:##,   #:::#:#H:#,   #H::H::::#,   #::#######,   ####, , ",
    " , ,     #########,     #:::#:::#,     #:::::::#,  #####B###:##,  #:::ooo:::#,  #:#:#B###H##,  #:H::::H:::#,  #####@:#:::#,      ########, , , ",
    "#####,#ooo# #####,#ooo###:::#,#oooo:::HH#####,#oooo::#::#:::##,#oo#H####:#H#::#,##:H::#:::::HH:#,#::H#:@:H:HH#::#,#:H:H:H:#:::H:##,#:::#::H:##:::#,######:::######,     #####, , ",
    " ,###############,###o#::::::####,##oo#:H::H:#::#,#ooo#:##:H:#::#,#ooooo::#HH:::#,##ooooH::::#H:#,####:#######::#,#:::H::::::::##,#::H:#::H#:H:##,#:H###:H:#:HH:#,#:::@#::##::::#,###############, ",
    " ,       ########,       #::#:::#, #######:HHooo#, #::::::::#ooo#, #:######H#ooo#,##:#::::::#ooo#,#::#:#H:H:#####,#:#:H:H:H:#,#:@::H:#::#,#####H:HH:#,    #:::::#,    #######, ",
    " ,         #####,    ######:::#,  ###::::o:H:#,  #:H::#Ho#H##,  #::#::@o#::#,  ##:####o:::#,   #:H::#B####,   #:##:#o::#,   #:::::o#:#,   ###H:::::#,     #::#####,     ####, ",
    " , ,      ####,  #####::#####,  #::::H:::H:#,  #::H#H##:::#,  ###:#oBo:###,    #:ooo:@#,    ##:#H###,     #:::#,     #####, , , ",
    " , , ,      ########,   ####::::o:#,   #::H:H:Ho:#,   #::o####o##,   #:HoH:H:@#,   #::o::####,   #######, , , , ",
    " , ,    #####,    #:::#,  ###HoH#####,  #:::o:H:::#,  #:##H##:@:#,  #:::o:#####,  ###:o:#,    #:::#,    #####, , , ",
    " , ,    #####,    #:@:######,    #:#ooB:::#,    #:ooo#:::#,   ##H##:H:H:#,   #:::#H#####,   #:::H:::#,   #####:#:#,       #:::#,       #####, , ",
    "      ######,    ###::::##,    #:::##::#,  ###H##::#:#, ##:::::oo#:#, #::H#H#Bo#:#, #:HH@:#oB#:###, #::HH:#oo#:::#, ##::::#ooH:::#,  ###H##o:#:###,    #::###::#,    ##:::::##,     #######, ",
    " ,      #######,      #::#::#,      #::HH:#, ######:H#::#, #ooo###:#::##, #o::#::H:#::#, #o::::H:H:H:#, #o::#::H:#::#, #ooo###:#::##, ######:H:::#,      #@:#::#,      #######, ",
    "          ######,          #::::#,#####   ###:##:#,#oo:#####:H::#:#,#oo:::::H:::H#:#,#oo::##:##:::#:#,#oo:##:H:#H:H#:#,#oo:#:::::H::#:#,#oo:#::H:###H::#,#oo:#:H:H::H:###,###:##:#:H::::#,  #::::#@##:H:#,  #########::##,          ####",
    " , ,       #,     #####,   ###:@:###,   #::H:H::#,   #:BoBoB:#,  ##:oH:Ho:##, ###:BoBoB:###,####::H:H::####,   ######::#,    ##   ##, , ",
    " ##############, #:@:B:B:B:#::##, #H#::B:B::#:::#, #:#:B:B:B:::::#, #:#::B:B::##:##, #:#:B:B:B:##:#, #:#::B:B::##:#, #:#:B:B:B:##:#, #:#::B:B::##:#, #:#:B:o:B:##:##,##:##########::#,#::::::::::::::#,#:::#########::#,#####       ####",
    " , ,  #############,  #::::#::##::#,  #HHH:#:HH::H##,  #:H::#::oooo:#,  #::H::#Ho##o:#,  #::#:H#:oooo##, ##H:H::#Ho##o:#, #:H::H:@Hoooo:#, #:::###::######, ##### ####, , ",
    "      #########,      #:::::::#,      #::H#H#:#,  ######::#:H:#,  #:::#:H::H::#, ##:H:::::###:#, #:::#H####:::#, #::::H:###:###, #####oo:@#:##,    #oooH:HH:#,    #ooo#::::#,    #ooo######,    #####, ",
    "####     ####,#::#######oo###,#:H:H:H::#oooo#,#:H:::HH:#BBBo#,#:H:H:H::#ooBo#,#::H:H:H:#BoBo#,##:H:H:H:oBoBo##,#::H:H:H:oBoBo@#,#::H:H:H:#BoBo##,#:H:H:H::#ooBo#,#:H:::HH:#BBBo#,#:H:H:H::#oooo#,#::#######oo###,####     ####",
    "      #####,#######:::#,#:::##o:::#,#::H#oo::###,##::ooo#HH:#####, #:Ho#oH:::::::#, #:H###H##:#:H:#, #:::#:::::HH#:#, ##HH#:##H#H:::#, #ooo:H@:H:::###, #ooo#H#:::###, #ooo::#####, #######, ",
    " ,   ####  ######,   #::####::::#,  ##B:::B:BB::#,  #:H:B::::B#:#,  #:o:::###:::#,  ######:::#@##,  #:B:o:B::BB:#,  #:::#:::#:::#,  ##B:::B:#H#:#,   #::#####:::#,   ####   #####, , ",
    " , , ,    #########,    #:::#:::#,    #:HHHHH:#,   ##:H:H:H:#,   #:H::@:::#,   #:H:####:##,   #::#ooooo:#,   ##::ooooo:#,    ##########, , ",
    " ,   #######,   #:::::#,   #:H:H:##,   #####oo#####,######ooBo::H:#,#::H@Hoooo#HH:#,#:::H:#H###:::#,#####:::::::###,    ###::####,      #::#,      ####, , ",
    " , , ,   #####,   #:::######,   #:H:oo:H:#,   ##H:ooHH@#,    #::oo:H:#,    #########, , , , , ",
    " , , ,    #####,    #:::######,  ###H#o:::::#,  #:H:ooo#:H:#,  #@:Ho#BH:::#,  ####::::####,     ######, , , , ",
    " ,    #####,#####:::#,#:::H:@:#,#::H:#o#####,##H:##o##::####, #::ooooo:H#::#, #:H##o##::#H:#, #:::#o##:::::#, ###:H:#####:##,   #:#H:::::H:#,   #::::###:::#,   ###### #####, ",
    " , ,    #######,    #::B::#,    #:@oH:#,    #:Ho::#,    #BoBBB#,    #::B::#,    #:HBH:#,    #::o::#,    #######, , , ",
    "  #########,  #::::#::#,###:#H::H:####,#::H::##oo#::###,#:#::H:#ooH:H::#,#:HH::H#oo::#::#,##::#::ooo#H:::#, #H:@:#ooo#:H::#, #::::#oooH:::##, #:##H:###:::##, #:::H:::::###, #::########, ####, ",
    "    ##########, ####oooooo::#, #:::ooooo#::#, #::#oooooo:##, ##:####H##H#, #@H::H:H:::###, #:HH::::##:::#, #:#::HH##::#:#, #:::H::#:HH::#, #::H::H:::#H:#, ####:::#:H:H:#,    #:::#:::::#,    ###########, ",
    "      #########,      #:::::::#,      #H:HHH::#,      #:::#:H:#,      #:::H@H:#,    ###H:H:#:##,    #:::H#H#:#,#####:#::#:::#,#ooo::#:H#:###,#ooooo:::#:#,#ooooo#:H#:#,########:::#,       #####, ",
    " ,  ##### ######,  #:::###::::#, ##:H:H:#H:#H#, #::H:@:H::H:##, #:#::##:#oooo#, #::##:H:#o##o#, ##::H::::oooo#,  #:HH:#H#oooo#,  #:::#:::#H:##,  #####:H::::#,      ####::##,         ####, ",
    "####,#::#,#::##########,#::::##:::::#,#oo#::::HH#:#,#oo::##:::H:###,#oo#::##H#:H::#,#oo:::#:@H:H::#,#oo#::#:H:H:::#,#:o:::#:H:H:###,#::#::#:::###,#::#::::###,#########, ",
    " ,         #####,        #:::::#,       #::H##::#,      #::#:::H:#,#  #  #:#::#:#:#, # #  #:H:H::H:#,  #######:#H#::#,  #::H:H::::::#,  #@ooH:BBo###,   #oooooo#####,    ############, , ",
    " ,  ########,  #::::::#,  #::H:::#####,  ####:::H:::#,  #::##H#:H::#,  #::::@#:#:#####, ##:##:H:H:HH:::#, #:::#::#:::#:::#,##:::############,#oooo#,#oooo#,######, ",
    " ,  ############,  #::::o:#:::#,  #:::HB:#:H:#,  #:::#o:#:###,  #::##o#:::#, ##::##o#:H:##, #:::#:o#H#::#, #:@:#:o:::H:#, #::##:BHH#::#, #:::#:o::::##, #:::########, #####, ",
    " , ,#########,#:::#:::##########,#::H:H::#:::#oooo#,##:H:H:H:H::#oooo#, #@H:H:H:H:HoBoBo#, #:H:H:H:H:HoBoBo#,##:H:H:H:H::#oooo#,#::H:H::#:::#oooo#,#:::#:::##########,#########, , ",
    " ,   ##########,  ##::##::::#####, ##:::H::#:H::H:#, #:::H##::HH#:::#, #::::H:::#:::::#, #H####:#####:::#, #:#:ooooooo:@:##,##:::oBoBoBo:#:##,#:::######:###::#,#:#H:::::H::::H:#,#:::#############,#####, "
  };

  public void init()
  {
    String param;
    int i;

    if (g==null) g = getGraphics();

    URL url = getCodeBase();

    String str = "";
    int b = 0;

    MediaTracker tracker = new MediaTracker(this);
    mainImg = getImage(url, "images.gif");
    tracker.addImage(mainImg,0);

    for (i=0; i<=MAX_IMG; i++)
      {
        xImg[i] = extractImage(xCoord[i]);
        tracker.addImage(xImg[i], i+1);
      }

    try { tracker.waitForAll(); }
    catch (InterruptedException e) {}

    setLayout(new BorderLayout());

    txt1 = new TextField(25);
    txt1.setForeground(new Color(255,255,204));
    txt1.setBackground(new Color(102,51,51));
    txt1.setEditable(false);

    Panel p = new Panel();

    p.add(txt1);
    p.add(btnP2);
    p.add(btnP);
    p.add(btnN);
    p.add(btnN2);
    p.add(btn1);
    p.add(btnU);

    add("South", p);

    gLevel = 0;
    dat2Canvas(0);
    firstTime = 1;
  }

  public boolean dat2Canvas(int dlvl)
  {
    int i,x,y;
    byte z = 0;
    String param;

    try
     {
       gLevel += dlvl; if (gLevel<0) gLevel = 0;
       param = getParameter("data"+gLevel);
       if (param==null) param = biDat[gLevel];
     }
    catch (ArrayIndexOutOfBoundsException exc)
     {
       gLevel -= dlvl;
       return false;
     }

    for (y=0; y<=MAX_Y; y++)
      { for (x=0; x<=MAX_X; x++)
          { currCanvas[y][x] = 0; }
      }

    x = y = 0;
    for (i=0; i<param.length(); i++)
      {
        z = (byte)(mCode.indexOf(param.charAt(i)) % 10);
        if (z>MAX_IMG || x>MAX_X)
         {
           x = 0; y++;
           if (y>MAX_Y) break;
         }
        else
         {
           if (z<0) z = 0;
           currCanvas[y][x] = z;
           x++;
         }
      }
    for (i=0; i<MAX_HIST; i++) { xMove[i] = 0; }
    mvPos = 0;
    txt1.setText(" Restarting game level "+gLevel+".");
    if (firstTime==1) firstTime = 0;
    return true;
  }

  public boolean action(Event e, Object arg)
  {
    int h = -1;

    if      (e.target==btnP2) h = 16;
    else if (e.target==btnP)  h = 44;
    else if (e.target==btnN)  h = 46;
    else if (e.target==btnN2) h = 14;
    else if (e.target==btn1)  h = 18;
    else if (e.target==btnU)  h =  8;

    if (h>0) keyDown(e, h);

    return true;
  }

  public boolean keyDown(Event e, int c)
  {
    int dx = 0;
    int dy = 0;
    int ch = 0;
    int  h = 0;
    byte z0,z1,z2;
    String st0 = "";

    switch (c)
    {
      case e.UP:    dy = -1; h = 1; break;
      case e.DOWN:  dy =  1; h = 3; break;
      case e.LEFT:  dx = -1; h = 5; break;
      case e.RIGHT: dx =  1; h = 7; break;
      case 8:

        h = xMove[--mvPos];
        if (h<=0) return true;
        if (h>8) { ch = 5; h = h % 8; st0 = "(Pushed)"; }
        if (h<4) { dy = h-2; if (dy>0) st0 = "Down "+st0;  else st0 = "Up "+st0; }
           else  { dx = h-6; if (dx>0) st0 = "Right "+st0; else st0 = "Left "+st0; }

        if (ch>0)
         {
           int xTmp = xPos+dx;
           int yTmp = yPos+dy;
           z0 = (byte)(currCanvas[yTmp][xTmp] -= 5);
           g.drawImage(xImg[z0],X_0+20*xTmp,Y_0+20*yTmp,this);
         }

        z0 = (byte)(currCanvas[yPos][xPos] += ch-3);
        g.drawImage(xImg[z0],X_0+20*xPos,Y_0+20*yPos,this);

        xPos -= dx; yPos -= dy;
        z0 = (byte)(currCanvas[yPos][xPos] += 3);
        g.drawImage(xImg[z0],X_0+20*xPos,Y_0+20*yPos,this);


        txt1.setText(" History #"+mvPos+" : "+st0);
        return true;

      case 18:
        if (mvPos==0) { firstTime = (byte)(1-firstTime); paint(null); return true; }
        h = -100; break;
      case 44: h = -101; break;
      case 46: h =  -99; break;
      case 14: h =  -90; break;
      case 16: h = -110; break;

      default:
        txt1.setText(" Use ^P,<,>,^N,^R, or BS key.");
        break;
    }

    if (dx==0 && dy==0)
     {
       if (h<0) { if (dat2Canvas(h+100)) paint(null); }
       return true;
     }

    int xTmp = xPos+dx;
    int yTmp = yPos+dy;

    z0 = currCanvas[yPos][xPos];
    z1 = currCanvas[yTmp][xTmp];
    z2 = 0;

    if (z1==1 || z1==2)
     {
       z0 -= 3; z1 += 3;
       ch = 1;
     }
    else
    if ((z1==6 || z1==7) &&
        ((z2=currCanvas[yTmp+dy][xTmp+dx])==1 || z2==2))
     {
       z0 -= 3; z1 -= 2; z2 += 5;
       ch = 2;  h  += 8;
     }

    if (ch>0)
     {
       currCanvas[yPos][xPos] = z0;
       currCanvas[yTmp][xTmp] = z1;
       g.drawImage(xImg[z0],X_0+20*xPos,Y_0+20*yPos,this);
       g.drawImage(xImg[z1],X_0+20*xTmp,Y_0+20*yTmp,this);
       yPos = yTmp; xPos = xTmp;
       if (ch==2)
        {
          yTmp += dy; xTmp += dx;
          currCanvas[yTmp][xTmp] = z2;
          g.drawImage(xImg[z2],X_0+20*xTmp,Y_0+20*yTmp,this);
        }

       xMove[(mvPos++) % MAX_HIST] = (byte)h;

       z0 = 0;
       for (dy=0; dy<=MAX_Y; dy++)
         { for (dx=0; dx<=MAX_X; dx++)
             { if (currCanvas[dy][dx]==6) z0++; }
         }

       if (z0==0) { txt1.setText(" Completed after "+mvPos+" steps."); }
          else    { txt1.setText(" Step: "+mvPos+",  Load: "+z0); }
     }

    return true;
  }

  private Image extractImage(int[] xyCoord)
  {
    Image newImage;
    ImageFilter filter;
    ImageProducer producer;

    filter = new CropImageFilter(xyCoord[0],xyCoord[1],xyCoord[2],xyCoord[3]);
    producer = new FilteredImageSource(mainImg.getSource(), filter);
    newImage = createImage(producer);
    return newImage;
   }

  public void paint(Graphics g)
  {
    if (g==null) g = getGraphics();
    int y2 = Y_0;
    for (int y=0; y<=MAX_Y; y++)
      {
        int x2 = X_0;
        for (int x=0; x<=MAX_X; x++)
          {
            byte z = currCanvas[y][x];
            if (z==4 || z==5) { xPos = x; yPos = y; }
            if (firstTime==1 || z>MAX_IMG) z = 0;
            g.drawImage(xImg[z],x2,y2,this);
            x2 += 20;
          }
        y2 += 20;
      }
    if (firstTime==1)
     {
       int y = 30, x = 15;
       g.setColor(new Color(255,255,204));
       String str = "*SOKOBAN* (Java Applet version) 1999 by Riza PN";
       g.drawString(str,15,y);
       txt1.setText(str);
       y += 25; g.drawString("Objective of this game is to put every object into the marked place.",x,y);
       y += 15; g.drawString("We can not pull the object, and we can only push one of it every time.",x,y);
       y += 25; g.drawString("Use arrow keys to move the worker.",x,y);
       y += 15; g.drawString("Press [Ctrl]-R (or click X button) to restart the game.",x,y);
       y += 15; g.drawString("Press < to go to the previous level.",x,y);
       y += 15; g.drawString("Press > to go to the next level.",x,y);
       y += 15; g.drawString("Press [Ctrl]-P (or << button) to go to 10 levels before.",x,y);
       y += 15; g.drawString("Press [Ctrl]-N (or >> button) to go to 10 levels after.",x,y);
       y += 15; g.drawString("Press Backspace (or U button) to undo until 100 last movement.",x,y);
       y += 25; g.drawString("SOKOBAN is trademark by somebody else whose wrote this game for",x,y);
       y += 15; g.drawString("the first time. I just convert it into Java Applet and hope you enjoy it.",x,y);
       y += 30; g.drawString("Salam from Riza PN - Jakarta, Indonesia.",x,y);
     }
  }

}

Sample HTML Source:

###If it isn't too long, put it here, escaping the angle brackets.
Otherwise putit in the config page
### eg.
<applet code=Applet3.class name=Applet3 width=711 height=401 >
	<param name=label value="This string was passed from the HTML host.">
	<param name=background value="666666">
	<param name=foreground value="FFFFFF">
</applet>

Back to Sokoban

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.