/********************************************************************* * snake.bz: is a script made only for fun. It will make a 'snake' * * which will roam around your screen and eat all it can find. * * * * Can be implemented as a screen saver. I'll probably use it as one * * * * This file uses a file called random.bz which is crucial. Get it * * before trying to compile this script!! * * * * snake.bz is set up to use (my)menus/bull0.gr for background * * * * This source file is hereby released to the Public Domain by the * * author: Stig Johansen. * * I can be reached at these addresses: * * BBBSnet: Stig Johansen@47:1000/101 * * FidoNet: Stig Johansen@2:210/20 * * SigNet: Stig Johansen@27:1347/106 * * SkyNet: Stig Johansen@47:300:110 * * * * Have fun... and: release all of your source codes!!! * **********************************************************************/ #include random.bz var $s_Xarr, $s_Yarr; // Snake-positions var $s_arrpos; // Where we are in the array. var $s_arrlen; // How many positions are used. var $s_color; // Snake color var $s_win; // Snake window var $s_steps; // Steps to go one way (temp.) var $s_olddir; // Last direction function a_clrscr() { printf("\e[1;1H\e[2J"); } function a_gotoxy($x,$y) { printf("\e[%u;%uH",$y,$x); } /* snake_putxy( X coordinate, Y coordinate, Character); */ function snake_putxy($x,$y,$ch) { printf("\e[%u;%uH\e[%sm%s",$y,$x,$s_color,$ch); } /* initsnake( Upper left corner X, Upper left corner Y, Lower right corner X, Lower right corner Y, Snake-color (string), Snake length); Should be called before updatesnake() */ function initsnake($x1,$y1,$x2,$y2,$color,$length) { var $i; $s_win[0] = $x1; $s_win[1] = $y1; $s_win[2] = $x2; $s_win[3] = $y2; $s_color = $color; $s_arrlen = $length; $s_arrpos = 0; for ($i=0;$i<($length+1);$i=$i+1) { $s_Xarr[$i] = 0; $s_Yarr[$i] = 0; } slongrand((($bv_unum+1)*($bf_sec+1)%($bf_sec+3))%($bf_timleft+3)); $i = longrand()%($x2-$x1); if ($i<0) $i = $i * -1; $s_Xarr[0] = ($i+$x1); $i = longrand()%($y2-$y1); if ($i<0) $i = $i * -1; $s_Yarr[0] = ($i+$y1); $s_steps = 0; $s_olddir = -1; } /* movesnake( Direction of movement ); 1 = Down, left 2 = Down 3 = Down, right 4 = Left 6 = Right 7 = Up, left 8 = Up 9 = Up, right MUST be called after initsnake(), uses a lot of internal variables */ function movesnake($direction) { var $old_x,$old_y; var $char; $old_x = $s_Xarr[$s_arrpos]; $old_y = $s_Yarr[$s_arrpos]; if ($s_arrpos < $s_arrlen) $s_arrpos = $s_arrpos + 1; else $s_arrpos = 0; if ($s_Xarr[$s_arrpos]!=0) /* remove tail */ snake_putxy($s_Xarr[$s_arrpos],$s_Yarr[$s_arrpos]," "); switch ($direction) { case 7: { /* Up, left corner */ if ($old_x<=$s_win[0]) $s_Xarr[$s_arrpos] = $s_win[2]; else $s_Xarr[$s_arrpos] = $old_x - 1; if ($old_y<=$s_win[1]) $s_Yarr[$s_arrpos] = $s_win[3]; else $s_Yarr[$s_arrpos] = $old_y - 1; $char = "\\"; break; } case 8: { /* Up */ $s_Xarr[$s_arrpos] = $old_x; if ($old_y<=$s_win[1]) $s_Yarr[$s_arrpos] = $s_win[3]; else $s_Yarr[$s_arrpos] = $old_y - 1; $char = "|"; break; } case 9: { /* Up, right corner */ if ($old_x>=$s_win[2]) $s_Xarr[$s_arrpos] = $s_win[0]; else $s_Xarr[$s_arrpos] = $old_x + 1; if ($old_y<=$s_win[1]) $s_Yarr[$s_arrpos] = $s_win[3]; else $s_Yarr[$s_arrpos] = $old_y - 1; $char = "/"; break; } case 4: { /* Left */ if ($old_x<=$s_win[0]) $s_Xarr[$s_arrpos] = $s_win[2]; else $s_Xarr[$s_arrpos] = $old_x - 1; $s_Yarr[$s_arrpos] = $old_y; $char = "-"; break; } case 6: { /* Right */ if ($old_x>=$s_win[2]) $s_Xarr[$s_arrpos] = $s_win[0]; else $s_Xarr[$s_arrpos] = $old_x + 1; $s_Yarr[$s_arrpos] = $old_y; $char = "-"; break; } case 1: { /* Down, left corner */ if ($old_x<=$s_win[0]) $s_Xarr[$s_arrpos] = $s_win[2]; else $s_Xarr[$s_arrpos] = $old_x - 1; if ($old_y>=$s_win[3]) $s_Yarr[$s_arrpos] = $s_win[1]; else $s_Yarr[$s_arrpos] = $old_y + 1; $char = "/"; break; } case 2: { /* Down */ $s_Xarr[$s_arrpos] = $old_x; if ($old_y>=$s_win[3]) $s_Yarr[$s_arrpos] = $s_win[1]; else $s_Yarr[$s_arrpos] = $old_y + 1; $char = "|"; break; } case 3: { /* Down, right corner */ if ($old_x>=$s_win[2]) $s_Xarr[$s_arrpos] = $s_win[0]; else $s_Xarr[$s_arrpos] = $old_x + 1; if ($old_y>=$s_win[3]) $s_Yarr[$s_arrpos] = $s_win[1]; else $s_Yarr[$s_arrpos] = $old_y + 1; $char = "\\"; break; } } /* a_gotoxy(60,22); printf("\e[KDirection: %i\n",$direction); a_gotoxy(60,23); printf("\e[KOld XY: (%i,%i)\n",$old_x,$old_y); a_gotoxy(60,24); printf("\e[KNew XY: (%i,%i)\n",$s_Xarr[$s_arrpos],$s_Yarr[$s_arrpos]); */ snake_putxy($s_Xarr[$s_arrpos],$s_Yarr[$s_arrpos],$char); } /* updatesnake( ); Should ONLY be called after a initsnake() call. */ function updatesnake() { var $i, $notok; if ($s_steps==0) { $i = longrand()%20; if ($i<0) $i = $i * -1; $s_steps = $i + 1; $notok = 1; while ($notok) { $i = longrand()%8; if ($i<0) $i = $i * -1; switch ($i) { case 0: { if ($s_olddir!=8) $notok = 0; break; } case 1: { if ($s_olddir!=7) $notok = 0; break; } case 2: { if ($s_olddir!=6) $notok = 0; break; } case 3: { if ($s_olddir!=5) $notok = 0; break; } case 5: { if ($s_olddir!=3) $notok = 0; break; } case 6: { if ($s_olddir!=2) $notok = 0; break; } case 7: { if ($s_olddir!=1) $notok = 0; break; } case 8: { if ($s_olddir) $notok = 0; break; } } } $s_olddir = $i; } else $s_steps = $s_steps - 1; movesnake($s_olddir+1); delay(1); } /* :) (optional) (really a test-screen) */ function skryteskjerm() { var $i; initsnake(1,1,80,24,"36",50); // S $s_Xarr[0] = 11; $s_Yarr[0] = 4; snake_putxy($s_Xarr[0],$s_Yarr[0],"-"); for ($i=0;$i<10;$i=$i+1) movesnake(4); for ($i=0;$i<5;$i=$i+1) movesnake(2); for ($i=0;$i<10;$i=$i+1) movesnake(6); for ($i=0;$i<5;$i=$i+1) movesnake(2); for ($i=0;$i<10;$i=$i+1) movesnake(4); initsnake(1,1,80,24,"36",40); // N $s_Xarr[0] = 15; $s_Yarr[0] = 14; snake_putxy($s_Xarr[0],$s_Yarr[0],"|"); for ($i=0;$i<10;$i=$i+1) movesnake(8); for ($i=0;$i<10;$i=$i+1) movesnake(3); for ($i=0;$i<10;$i=$i+1) movesnake(8); initsnake(1,1,80,24,"36",40); // A $s_Xarr[0] = 29; $s_Yarr[0] = 14; snake_putxy($s_Xarr[0],$s_Yarr[0],"|"); for ($i=0;$i<10;$i=$i+1) movesnake(8); for ($i=0;$i<10;$i=$i+1) movesnake(6); for ($i=0;$i<10;$i=$i+1) movesnake(2); initsnake(1,1,80,24,"36",20); $s_Xarr[0] = 29; $s_Yarr[0] = 9; for ($i=0;$i<10;$i=$i+1) movesnake(6); initsnake(1,1,80,24,"36",20); // K $s_Xarr[0] = 43; $s_Yarr[0] = 4; snake_putxy($s_Xarr[0],$s_Yarr[0],"|"); for ($i=0;$i<10;$i=$i+1) movesnake(2); initsnake(1,1,80,24,"36",20); $s_Xarr[0] = 49; $s_Yarr[0] = 4; snake_putxy($s_Xarr[0],$s_Yarr[0],"/"); for ($i=0;$i<5;$i=$i+1) movesnake(1); for ($i=0;$i<1;$i=$i+1) movesnake(2); for ($i=0;$i<4;$i=$i+1) movesnake(3); initsnake(1,1,80,24,"36",50); // E $s_Xarr[0] = 62; $s_Yarr[0] = 4; snake_putxy($s_Xarr[0],$s_Yarr[0],"-"); for ($i=0;$i<10;$i=$i+1) movesnake(4); for ($i=0;$i<10;$i=$i+1) movesnake(2); for ($i=0;$i<10;$i=$i+1) movesnake(6); initsnake(1,1,80,24,"36",10); $s_Xarr[0] = 52; $s_Yarr[0] = 9; for ($i=0;$i<5;$i=$i+1) movesnake(6); initsnake(1,1,80,24,"36",50); // S $s_Xarr[0] = 76; $s_Yarr[0] = 4; snake_putxy($s_Xarr[0],$s_Yarr[0],"-"); for ($i=0;$i<10;$i=$i+1) movesnake(4); for ($i=0;$i<5;$i=$i+1) movesnake(2); for ($i=0;$i<10;$i=$i+1) movesnake(6); for ($i=0;$i<5;$i=$i+1) movesnake(2); for ($i=0;$i<10;$i=$i+1) movesnake(4); a_gotoxy(18,20); printf("\e[1;33mSnakes/$ by Stig Johansen v9514.14"); a_gotoxy(28,22); printf("\e[35mBarCode BBS\e[0m"); } function main() { var $old_line; $old_line = $bu_pagelength; $bu_pagelength = 0; a_clrscr(); skryteskjerm(); delay(10); a_clrscr(); showfile(strcat($bl_menudir,"bull0.gr")); initsnake(1,1,80,24,"1;33",20); while ((!kbhit())&&($bv_carrier||($bn_speed==0))) updatesnake(); $bu_pagelength = $old_line; a_clrscr(); }