// // // Blocker 4k // // M.E.@2010,2011 // // // Push blocks to same colored blocks to remove them // Goal is to reach (all) the blinking block(s) // // import java.applet.Applet; // duh import java.awt.image.*; // bufferedimage import java.awt.*; // graphics stuff import java.awt.AWTEvent; // enableEvents import java.awt.event.KeyEvent; // Keys import java.util.*; // StringTokenizer // // Macintosh does not like non thread-like applets // It is a shame ... public class b extends Applet implements Runnable{ boolean keys[] = new boolean[65536]; public void start() { new Thread(this).start(); } public void run(){ /* final BufferedImage screen = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB); final Graphics g = screen.getGraphics(); */ // GRID can be different for each level int GRID=16; // Calculated TILESIZE depending on the grid? int TILESIZE=24; final int EXTRA_X=160; final int EXTRA_Y=60; // // Game States // final int PLAY=100; final int DRAW=102; final int NEXTLEVEL=103; final int LEVELMENU=104; // Start action int action=NEXTLEVEL; boolean ok=true; //"ACCCCCCABBCCBBBCCBBDCCCCCC."; //String slevels="A4BA9BD."; //4CABC1BCBD4C // learn to finish String levels="A4CA0B0C1B0C0BD4C."; // learn to push levels+="BCCCCCCCCCCCACBBBBCBCCBCBBBBCBCCBCBBKBKBCCBCCCBBCBCCBKBKBBCBCCBCCCBBCBCCBCBBBBCBCCBCBBBBCDCCCCCCCCCCC."; // learn to push // you block your own finish path levels+="BCCCCCCCCCCCACBCBBBBCCBCBCBBBBCCKCBCCCCBCCBCBOBOBBCCKCBCCCCTCCBCBCBBBBCCBCBCBTBBCCBBBCBBTDCCCCCCCCCCC."; // prisonbars levels+="CCCCCCCCCCCCCCCCCABJJBKBKBJJBBCCBBJJBKBKBJJBBCCBBJJBKBKBJJBBCCBBJJBKBKBJJBBCCBBJJBKBKBJJBBCCBBJJBKBKBJJBBCCBBJJBKBKBJJBBCCBBJJBKBKBJJBBCCBBJJBKBKBJJBBCCBBJJBKBKBJJBBCCBBJJBKBKBJJBBCCBBJJBKBKBJJBBCCBBJJBKBKBJJBDCCCCCCCCCCCCCCCC."; // smiley levels+="BCCCCCCCCCCCABBBBBBBCCBBKKKBBBCCBKKKKKBBCCBKRKRKBBCCBKKKKKBBCCBBKKKBBBCCBBBBBBBRCCBBBBBBRDCCCCCCCCCCC."; // levels+="C9C3CA9BB0C9B0B0CBTBVUV0BU2B0C0B0VBTVBVT1B0CBVTB0VBT0V1B0C0BVTV0BVBT1B0CB0VF0BVFV2B0CBMBF1BF3B0C1BF1BF3B0C1UF1TF2TU0C1TV1TV2TW0C9M0M0C9JJD9C3C."; // Forest levels+="CCCCCCCCCCCCCCCCCABBBBBBBBBBBBCCBBBBBBBBBBBBBCCBTBVUVBBUBBBBCCBBVVBTVBVTBBBCCBVTBVVBTVVBBBCCBBVTVBBVBTBBBCCBVVFBBVFVBBBBCCBMBFBBBFBBBBBCCBBBFBBBFBBBBBCCTTTFTTTFTTTTUCCTTTVTTTVTTTTPCCMMMMMMMMMMMMMCCJJJJJJJJJJJJDCCCCCCCCCCCCCCCC."; // Dragon //levels+="D9C8CA9B4B0C9B5B0C8BGB0G0BGB0C5BF2GB2GB0C3B4G0I0QI0G0C2B0G0SQGIG0SQ1I0C2BGEDSQIGEDSQGHG0C2B0HE0QI0GE0QH0I0C1B3GI0H1GH0IG0C1BGBGBI7GI0C0B6GB0IGI0GI0C3BG0BGBGIH3G0CKJL5HGHG0IGIG0CHKLH0BG1BG0I1GIG0CB0H2B2G0I3G0C2BGBGB2GB3G0C3BGB9G0C9B5G9C8C."; // Face levels+="GCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCBBBBBBBBBBBBBBBBBBGGBBBBBBBBBBBBBCCBBBBBBBBBBBBBBGGFFMBGBBBBBBBBBBBBCCBBBBBBBBBBBBMGGFFBMMMGBBBBBBBBBBBCCBBBBBBBBBBBMBGMFJJBBBMGGBBBBBBBBBCCBBBBBBBGGGGFGBBNNJJJJBMFGBBBBBBBBCCBBBBBBBGBGFBJJNONJOJBJBMMMBBBBBBBCCBBBBBGGBFJBJNNOJJONOJJBBBFFFFFBBBCCBBBBGGBBNNNNNJOJJOBNBBBBBBBBBBFBBCCBBBGBGHNBOOOOJJBJJHFFFFFFFFGGBFBBCCBBBGGGHNFFFFFBWWBHHBBBFFFBBBBBBFBCCBBBBGHHBDSBUFWWWBHHLULDSSBGGGBBBBCCBBBGGBBBSSLLFWWWBHUULLSBFGGGGBBNBCCBBBGBBBBLLULFFWBWBMMMBBBGGGBBBBBBCCBBGBBJBJMMMJJFWWWHMMMMMMMBGBBNNBBCCBBGBBJJJJJJBFFFWWHMMMMMJBGGBBNBBBCCBBGBBBBJJJJJFFBWWHHHBBJMBBGGBBBBBCCBBGBBBBJJJJJFFNFBGGBHBMMJJBBNNBBBCCBBBBOOBJJJJJFFNFBGGBHHJJJJJNBBBBBCCJBGBBOBOJJJJFFNBBWBGMMJJJNNJBBBBBCCJJBBBBOOOOBJJFNBBBBGJJJJNNNJBBBBBCCBJJJBBBOOOOFFFNFBWMGGGNNNNNNBBBBBCCBBJJBGGOOOOFBNNFBBMGMJJNNNNJBBBBBCCBBBBJBBGOOOMMBMMWMMMMJNNNJBBBBBBBCCBBBBJJJGGOOMMMMMMJMJJNNNMMBBBBBBBCCBBBBBBJJJJJJJJNNJJJJNNNNNBBBBBBBBCCBBBBBBJBBGGGGGNNNNNNNBBBNBBBBBBBBCCBBBBBBBJJJJJJJBNNNNNGGBBBBBBBBBBBCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC."; // maze levels+="GCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCABBEEBCCBBBBBBBBBBBBCBCBBBBBBBBBBCCBBBEBECCCBBBBBBBBBBBCBBCBBBBBBBBBCCBBBEBCCEBCBBBBBBBBBCBBBCCBCCBBBBBCCBBBEBCCBECBBBBBBBBBCBBBBBBBCBBBBBCCBBBEBBBBBCEBBBBBBBCCBBBBBBBCBBBBBCCBBBBBCBBBBCCBBBBBBCBBBBBCCBCBBBBBCCBBBEBCBBBBBCEBEBBBCBBBBBCCBCBBBBBCCBBBEBCBBBBBCBBEBBCBBBBBBBBCBBBBBBCCBBBECCBBBBBBCBEBBCBBBBBBCBBBBBBBBCCBBBECBBBBBBBCBEBBCBBBBBBCBBBBBBBBCCBBBECBBBBBBBCBEBBCBBBBBBCBBBBBBBBCCBBBECBBBBBBBCBEBBCBBBBBBCBBBBBBBBCCBBBECBNBBBBBCBEBBCBBBBBBCBBBBBBBBCCBBBECBNVBBBBBCEBBCBBBBBCCBBBBBBBBCCBBBECBNCBBBBBCBBBCBBBBBCCBBBBBBBBCCBBBECBNCBBBBBBEBBBBBBBCBBBBBBBBBBCCBBBECNNBBBBBBCECMMBBBBCBBBBBBCBBBCCBBBEBNBCBBBBBBBBMBBBBBCBBBBBCCBBBCCBBBCCNBCBBBBBCCCCCCBBBCBBBBCCBBBBCCBBBCCMNCBBBBMCEBBCBCCBCBBCCCBBBBBCCBBBCCMMCBBBMBCCBBCBBCBCBCBBBBBBBBCCBBBCCMBCNMMBBBCBBCBBCCCCCBBBBBBBBCCBBBBBMBCBNNBBBCEBBCBBBCBBBBBBBBBBCCBBBBBMBCBBBBBBCBEBBBBCBBBBBBBBBBBCCBBBBBMBCCBNBBCCBBECCBCBBBEBBBBBBBCCBBBBBBMBCBBBBBBBBBEECCBBBEBBBBBBBCCBBBBBBMBCBCMBCBBBBBECCBBBEBBBBBBBCCBBBBBBBMMBCMBCBBBBBECBEEEEBBBBBBBCCBBBBBBBBMBMMBCBBBBBBCBBBBBBBBBBBBCCBBBBBBBBBBCMBCBBBBBBCBBBBBBBBBBBBCCBBBBBBBBBBCMDCBBBBBBCBBBBBBBBBBBBCCBBBBBBBBBBDDCBBBBBBBCBBBBBBBBBBBBCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC."; levels+=""; int maxlevels=8; // A B C D E F G H I J K L M N O P Q R S T U V W X Y Z { // final int[] palette={-1,0,-7825556,-4181692,-131076,-12772074,-9107920,-6290656,-4181692,-2585538,-601851,-663950,-9484483,-5937295,-2195053,-11710362,-16751732,-14592873,-12409114,-11366365,-5845709,-15310047,-11642586,0,0,0}; final int[] palette={-1,0,-7825556,-4181692,-131076,-12772074,-9107920,-6290656,-4181692,-2585538,-601851,-663950,-9484483,-5937295,-2195053,-11710362,-16751732,-14592873,-12409114,-11366365,-5845709,-15310047,-11642586,0,0,0}; final int[] highscore={4,24,28,24,26,52,100,100,100,100,100}; // // Data // //int map[]=new int[(GRID*GRID)+4]; //int undo[][]=new int[1000][GRID*GRID]; int map[]=new int[2500]; int undo[][]=new int[1000][2500]; int undoplayer[]=new int[1000]; int undocounter=0; // Steps taken int level=0; int steps[]=new int[maxlevels+1]; int minsteps[]=new int[maxlevels+1]; int player=0; // player position int oldplayer=0; // previous player position final BufferedImage screen = new BufferedImage(800, 600, BufferedImage.TYPE_INT_RGB); final Graphics g = screen.getGraphics(); // omitting this saves a lot of bytes .. but it isn't that nice // //g.setFont(new Font("Helvetica",Font.PLAIN,18)); // But if we remove helvetica it saves another 4 bytes g.setFont(new Font("",Font.PLAIN,12)); // Game loop. requestFocus(); enableEvents(AWTEvent.KEY_EVENT_MASK); while (true) { long t_=System.currentTimeMillis(); // replace all occurrences p with map int p=0; int p2=0; int ip=0; // Make background where player stands //map[player]=1; if(action == DRAW ){ if(keys[KeyEvent.VK_LEFT] && player > 2) { ip=-1; //steps[level]++; p=map[player+ip]; p2=map[player-2]; // background move or remove same blocks if(p==1 || p==3){ player--; }else{ // equal and not boarder if(p==p2 && p!=2){ map[player-1]=1; map[player-2]=1; player--; } else{ // if not unmovable if(p2==1 && p!=2){ map[player-2]=p; player--; } } } } if(keys[KeyEvent.VK_RIGHT] && player < (GRID*GRID)-1) { ip=+1; //steps[level]++; p=map[player+ip]; p2=map[player+2]; if(p==1 || p==3){ player++; }else{ // if equal and not border if(p==p2 && p!=2){ map[player+1]=1; map[player+2]=1; player++; }else{ if(p2==1 && p!=2){ map[player+2]=p; player++; } } } } if(keys[KeyEvent.VK_UP] && player > GRID) { ip=-GRID; //steps[level]++; p=map[player+ip]; if(player > GRID*2) p2=map[player-GRID-GRID]; if(p==1 || p==3){ player-=GRID; }else{ // if equal and not border if(p==p2 && p!=2){ map[player-GRID]=1; map[player-GRID-GRID]=1; player-=GRID; }else{ if(p2==1 && p!=2){ map[player-GRID-GRID]=p; player-=GRID; } } } } if(keys[KeyEvent.VK_DOWN] && player < (GRID*GRID)-GRID) { ip=+GRID; //steps[level]++; p=map[player+ip]; if(player < (GRID*GRID)-GRID*2) p2=map[player+GRID+GRID]; if(p==1 || p==3){player+=GRID; }else{ // equal and not border if(p==p2 && p!=2){ map[player+GRID]=1; map[player+GRID+GRID]=1; player+=GRID; }else{ if(p2==1 && p!=2){ map[player+GRID+GRID]=p; player+=GRID; } } } } // finish if(p==3 && action == DRAW){ // Is needed? map[player]=1; // Doe we have any finish-blocks left? ok=false; for(int i=0; i < GRID*GRID && !ok; i++)if(map[i]==3)ok=true; // check if there are any other finish blocks if(!ok){ //System.out.println("steps: "+steps[level]+" = minsteps: "+minsteps[level]); // calculate highscore if(steps[level] maxlevels-1){level=1;} //System.out.println("LEVEL : "+level); steps[level]=0; //System.out.println("Loading level: "+level); // (re-)build level string //System.out.println("Leves:"+levels); int a=0; ok=false; boolean begin=true; int levelcounter=0; // grid counter ; the level data counter int gc=0; while(a < levels.length() && !ok){ char c=levels.charAt(a++); // System.out.println("item: "+c+" (int:)"+((int)c)); // begin of level .. what is the grid? // gc=gridcounter if(begin){ GRID=(5*(c-64)); //map=new int[(GRID*GRID)+4]; //undo=new int[10000][GRID*GRID]; for(int mi=0; mi < GRID*GRID+1; mi++)map[mi]=1; begin=false; gc=0; }else{ // Nr? if(c < 65){ // . = end of level if(c==46){ begin=true; if(levelcounter++==level-1){ //System.out.println("Ready loading level: "+level); ok=true; } }else{ int nextc=levels.charAt(a++); // nr; for(int i=0; i<(c-48)+2; i++){ map[gc++]=nextc-65; } } }else{ // put the character on the map // map[gc++]=c-65; if( (map[gc++]=c-65)==0){player=gc-1;oldplayer=player;} } } // if begin or in the data-area? } a=0; ok=false; levelcounter=0; for(int i=0; i < GRID*GRID+1; i++){ undo[0][i]=map[i]; } undoplayer[0]=player; action=DRAW; break; // // // End of NEXTLEVEL } // Switch action // we do this for both editor and play-states // boarder for(int i=0; i < (GRID*GRID)+1; i++){ if(i < GRID)map[i]=2; if(i % GRID == 0)map[i]=2; if(i % GRID == GRID-1)map[i]=2; if(i > (GRID*GRID)-GRID)map[i]=2; } // Calculate game area TILESIZE=320/GRID; // Back Space : VK_BACK_SPACE : 8 : undo if(keys[8]){ if(undocounter>1){ // Penalty for using steps[level]+=5; undocounter--; for(int i=0; i < GRID*GRID; i++){ map[i]=undo[undocounter-1][i]; } player=undoplayer[undocounter-1]; map[player]=0; oldplayer=player; } } // // DRAW // // Do we need to draw the board? if(action == DRAW ){ g.setColor(new Color(palette[0])); g.setFont(new Font("",Font.PLAIN,18)); g.drawString("STEPS "+steps[level], 270, 50); g.setFont(new Font("",Font.PLAIN,10)); g.drawString("LEVEL",2,30); g.drawString("YOURS",45,30); g.drawString("HIGH-SCORE", 100,30); g.setFont(new Font("",Font.PLAIN,14)); for(int i=1; i < maxlevels+1; i++){ //g.drawString("Level "+i+" = "+(minsteps[i]>0?minsteps[i]+1:0)+"["+highscore[i-1]+"]",5,EXTRA_Y+50+((i-1)*16)); g.drawString(""+i, 15,55+((i-1)*16)); g.drawString(""+(minsteps[i]>0?minsteps[i]+1:0),55,55+((i-1)*16)); g.drawString(""+highscore[i-1],100,55+((i-1)*16)); //System.out.println("minsteps : ["+i+"]="+minsteps[i]); } // Draw each grid item for(int i=0; i < GRID*GRID; i++){ // // TODO : REMOVE ? is it possible to remove this if? // if(action == DRAW ){ int xx=EXTRA_X+((i%GRID)*TILESIZE); int yy=EXTRA_Y+((i>0?i/GRID:0)*TILESIZE); //System.out.println("Map["+i+"]="+map[i]); g.setColor(new Color(palette[map[i]])); // blink factor if( (i==player?3:t_%500)<70 && (map[i]==3 || i==player)) g.setColor(new Color(palette[i==player?0:1])); g.fillRect(xx,yy+TILESIZE,TILESIZE, TILESIZE); } // action == draw? } // for all grid items } // action == DRAW // // ESCape // if(keys[27]){ action=LEVELMENU; } /* g.setColor(new Color(0,0,0)); g.fillRect(0,0,800,600); g.setColor(new Color(255,255,255)); g.drawString(""+keys[27], 200,200); */ // // Reset keys for(int i=0; i < 65536; i++)keys[i]=false; try{ Thread.sleep(40); }catch(Exception e){} // draw buffer to screen (avoid flicker) getGraphics().drawImage(screen,0,0,this); } // while true } // test using handleEvent protected void processKeyEvent(KeyEvent e) { if (e.getID() == java.awt.Event.KEY_RELEASE) { keys[e.getKeyCode()] = true; } } }