// fivejive by alienbill.com @cid "ABPb"; @name "5jive"; @dbname "ABPb_fivejive"; @category "Games"; @ver "1.0"; @licon1 "big5.bmp"; @sicon1 "small5.bmp"; int boardsize; int board[81]; int path[81]; int squaresize; int boardtop; int boardleft; int maxdepth; string bmp[11]; int nextplace[3]; string bmpwaitblank; string bmpwait; string bmpinfo; string bmpdif; string bmpPointblank; string bmpPoint; string bmpEye; string bmpNewButton; int score; int newscore; int shapecount; int difLevel; drawLogo (){ bitmap(120,156,"280a008a800068ecc2864eaacaaa88ae6aeacaa64a"); } drawSquares(){ int i; rect(0,boardleft,boardtop,160,160,00); for(i = 0; i <= boardsize; i++){ line(1, boardleft+(i*squaresize), boardtop, boardleft+(i*squaresize), boardtop+(boardsize*squaresize)); line(1, boardleft, boardtop+(i*squaresize), boardleft+(boardsize*squaresize), boardtop+(i*squaresize)); } } showUnwait(){ bitmap(137,1,bmpwaitblank); } showWait(){ bitmap(137,1,bmpwait); } getSquareContents(int x, int y){ return board[x+(y*boardsize)]; } setSquareContents(int x, int y,int what){ board[x+(y*boardsize)] = what; } printIt(int spot,int thing){ int x,y; x=spot%boardsize; y=spot/boardsize; //text(3+boardleft+ //(x*squaresize), //3+boardtop+ //(y*squaresize),thing); bitmap(3+boardleft+ (x*squaresize), 3+boardtop+ (y*squaresize),bmp[thing]); } printSquareContents(int x, int y){ int val; val=getSquareContents(x,y); printIt(x+(y*boardsize),val); } findPath(int x, int y,int tx, int ty,int depth){ setSquareContents(x,y,-1); path[depth]=x+(y*boardsize); //line(1, boardleft+(x * squaresize) //+ 3, boardtop+(y*squaresize) + //3, boardleft+(x * squaresize) + 3, //boardtop+(y*squaresize) + 8); if(x==tx && y == ty){ maxdepth=depth; return 1; } //- if(y > 0) {if( getSquareContents(x, y-1) == 0) {if(findPath(x, y-1, tx,ty, depth+1) ) {return 1;}}} //- if(y < (boardsize-1)) {if(getSquareContents(x, y+1) == 0) {if(findPath(x, y+1, tx,ty, depth+1 ) ){return 1;}}} //- if(x > 0) {if( getSquareContents( x-1, y) == 0) {if(findPath(x-1, y, tx,ty, depth+1 ) ){return 1;}}} //- if(x < (boardsize-1)) { if( getSquareContents(x+1, y) == 0) {if(findPath(x+1, y, tx, ty, depth+1) ){return 1;}}} return 0; } countNeighbors(int x, int y, int dx, int dy, int val){ int g; x=x+dx; y=y+dy; if(x<0 || y < 0 || x >= boardsize || y >= boardsize) { return 0; } g=getSquareContents(x,y); if(g != val && g != 10){ return 0; } return 1+countNeighbors(x, y, dx, dy, val); } killNeighbors(int x, int y, int dx, int dy, int val){ int g; x=x+dx; y=y+dy; if(x<0 || y < 0 || x >= boardsize || y >= boardsize) { return 0; } g=getSquareContents(x,y); if(g != val && g != 10){ return 0; } setSquareContents(x,y,0); printSquareContents(x, y); newscore++; return killNeighbors(x, y, dx, dy, val); } checkRemove(int x, int y,int orig){ int val;int any; int tv,th,tdu,tdd; /*line(1,boardleft+(x*squaresize),boardtop+(y*squaresize),boardleft+((x+1)*squaresize),boardtop+((y+1)*squaresize));*/ any=0; val=getSquareContents(x,y); if(val==0) return 0; if(val==10 && orig != 0){ any=any+checkRemove(x+1,y+0,0); any=any+checkRemove(x+1,y+1,0); any=any+checkRemove(x+0,y+1,0); any=any+checkRemove(x-1,y+1,0); any=any+checkRemove(x-1,y+0,0); any=any+checkRemove(x-1,y-1,0); any=any+checkRemove(x+0,y-1,0); any=any+checkRemove(x+1,y-1,0); if(any>=1) any=1; } else{//not placing wildcard tv=1 + countNeighbors(x,y,0,-1,val) + countNeighbors(x,y,0,1,val); th=1 + countNeighbors(x,y,-1,0,val) + countNeighbors(x,y,1,0,val); tdu=1 + countNeighbors(x,y,-1,1,val) + countNeighbors(x,y,1,-1,val); tdd=1 + countNeighbors(x,y,-1,-1,val) + countNeighbors(x,y,1,1,val); if(tv >= 5) { killNeighbors(x,y,0,-1,val); killNeighbors(x,y,0,1,val); any=1; } if(th >= 5) { killNeighbors(x,y,-1,0,val); killNeighbors(x,y,1,0,val); any=1; } if(tdu >= 5) { killNeighbors(x,y,-1,1,val); killNeighbors(x,y,1,-1,val); any=1; } if(tdd >= 5) { killNeighbors(x,y,-1,-1,val); killNeighbors(x,y,1,1,val); any=1; } } if(any != 0){ setSquareContents(x, y, 0); printSquareContents(x, y); newscore=newscore+1; } return any; } drawNext(){ int i; for(i=0;i<3;i++){ bitmap(6,32+(i*12), bmp[nextplace[i]]); } } pickNext(){ int r,i; for(i=0;i<3;i++){ r=random(shapecount)+1; nextplace[i]=r; } drawNext(); } initBoard(){ int i,r; for(i=0; i<5;i++) { r=random (boardsize*boardsize); board[r] = random(5)+1; printSquareContents (r%boardsize, r/boardsize); } } printScore(){ string s; s=score; while(strlen(s) < 6){ s="0"+s; } text(65,0,"Score:"+s+" "); } /$ fivejive.aux2 hitNewGame(){ int i; for(i=0;i<81;i++){ board[i]=0; } drawSquares(); initBoard(); drawLogo(); score=0; printScore(); pickNext(); } changeDif(int x){ int i,olddif; olddif=difLevel; bitmap(0,121+(6*difLevel),bmpPointblank); if(x <= 126) { difLevel = 0;} if(x > 127 && x <= 133) { difLevel = 1;} if(x > 133) { difLevel = 2;} bitmap(0,121+(6*difLevel),bmpPoint); shapecount=5+difLevel; if(olddif > difLevel) {for(i=0;i<81;i++){ if(board[i]>difLevel+5){ board[i] = random(5) + 1; printIt(i,board[i]); }//endif outofrange }//endfor }//end if dif level easy pickNext(); } placeNext(){ int i,blankptr,r; int blank[81]; int used[3]; int usedtotal; int usedptr; for(i=0; i < boardsize*boardsize; i++) { if(board[i] <=0){ blank[blankptr]=i; blankptr++; } }; usedtotal=3; if(blankptr <= 3){ alert("Game Over, Man"); usedtotal=blankptr; } for(i=0;i < usedtotal; i++){ r=random(blankptr); //make sure not used while(blank[r] == -1) { r++; if(r >= blankptr){ r = 0; } } board[blank[r]] = nextplace[i]; printSquareContents(blank[r]%boardsize, blank[r]/boardsize); used[usedptr]=blank[r]; usedptr++; blank[r] = -1; } for(i=0;iboardleft && x< boardleft + (boardsize * squaresize) && y>boardtop && y< boardtop + (boardsize * squaresize)); } clearPath(){ int i; for(i=0;i<(boardsize * boardsize);i++){ if(board[i]==-1){ board[i]=0; } } } getSquare(int pos, int offset){ return (pos-offset)/squaresize; } writeGameState(){ int i; showWait(); dbcreate("fivejivedata"); dbwrite(score); for(i = 0; i <= 81; i++){ dbwrite(board[i]); } dbwrite(nextplace[0]); dbwrite(nextplace[1]); dbwrite(nextplace[2]); dbwrite(difLevel); dbclose(); showUnwait(); } readGameState(){ int i; if(dbopen("fivejivedata") != 0){ score = dbread('i'); for(i = 0; i <= 81; i++){ board[i] = dbread('i'); } nextplace[0]=dbread('i'); nextplace[1]=dbread('i'); nextplace[2]=dbread('i'); difLevel=dbread('i'); dbclose(); drawNext(); shapecount=5+difLevel; } else { initBoard(); pickNext(); } } paintSelect(int xs,int ys){ rect(3, 1+boardleft + (xs * squaresize), 1+boardtop + (ys * squaresize), boardleft + ((xs+1) * squaresize), boardtop + ((ys+1) * squaresize), 0); } main(){ int e,xs,ys,i; int selx,sely; int mode; int val; int mult; int piecePicked; initVars(); makeBmps(); graph_on(); title("5Jive"); atexit(writeGameState); bitmap(148,0,bmpinfo); readGameState(); printScore(); drawSquares(); printBoardContents(); text(0,20,"next:"); bitmap(4,120,bmpdif); //bitmap(0,121,bmpPoint); bitmap(0,121+(6*difLevel),bmpPoint); bitmap(4,140,bmpNewButton); drawLogo (); //printBoardContents(); while(e=event(1)){ if(e==2){ text(46,0," "); if(penx()= 120 && peny() <= 139){ changeDif(peny()); } if(penx()= 140 && peny() <= 148){ if(confirm("Reset board for a new game?")){ hitNewGame(); } } if(penx()>=148 && peny()0){ paintSelect(xs,ys); mode=1; selx=xs; sely=ys; val=getSquareContents(selx,sely); }//has contents else{//blank picked beep(1); } }//end mode is 0 else {//mode is 1 if(selx==xs && sely==ys) { mode=0; paintSelect(xs,ys); }// end unselecting else { if(getSquareContents(xs,ys) ==0){ showWait(); piecePicked=board[selx+(sely*boardsize)]; if(findPath(selx,sely,xs,ys,0)){//found path mode=0; paintSelect(selx,sely); for(i=0; i <= maxdepth;i++){ printIt( path[i],val); sleep(500/maxdepth); printIt( path[i]," "); } //end for board[selx+(sely*boardsize)]=0; board[xs+(ys*boardsize)]=val; printSquareContents(xs,ys); newscore=0; if(!checkRemove(xs,ys,1)){ placeNext(); pickNext(); } else{ if(newscore > 5){ mult=(newscore-4); newscore=newscore*mult; text(46,0,"x"+mult); } score=score+newscore; printScore(); } }//end foundpath else {//no path beep(1); //we may have accidently //overwritten the starting char //in looking for a path, //so write it back board[selx+(sely*boardsize)]=piecePicked; } clearPath(); showUnwait(); }//end target blank else{//else change selection paintSelect(selx,sely); paintSelect(xs,ys); mode=1; selx=xs; sely=ys; val=getSquareContents(selx,sely); }//end else (targetted full) }//end else not unselect }//end else (mode is not zero) }//is in board /* //eye click if(penx()= 100 && peny() <= 109){ rect(3,6,100,15,109,0); rect(3,6,100,15,109,0); }*/ }//event is pdown if(e==1) { if(key()==118){ bitmap(6,100,bmpEye); bitmap(0,0,bmpEye); e=0; while(e!=2) e=event(1); xs=getSquare(penx(), boardleft); ys=getSquare(peny(), boardtop); alert("Mode is " +mode + "\n Contents of " + xs + "," + ys +":"+getSquareContents(xs,ys)); bitmap(6,100,bmp[0]); } } }//while event }//end main