Turtle Graphics

Stato
Discussione chiusa ad ulteriori risposte.

imported_jam

Utente Silver
15 Febbraio 2009
14
0
0
58
Propongo anche qui questo esercizietto facile ma carino ;)

Conoscete la Turtle Graphics?

Quello che vi chiedo, nella pratica, è di creare un programmino che simuli l'andamento di una tartarufa un un pavimento di caselle 20*20, ove all'utente sia possibile:
1. muovere la tartaruga
2. alzare o abbassare la penna
3.stampare il risultato ottenuto

Ovviamente quando la tartaruga si muove su una casella e la penna è abbassata deve rimanere traccia (io ho usato carattere '#' per pieno e ' ', ovviamente, per vuoto).

In effetti avete abbastanza libertà su come implementarlo, anche la matrice 20x20 potete impostarla casualmente o arbitrariamente (io non avevo voglia), più che altro mi interessano le varie vie per ottenere il risultato Smile

il mio in c++, non oltrepassate i bordi della matrice (ho fatto il ritorno dall'altra parte in maniera molto foga su un altro source, troppo sonno per copypastare), di meglio proprio non m'è venuto, credo che lo rifarò dopo un'abbondante dormita.

turtle.h -> http://blacklight.gotdns.org/cgi-bin/nopaste.pl?mode=view&id=1237041105
turtlegraph.cpp -> http://blacklight.gotdns.org/cgi-bin/nopaste.pl?mode=view&id=1237041121
 
kr1pn0$ ha detto:
appena ho tempo lo creo,
[ot]
è razzismo contro i linguaggi non OOP xD
[/ot]
[ot]
in effetti.... beh meglio cosi per chi come me ha studiato il java o il C++ :lol:
[/ot]
 
Ma guarda che farlo senza classi direi che è molto più facile, io l'ho fatto solo perchè volevo la mia tartaruga 'jam' :lol:
 
jam ha detto:
Ma guarda che farlo senza classi direi che è molto più facile, io l'ho fatto solo perchè volevo la mia tartaruga 'jam' :lol:

[ot]
piu facile ma meno coerente. Penso che l'oop serva proprio per questi problemi della realtà![/ot]
 
già, ma il concetto è fatelo come vi pare

shura: il tuo è davvero carino ^^ ma senti, l'idetazione a 8 caratteri non sarà un po' esagerata? :lol:
 
Jam, il tuo programma mi da errori di comnpilazione:
Codice:
Microsoft Windows XP [Versione 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

Wizard@WindowsXp~$: >g++ -o turtle turtle.cpp
In file included from turtle.cpp:2:
turtle.h: In member function `void turtle::move(char)':
turtle.h:71: error: a function-definition is not allowed here before '{' token
turtle.h:71: error: expected `,' or `;' before '{' token
turtle.h:75: error: expected primary-expression before "bool"
turtle.h:75: error: expected `;' before "bool"
turtle.h:80: error: expected `;' before '{' token
turtle.h:91: error: expected primary-expression before "void"
turtle.h:91: error: expected `;' before "void"
turtle.h:102: error: a function-definition is not allowed here before '{' token
turtle.h:102: error: expected `,' or `;' before '{' token
turtle.cpp:6: error: expected primary-expression before "void"
turtle.cpp:6: error: expected `;' before "void"
turtle.cpp:16: error: expected primary-expression before "int"
turtle.cpp:16: error: expected `;' before "int"
turtle.cpp:64: error: expected `}' at end of input

Wizard@WindowsXp~$: >
Compilo con il g++ di dev-c++ su windows xp SP 2
 
Aggiornato il codice...ho migliorato qualcosina, tipo la gestione delle coordinate, ed ora il puntatore è giallo, a me dalla bash non si vedeva neanche, come ultima cosa ho aggiunto la gomma...risultato:
Thumbnail:

Executable:
http://g.imagehost.org/download/0157/turtle
Source:
http://shurabozz.pastebin.com/f5b27d1e7

Edit: ririmigliorato
 
io sono piu pigro e scrivo poco!
[ruby]
Codice:
#!/usr/bin/ruby 
 def gogotarta(_g=[],_pen=false,i=[0,0]) 
 puts "Commands:\nl = move left\nr = move right\nd = move up\nd = move down\nw = pen writing\nn = pen up\nx = view result" 
 puts "command(s): " 
 die=false 
 _mv=gets.chomp 
 _mv.each_byte{|mv| 
 mv=mv.chr 
 if mv=~/x/i 
 die=true 
 break 
 end 
 if _pen : _g.push(i[0].to_s+i[1].to_s) end 
 if mv=~/[rlud]/i 
 (["r","l"].include?(mv)) ? i[1]+={"r"=>1,"l"=> -1}[mv] : i[0]+={"u"=>-1,"d"=>1}[mv] 
 i.each_index{|v| if i[v]<0 : i[v]=0 elsif i[v]>19 : i[v]=19 end} 
 elsif mv=~/w|n/i : _pen=((mv=='w')? true: false) end 
 } 
 if !die then return gogotarta(_g,_pen,i) end 
 r=("o "*22)+"\n" 
 20.times do |i0| 
 r+="o " 
 20.times do |i1| 
 s=(_g.include?(i0.to_s+i1.to_s))? "# " : "  " 
 if (i0==i[0] and i1==i[1]) then r+='T ' else r+=s end 
 end 
 r+="o\n" 
 end 
 return r+"o "*22 
 end 
 puts gogotarta
per chi avesse difficolta a capirlo lo posso postare anche in php
screen di esempio:
 
eh lo so shurabozz...se vuoi lo faccio in actionscript e do la merd* a tutti!XDXD
dai scherzo complimenti!
 
eccolo!
esempio:http://www.cyberfox.netsons.org/lab/exs/tarta_swf/tarta.html

codice [as3]
Codice:
import fl.controls.TextArea;
import flash.text.TextFormat;
var _cd:int=10;
var _nc:int=20;
var _xy:Array=new Array(0,0);
var _g:Array=new Array();
var _pos:Array=new Array(2);
var _pen:Boolean=false;
var _tarta:Sprite=new Sprite();
var _info:TextArea=new TextArea();

for(var i:int=0;i<_nc;i++){
_g.push(new Array());
for(var i0:int=0;i0<_nc;i0++){
var ns:Sprite=new Sprite();
ns.graphics.beginFill(0x666666);
ns.graphics.drawRect(0,0,_cd,_cd);
ns.graphics.endFill();
ns.buttonMode=true;
_g[i].push(ns);
addChild(_g[i][i0])
_g[i][i0].x=(_xy[0]+=11);
_g[i][i0].y=_xy[1];
}
_xy[0]=0;
_xy[1]+=11;
}

_tarta.graphics.beginFill(0x33cc00);
_tarta.graphics.drawCircle(0,0,3);
_tarta.graphics.endFill();
addChild(_tarta);
move_tarta(new Array(0,0));
addChild(_info)
_info.x=(_nc*_cd+_nc)+40;
_info.y=10;

function update_info():void{
_info.height=100;
_info.verticalScrollPolicy="off"
_info.htmlText="Position:<br/> - Column: "+(_pos[0]+1)+"<br/> - Row: "+(_pos[1]+1)
_info.htmlText+="<br/>Pen: "+((_pen)?"Down":"Up")+".";
}
function move_tarta(en:Array){
_tarta.x=_g[en[0]][en[1]].x+(_nc/2-5);
_tarta.y=_g[en[0]][en[1]].y+(_nc/2-5);
_pos[0]=_g.indexOf(_g[en[0]]);
_pos[1]=_g[en[0]].indexOf(_g[en[0]][en[1]]);
if(_pen){
var clr:Sprite=new Sprite();
clr.graphics.beginFill(0x99ccff,.4);
clr.graphics.drawRect(0,0,_cd,_cd);
clr.graphics.endFill();
addChild(clr);
clr.x=_g[en[0]][en[1]].x;
clr.y=_g[en[0]][en[1]].y;
}
update_info();
}
function gogotarta(e:KeyboardEvent):void{
if (e.keyCode==37 && _pos[1]>0) move_tarta(new Array(_pos[0],_pos[1]-1));
if (e.keyCode==38 && _pos[0]>0) move_tarta(new Array(_pos[0]-1,_pos[1]));
if (e.keyCode==39 && _pos[1]<19) move_tarta(new Array(_pos[0],_pos[1]+1));
if (e.keyCode==40 && _pos[0]<19) move_tarta(new Array(_pos[0]+1,_pos[1]));
if (e.keyCode==32) {
	_pen=!_pen;
	move_tarta(new Array(_pos[0],_pos[1]))
}
}
stage.addEventListener(KeyboardEvent.KEY_DOWN,gogotarta);

testato su flash cs4, basta scriverlo sul 1° fotogramma
 
se ripassi troppo la penna non si vede la pallina verde, se aggiungessi la gomma sarebbe davvero bello, poi se clicco sull'area delle info è un'obbrobrio XD però è troppo bello, sul serio
 
eh l'area del info è una semplice textarea con testo html, ma non mi sono preoccupato di formattare il testo e dei dettagli estetici, senno non mi limitavo a scrivere ma disegnavo a mano qualcosa di molto meglio!!
 
ciao roberto scusa ho letto il messaggio solo adesso...
ti ho appena scritto la traduzione della versione ruby
Codice:
#!/usr/bin/php -f
<?php
function gogotarta($_g=array(),$_pen=false,$_i=array(0,0)){
echo "Commands:\nl = move left\nr = move right\nd = move up\nd = move down\nw = pen writing\nn = pen up\nx = view result\n";
echo "command(s): ";
$die=false;
$gets = fopen('php://stdin', 'r');

$_mv = trim(fgets($gets));
for($i=0;$i<strlen($_mv);$i++){
$char=$_mv[$i];
if($char=="x"){
$die=true;
break;
}
if ($_pen) array_push($_g,(string)$_i[0].(string)$_i[1]);
if(preg_match("/[rlud]/i",$char)) {
$tmp0=array("r"=>1,"l"=> -1);
$tmp1=array("u"=>-1,"d"=>1);
(in_array($char,array("r","l"))) ? $_i[1]+=$tmp0[$char] : $_i[0]+=$tmp1[$char];
foreach($_i as $k=>$v) if($v<0) $_i[$k]=0; else if($v>19) $_i[$k]=19;
}else if(preg_match("/w|n/i",$char)) $_pen=($char=='w')? true: false;
}

if (!$die) return gogotarta($_g,$_pen,$_i);
$r="o o o o o o o o o o o o o o o o o o o o o o\n";
for($i0=0;$i0<20;$i0++){
$r.="o ";
for($i1=0;$i1<20;$i1++){
$s=(in_array((string)$i0.(string)$i1,$_g))? "# " : "  ";
if ($i0==$_i[0] and $i1==$_i[1]) $r.='T ';
else $r.=$s; 
}
$r.="o\n";
}
return $r."o o o o o o o o o o o o o o o o o o o o o o\n";

}
echo gogotarta();

?>
i linguaggi sono diversi, quind magari in php c'era una via piu pulita...ma non ho voglia di mettermi a pensare domenica mattina!
l'ho testato con la stessa stringa che vedi nell'immagine della versione ruby e da lo stesso risultato!
 
Stato
Discussione chiusa ad ulteriori risposte.