webForumDet fria alternativet

Saknade brickor i Perl

7 svar · 575 visningar · startad av Nugget

NuggetMedlem sedan apr. 200622 inlägg
#1

Hejsan!

Jag håller på att skriva ett brickspel i Perl 5.8.8 cgi-skript under Apache. Mitt problem ligger i att sidan med brickspelet, annars fullt fungerande, inte vill visa gif-bilderna som brickorna är sparade som. Spelet går ut på att flytta om 8 nummerbrickor så att de kommer i nummerordning. Jag tänkte först bara posta subrutinen som ska visa brickorna, "sub DisplayTiles", men med tanke på hur jag vridit och vänt på den, så lägger jag in hela skriptet. Tänk på att bara svara om ni kan tänkas ha någon idé om hur det här ska lösas. Annars tror andra att så många har svarat, så då behöver inte de. Jag vill åter poängtera att spelet verkar fungera, men utan brickor går det ju ändå inte att spela. Jag vill också säga att mappen "images" ligger en nivå upp från cgi-skriptet och att bilderna heter 0.gif - 8.gif

Tack på förhand

Nugget

#!C:/Perl/bin/perl5.8.8

use CGI;
$query = new CGI;

print $query->header;
print $query->start_html(-title=>"Tile Puzzle");
print "<H1 ALIGN=center>Tile Puzzle</H1>";
print "<BLOCKQUOTE>";
print "Click on a square adjacent to the empty one ";
print "to slide it into the empty slot. When you\'ve arranged ";
print "all the numbers in sequence, a portal will open into a ";
print "secret passage.... <P>";
print "</BLOCKQUOTE>";
print $query->startform,"\n";

if ((@tiles = $query->param('tilelist')) != "") {

$query-\>delete('tilelist');
if (!&CheckTile(\*tiles)) {
	print "\<H3\>Sorry That Move Is Not Legal\</H3\>";
	}
elsif (&Solved(@tiles)) {
	print "\<H3\>Congratulations!! You Solved It!\</H3\>";
	print "You may \<A HREF='portal.html'\>proceed\</A\>\<P\>";
	}
}

else {
@tiles= (0..8);
&Mixup(*tiles);
}

&DisplayTiles(@tiles);
print $query->hidden('tilelist',@tiles);
print $query->endform,"\n";
print $query->end_html;

sub DisplayTiles {
local ($i);
$i = 0;
print "<CENTER>";
foreach $seq (@_) {
print $query->image_button("button$seq","../images/$seq.gif");
$i++;
if ($i==3) { #Visa i rader om 3
print "<BR>\n";
$i = 0;
}
}
print "</CENTER>";
}

sub CheckTile {
local (*tiles) = @_;
local ($button, $i, $empty, $clicked, $null_tile, $array);
$clicked = 0;
$array = 3;
$null_tile = 0;
# Hitta den klickade brickan
for ($i=0; $i<=8; $i++) {
if ($query->param("button$i.x")) {
$button = $i;
last;
}
}
# Lokalisera var den klickade brickan finns i listan
for ($[..$#tiles) {
$empty = $_ if ($tiles[$_]) == $null_tile;
$clicked = $_ if ($tiles[$_]) == $button;
}
# Kolla om flytten är tillåten
# Att klicka på den tomma brickan är inte tillåtet
if ($button == $null_tile) {
return 0;
}

\# Kontrollera att den clickade brickan ligger intill den tomma
if (($empty == $clicked-1) \|\|
    ($empty == $clicked+1) \|\|
    ($empty == $clicked-$array) \|\|
    ($empty == $clicked+$array) ) {
	$tiles\[$empty\] = $tiles\[$clicked\];
	$tiles\[$clicked\] = $null_tile;
    }
else {
	return 0;
	}
return 1;
}

sub Solved {
local(@tiles) = @_;
local($j);
for ($j=0; $j<=$#tiles; $j++) {
return 0 if ($j != $tiles[$j]);
}
return 1;
}

sub Mixup {
local(@temp);
local(*tiles) = @_;
push(@temp,splice(@tiles, rand(@tiles),1)) while @tiles;
@tiles = @temp;
}

GeinMedlem sedan sep. 20005 700 inlägg
#2

Vad händer? Ser du brutna bildlänkar i webbläsaren eller? Låter som ett rättighetsproblem om du frågar mig. Kolla i apache-loggfilen så kanske du hittar något.

NuggetMedlem sedan apr. 200622 inlägg
#3

Som brutna bildlänkar förstår jag att du menar rutor med exv texten "Bild" i där bilden skulle suttit. Isåfall, ja.

Jag gjorde som du sa. Det jag fann i "error.log" sa att

"File does not exist: C:/Program/Apache Group/Apache2/htdocs/favicon.ico, referer: http://localhost:8080/cgi-bin/Brickspel.cgi" och

"File does not exist: C:/Program/Apache Group/Apache2/htdocs/images, referer: http://localhost:8080/cgi-bin/Brickspel.cgi".

Den första raden förstår jag inte alls. Den andra raden säger att den har letat i "htdocs" efter "images", men vad jag vet har jag inte hänvisat dit i skriptet. Den enda hänvisningen jag kan se till mappen images finns under "sub DisplayTiles" och ser ut så här:

print $query->image_button("button$seq","../images/$seq.gif");

Tack på förhand

Nugget

GeinMedlem sedan sep. 20005 700 inlägg
#4

Den första raden kan du strunta i.
Det verkar inte riktigt som den refererar till rätt ställe alltså. Om du tittar i källkoden på en resultatsida och tittar vart bilderna länkar till, är det då "C:/Program/Apache Group/Apache2/htdocs/images" för alla brickor eller?

NuggetMedlem sedan apr. 200622 inlägg
#5

Nej, det verka inte så. Det verkar snarare som en relativ sökväg (src="../images/4.gif"). Här kommer första raden brickor i resultatsidan:

<input type="image" name="button4" src="../images/4.gif" /><input type="image" name="button7" src="../images/7.gif" /><input type="image" name="button3" src="../images/3.gif" /><BR>

Kanske ska det också nämnas att dokumentet är i XHTML.

GeinMedlem sedan sep. 20005 700 inlägg
#6

Att ha en relativ sökväg är inget problem i sig. Är den relativa sökvägen korrekt? Dvs ska du backa ett steg för att komma till images-mappen?

NuggetMedlem sedan apr. 200622 inlägg
#7

Japp. Om man backar ett steg kommer man till Apache2-mappen där även cgi-mappen ligger. Sedan dyker man rakt ner i images-mappen. Filnamnen verkar korrekta.

NuggetMedlem sedan apr. 200622 inlägg
#8

Jag tror det är fixat nu. Jag tog en titt på httpd.conf och där fanns den här raden:

DocumentRoot "C:/Program/Apache Group/Apache2/htdocs"

Det förklarar varför läsaren inte visade bilderna. Servern kunde helt enkelt inte hitta dem. Nu har jag kopierat dem och så, så nu gör den det. Tack för all hjälp.

Nugget

133 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)