<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mind Unpacked &#187; Java</title>
	<atom:link href="http://mindunpacked.com/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://mindunpacked.com</link>
	<description>informatica.elettronica.chimica.new stuff</description>
	<lastBuildDate>Tue, 22 Dec 2009 17:35:13 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
<link>http://mindunpacked.com</link>
<url>http://mindunpacked.com/wp-content/plugins/maxblogpress-favicon/icons/favicon-2.ico</url>
<title>Mind Unpacked</title>
</image>
		<item>
		<title>Crittografia asimmetrica e algoritmo RSA. Parte II</title>
		<link>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-ii/</link>
		<comments>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-ii/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 17:33:29 +0000</pubDate>
		<dc:creator>Francesco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[chiave pubblica]]></category>
		<category><![CDATA[crittografia]]></category>
		<category><![CDATA[crittografia asimmetrica]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RSA]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=468</guid>
		<description><![CDATA[In questa seconda parte dell&#8217;articolo vedremo come implementare l&#8217;algoritmo RSA di cui si era precedentemente discusso in quest&#8217;altro articolo solamente in linea teorica. Il linguaggio di programmazione usato sara&#8217; Java, poiche&#8217; fornisce nativamente una classe BigInteger per il supporto di numeri interi di   dimensione arbitraria, che useremo per manipolare gli enormi numeri primi [...]]]></description>
			<content:encoded><![CDATA[<p>In questa seconda parte dell&#8217;articolo vedremo come implementare l&#8217;<strong>algoritmo RSA</strong> di cui si era precedentemente discusso in <a href="http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-i/">quest&#8217;altro articolo</a> solamente in linea teorica. Il linguaggio di programmazione usato sara&#8217; <strong>Java</strong>, poiche&#8217; fornisce nativamente una classe BigInteger per il supporto di numeri interi di   dimensione arbitraria, che useremo per manipolare gli enormi numeri primi necessari alla generazione delle chiavi, impossibili da gestire con tipi di dati   primitivi. Non mi soffermero&#8217;, ovviamente, su questioni sintattiche relative al linguaggio; inoltre non commentero&#8217; tutto il codice ma solo le parti piu&#8217;   importanti, mentre potrete leggere il resto scaricando l&#8217;archivio in fondo all&#8217;articolo.  La prima funzione necessaria al funzionamento della classe e&#8217; quella relativa alla generazione delle chiavi. Come avevamo visto nel precedente articolo, per   generare le chiavi si segue una procedura standard che e&#8217; facilmente implementabile usando la classe BigInteger di Java.<br />
<span id="more-468"></span></p>
<pre class="brush: java;">
		BigInteger p = BigInteger.probablePrime(keyLength/2, new SecureRandom()); // Generiamo un numero &quot;probabilmente&quot; primo, p
		BigInteger q = BigInteger.probablePrime(keyLength/2, new SecureRandom()); // Generiamo un numero &quot;probabilmente&quot; primo, q

		// Calcoliamo n e phi
		BigInteger n = p.multiply(q);
		BigInteger phi = p.subtract(new BigInteger(&quot;1&quot;)).multiply(q.subtract(new BigInteger(&quot;1&quot;)));

		// publicKey conterra' l'esponente pubblico e,
		// scegliendo e come il primo numero primo successivo a
		// p, esso sara' anche coprimo con phi (come richiesto nell'algoritmo)
		this.publicKey = p.nextProbablePrime();
		this.privateKey = publicKey.modInverse(phi);
		this.n = n;
	}
</pre>
<p>Una precisazione sulla funzione probablePrime() e nextProbablePrime(): esse restituiscono un numero che <strong>probabilmente</strong> e&#8217; primo, utilizzando dei test di   probabilita&#8217; probabilistici. Il margine di errore e&#8217; molto basso: per essere precisi, la probabilita&#8217; che un numero restituito da queste due funzioni sia   composto e&#8217; sempre minore di 2^-100 e la velocita&#8217; dell&#8217;algoritmo lo rende preferibile ad uno deterministico nella generazione delle chiavi. Una volta generate le chiavi, si possono gia&#8217; creare le due funzioni di base per criptare/decriptare un numero intero. Ecco il codice:</p>
<pre class="brush: java;">
	public BigInteger encrypt(BigInteger m) {
		return m.modPow(publicKey, n); // (m^publicKey) % n
	}
	public BigInteger decrypt(BigInteger m) {
		return m.modPow(privateKey, n); // (m^privateKey) % n
	}
</pre>
<p>Dovrebbe essere abbastanza chiaro. La funzione modPow(e, n) restituisce semplicemente this ^ e % n e ci risparmia un po di calcoli. Con queste due semplici funzioni possiamo pero&#8217; criptare unicamente numeri interi; per poter usare l&#8217;algoritmo su un testo piu&#8217; o meno lungo dobbiamo creare   altre due funzioni che processano il testo in maniera tale da essere compatibile con l&#8217;algoritmo, i passi principali saranno questi:</p>
<ol>
<li> aggiungere del padding (casuale) al testo in modo da renderlo divisibile in blocchi di uguali dimensioni. la dimensione di ogni blocco sara&#8217; la   lunghezza della chiave.</li>
<li>processare ogni blocco, convertire il testo in un intero e cifrarlo</li>
</ol>
<p>Per il processo inverso, invece:</p>
<ol>
<li> dividere il testo nel numero di blocchi in base alla chiave.</li>
<li> decriptare ogni blocco e convertire gli interi nel testo corrispondente</li>
<li> rimuovere il padding.</li>
</ol>
<p>Ecco il codice con alcuni commenti esplicativi:</p>
<pre class="brush: java;">
	public String encrypt(String m) {
		/* Per comodita' (piu' sotto si vedra' perche') convertiamo i
		 * caratteri del messaggio nel loro codice ASCII (esadecimale)
		 */
		String mHex = &quot;&quot;;
		for (int i = 0; i &lt; m.length(); i++) {
			mHex += Integer.toHexString(m.charAt(i));
		}

		/* Calcoliamo quanto padding e' necessario, chiamiamolo N, e poi concateniamo al messaggio
		 * N-1 bytes di padding casuale. L'ultimo non deve essere casuale ma deve contenere appunto
		 * il numero N, cosi' da poter poi rimuovere la giusta quantita di padding nella funzione decrypt().
		 */
		int padding = blockSize - (mHex.length()/2)%blockSize;
		for (int i = 0; i &lt; padding-1; i++) { // Prima generiamo N-1 byte casuali
			int randomPadding = (int)(10*Math.random());
			mHex += randomPadding &lt; 10 ? &quot;0&quot; + Integer.toHexString(randomPadding) : Integer.toHexString(randomPadding);
		}
		// Ultimo byte di padding
		mHex += padding &lt; 10 ? &quot;0&quot; + Integer.toHexString(padding) : Integer.toHexString(padding);

		int numBlocks = (mHex.length()/2)/blockSize; // Numero di blocchi in cui dividere il messaggio

		String result = &quot;&quot;, currentBlock = &quot;&quot;;
		for (int b = 0; b &lt; numBlocks; b++) {
			currentBlock = mHex.substring(b*blockSize*2, (b+1)*blockSize*2);

			/* Il blocco corrente, essendo una stringa in formato esadecimale,
			 * quindi un numero, puo' essere criptato con le due funzioni che abbiamo gia'
			 * creato precedentemente che accettano come argomento un BigInteger.
			 */
			// Questo costruttore accetta una stringa, e la base come secondo argomento
			BigInteger r = encrypt(new BigInteger(currentBlock, 16)); 

			/* Puo' accadere che la string che otteniamo come risultato abbia un byte in meno,
			 * in questo caso, per non avere problemi nel decriptare il messaggio, aggiungiamo
			 * uno zero iniziale che non cambia niente, ma la rende della dimensione corretta.
			 */
			if (r.toString(16).length() == blockSize*4) {
				result += r.toString(16);
			} else {
				result += (&quot;0&quot; + r.toString(16));
			}
		}
		return result;
	}

	public String decrypt(String m) {
		int numBlocks = (m.length()/2)/(blockSize*2);

		String temp = &quot;&quot;, currentBlock = &quot;&quot;;
		/* Questo ciclo, quasi uguale a quello della funzione encrypt(), scorre ogni
		 * blocco, lo decripta e concatena il risultato in una nuova stringa.
		 */
		for (int b = 0; b &lt; numBlocks; b++) {
			currentBlock = m.substring(b*blockSize*4, (b+1)*blockSize*4);
			BigInteger r = decrypt(new BigInteger(currentBlock, 16));
			temp += r.toString(16);
		}

		/* Il padding e' uguale all'ultimo byte della
		 * stringa, come avevamo precedentemente impostato.
		 */
		int padding = Integer.parseInt(temp.substring(temp.length()-2), 16);
		int actualLength = temp.length() - padding*2;

		// Rimuove il padding
		temp = temp.substring(0, actualLength);

		String result = &quot;&quot;;
		// Riconverte la stringa da esadecimale a testo
		for (int i = 0; i &lt; temp.length(); i+=2) {
			result += (char)Integer.parseInt(temp.substring(i,i+2), 16);
		}
		return result;
	}
</pre>
<p>Tutto il codice e&#8217; contenuto in <a href="http://www.mindunpacked.com/risorse/RSA.zip">questo archivio</a> disponibile per il download.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Crittografia asimmetrica e algoritmo RSA. Parte I</title>
		<link>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-i/</link>
		<comments>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-i/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 14:47:42 +0000</pubDate>
		<dc:creator>Francesco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[chiave pubblica]]></category>
		<category><![CDATA[crittografia]]></category>
		<category><![CDATA[crittografia asimmetrica]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RSA]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=451</guid>
		<description><![CDATA[La crittografia asimmetrica, o crittografia a chiave pubblica, e&#8217; un particolare tipo di crittografia nel quale vengono utilizzate, al posto della singola chiave privata utilizzata nella crittografia simmetrica, una coppia di chiavi di cui una pubblica (per cifrare il messaggio) ed una privata (per decifrarlo).

Uno dei problemi principali da risolvere quando si utilizza la crittografia [...]]]></description>
			<content:encoded><![CDATA[<p>La <strong>crittografia asimmetrica</strong>, o crittografia <strong>a chiave pubblica</strong>, e&#8217; un particolare tipo di crittografia nel quale vengono utilizzate, al posto della singola chiave privata utilizzata nella crittografia simmetrica, una coppia di chiavi di cui una pubblica (per cifrare il messaggio) ed una privata (per decifrarlo).<br />
<span id="more-451"></span><br />
Uno dei problemi principali da risolvere quando si utilizza la crittografia simmetrica e&#8217; infatti quello dello <strong>scambio della chiave</strong>: utilizzando la stessa chiave per cifrare e decifrare il messaggio, le parti comunicanti devono in qualche modo entrare in contatto prima di scambiarsi il messaggio proprio per scambiare la chiave con cui, successivamente, operare. In pratica, bisogna trovare un canale sicuro per comunicarsi la chiave, altrimenti esiste sempre il rischio che essa possa essere carpita dall&#8217;esterno.</p>
<p>L&#8217;idea di base della <strong>crittografia a chiave pubblica</strong> serve proprio a porre fine a questo inconveniente e a rendere non piu&#8217; necessaria una comunicazione preliminare (e sicura) tra le parti per scambiarsi una chiave. In un algoritmo a chiave asimmetrica vengono infatti create due chiavi anziche&#8217; una: quella pubblica verra&#8217; usata da chi vuole cifrare un messaggio da inviare al possessore di quella chiave, quella privata verra&#8217; utilizzata dallo stesso per decifrare il messaggio ricevuto. La chiave pubblica di ognuno viene, insomma, resa disponibile a chiunque voglia inviargli un messaggio, che sara&#8217; poi decifrabile solamente usando la chiave privata, tenuta segreta.</p>
<p>Chiaramente le due chiavi devono essere correlate in qualche modo per avere la proprieta&#8217; sopra descritta, e cioe&#8217; che si possa crittografare un testo con una chiave (quella pubblica) e decriptarlo con un&#8217;altra (quella privata) ottenendo lo stesso testo di partenza. In particolare, esistendo questa relazione tra le chiavi bisogna evitare che dalla chiave pubblica, che tutti possono leggere, si possa risalire a quella privata. Bisogna cioe&#8217; trovare un modo per generarla che sia facile da percorrere in un verso (cioe&#8217; generare la chiave), ma che sia quasi impossibile da percorrere nell&#8217;altro, cioe&#8217; trovare i dati usati per generarla partendo dalla chiave pubblica (altrimenti, una volta ottenuti i dati, si potrebbe generare la chiave privata ad essa associata).</p>
<p>I primi ad inventare un tale sistema furono W. <strong>Diffie</strong> e M. <strong>Hellman</strong> nel 1976, ma fu nel &#8216;77 che Rivest, Shamir e Adleman, tutti studenti del MIT, realizzarono uno degli algoritmi a chiave pubblica piu&#8217; utilizzato al giorno d&#8217;oggi e che prende il nome di RSA. La sicurezza dell&#8217;<strong>algoritmo RSA</strong> si basa sulla difficolta&#8217; di fattorizzare in tempi accettabili il prodotto di due grandi numeri primi: infatti, mentre e&#8217; facilissimo calcolare il prodotto di questi due numeri, non esiste un algoritmo che possa fattorizzarlo velocemente. Nel resto di questo articolo vedremo a grandi linee come opera l&#8217;algoritmo RSA mentre nella seconda parte vedremo un&#8217;implementazione in Java.</p>
<p>In linea generale possiamo distinguere tre &#8220;fasi&#8221; dell&#8217;algoritmo: generazione delle chiavi, criptaggio, decriptaggio (si, lo so che suonano malissimo).</p>
<p><strong>Generazione delle chiavi</strong></p>
<ol>
<li>Si generano due grandi numeri primi <em>p</em>, <em>q</em> tali che il loro prodotto <em>n = pq</em> ha la lunghezza in bit che desideriamo.</li>
<li>Si calcola <em>n = pq</em>, e <em>phi = (p-1)(q-1)</em></li>
<li>Si sceglie un intero positvo <em>e</em> &lt; <em>phi</em> e coprimo con phi (cioe&#8217; MCD(e, phi) = 1)</li>
<li>Si calcola un intero positivo <em>d &lt; phi</em> tale che<span> <em>ed</em> <em>≡ 1 (mod phi)</em></span></li>
<li><span>La coppia (n, e) forma la chiave pubblica, la coppia (n, d) quella privata.</span></li>
</ol>
<p><strong>Criptaggio</strong><br />
Per criptare un messaggio si ottiene la chiave pubblica del destinatario e, dopo aver trasformato il messaggio di testo in un numero intero, si utilizza la formula <em>c = m<sup>e</sup> mod n</em>, dove m e&#8217; il messaggio.</p>
<p><strong>Decriptaggio</strong><br />
Partendo dal testo criptato si usa la formula <em>m = c<sup>d</sup> mod n, </em>dove c e&#8217; il testo cifrato.</p>
<p>L&#8217;unico modo per decriptare un messaggio, come e&#8217; evidente dall&#8217;algoritmo, e&#8217; quello di essere a conoscenza dell&#8217;esponente segreto <em>d</em> e del modulo, <em>n. </em>Mentre l&#8217;esponente e&#8217; segreto, il modulo e&#8217; pubblico poiche&#8217; e&#8217; utilizzato anche per criptare il messaggio:<em> </em>ad ogni modo, per risalire a <em>d</em>, che permetterebbe di accedere al contenuto del messaggio, abbiamo bisogno non di <em>n</em>, ma di <em>p</em> e <em>q</em>, i due grandi numeri primi usati per generarlo. Se i numeri primi sono abbastanza grandi, e&#8217; impossibile fattorizzare <em>n</em> in tempi accettabili con gli algoritmi attuali.</p>
<p>In questo articolo non abbiamo visto una prova teorica del funzionamento dell&#8217;RSA e cioe&#8217; una prova del fatto che criptando un messaggio con la chiave pubblica e decriptandolo con la chiave privata si ottiene sempre di nuovo il messaggio in chiaro, ma potete trovare una dimostrazione (in inglese) a questo link: <a title="RSA Proof" href="http://www.di-mgt.com.au/rsa_theory.pdf" target="_blank">http://www.di-mgt.com.au/rsa_theory.pdf</a>. Per comprenderla sono necessarie nozioni (non troppo avanzate) di teoria dei numeri.</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/crittografia-asimmetrica-e-algoritmo-rsa-parte-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Robocode: guerre tra robot in Java</title>
		<link>http://mindunpacked.com/2009/robocode-guerre-tra-robot-in-java/</link>
		<comments>http://mindunpacked.com/2009/robocode-guerre-tra-robot-in-java/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 19:48:56 +0000</pubDate>
		<dc:creator>Francesco</dc:creator>
				<category><![CDATA[Informatica]]></category>
		<category><![CDATA[crobots]]></category>
		<category><![CDATA[Intelligenza artificiale]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[robocode]]></category>

		<guid isPermaLink="false">http://mindunpacked.com/?p=378</guid>
		<description><![CDATA[Molti di voi probabilmente conosceranno o avranno sentito parlare di CRobots, il gioco di programmazione in cui gli sfidanti devono creare, usando un sottoinsieme delle istruzioni del linguaggio C, un robot che distrugga tutti gli altri robot (creati da altri programmatori) presenti nell&#8217;arena. Bene, Robocode e&#8217; un gioco molto simile ma con alcune differenze: i [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Molti di voi probabilmente conosceranno o avranno sentito parlare di <strong>CRobots</strong>, il gioco di programmazione in cui gli sfidanti devono creare, usando un sottoinsieme delle istruzioni del linguaggio C, un robot che distrugga tutti gli altri robot (creati da altri programmatori) presenti nell&#8217;arena. Bene, <strong>Robocode</strong> e&#8217; un gioco molto simile ma con alcune differenze: i robot si scrivono in Java e non ci sono limiti alla fantasia del programmatore come avveniva in CRobots (perche&#8217; usava solo un set limitato di istruzioni) rendendo possibile creare anche robot dalla complessa intelligenza artificiale!<br />
<span id="more-378"></span><br />
Sul <a href="http://robocode.sourceforge.net">sito ufficiale</a> di <strong>Robocode</strong> trovate molte info e l&#8217;installer in Java. Vediamo subito come creare il nostro primo robot dopo aver effettuato l&#8217;installazione. Subito dopo aver aperto Robocode, aprite il menu Robot e cliccate su Editor; si aprira&#8217; una nuova finestra, cioe&#8217; l&#8217;editor tramite il quale possiamo programmare i nostri robot. Cliccate su File-&gt;New-&gt;Robot. Battezzate la vostra creature e scegliete un nome o una sigla caratteristica per tutti i vostri robot (il programma crea una cartella contenente tutti i robot che creerete usando come nome la seconda sigla che inserite).</p>
<p style="text-align: justify;">Quello che vedete ora nell&#8217;editor e&#8217; il codice di base per un robot molto semplice che non fa altro che muoversi avanti e indietro e girare il suo cannone di 360 gradi, sparando quando vede un nemico. Ma analizziamo piu&#8217; da vicino il codice:</p>
<pre class="brush: java;">
public class MURobot extends Robot {
</pre>
<p>Creiamo una classe che eredita tutti gli attributi e i metodi dalla classe di base Robot.</p>
<pre class="brush: java;">
	/* Qui possiamo dichiarare tutte le variabili utilizzate dal nostro robot,
	 * in questo caso non ne abbiamo.
	 */
	public void run() {
		while(true) {
			ahead(100);
			turnGunRight(360);
			back(100);
			turnGunRight(360);
		}
	}
</pre>
<p style="text-align: justify;">Dopo aver dichiarato le eventuali variabili utilizzate all&#8217;interno della classe, vediamo il metodo run(). Questo metodo viene chiamato ogni qualvolta inizia la battaglia. All&#8217;interno di run() si trova quasi sempre un ciclo infinito: se l&#8217;esecuzione di run() termina, infatti, il nostro robot non fara&#8217; altro che stare fermo e sparare ai robot che rientrano nel suo campo visivo. Se dobbiamo svolgere delle azioni particolari, come il posizionamento in una particolare zona della mappa, conviene inserirle prima di entrare nel ciclo infinito.<br />
All&#8217;interno del ciclo il robot si muove in avanti (ahead(100)) fa un giro completo del cannone, torna indietro, fa lo stesso giro e cosi&#8217; finche&#8217; non viene distrutto o distrugge tutti i robot nell&#8217;arena.</p>
<p style="text-align: justify;">
<pre class="brush: java;">
	public void onScannedRobot(ScannedRobotEvent e) {
		fire(1);
	}
</pre>
<p><center><script type="text/javascript">
heyos_ad_user = 11334;
heyos_ad_type = "G";
heyos_ad_format = "1";
heyos_color_border = "23292b";
heyos_color_bg = "23292b";
heyos_color_link = "FFFFFF";
heyos_color_text = "21b8ca";
heyos_color_url = "21b8ca";
</script>
<script type="text/javascript" src="http://admaster.heyos.com/core/bnr.js"></script></center><br />
Il metodo onScannedRobot() e&#8217; uno dei tanti metodi per gestire gli eventi forniti di default. Questo metodo viene automaticamente eseguito quando un robot nemico rientra nel campo visivo del nostro: in questo caso l&#8217;azione e&#8217; di sparare. L&#8217;oggetto e (sta per event) passato come argomento contiene informazioni utili come la direzione del proiettile, la distanza da noi, etc&#8230; non utilizzate nel nostro caso. Potete consultare la documentazione sulle API di Robocode che e&#8217; molto esaustiva a riguardo.</p>
<pre class="brush: java;">
	public void onHitByBullet(HitByBulletEvent e) {
		turnLeft(90 - e.getBearing());
	}
}
</pre>
<p style="text-align: justify;">L&#8217;ultimo metodo viene chiamato quando il nostro robot viene colpito da un proiettile: per evitare di essere colpiti di nuovo il robot si gira nella direzione perpendicolare al proiettile e quindi si sposta grazie alle istruzioni all&#8217;interno del metodo run(). Il metodo getBearing() restituisce l&#8217;angolo tra la direzione in cui ci stiamo muovendo e la direzione del proiettile ed e&#8217; sempre compreso tra -180 e 180, ed e&#8217; uno dei tanti metodi di cui vi parlavo in precedenza.</p>
<p style="text-align: justify;">Se provate a iniziare una battaglia tra questo robot e altri leggermente piu&#8217; avanzati presenti gia&#8217; di default, vi accorgerete che le sue prestazioni non sono proprio ottimali, di fatto perdera&#8217; la maggior parte delle battaglie se non tutte (ovviamente dipende contro chi lo fate combattere), ma e&#8217; comunque un inizio. Il metodo migliore per realizzare robot sempre piu&#8217; avanzati e&#8217; cominciare da subito a crearne: ricordate anche che avendo abbastanza padronanza con Java non ci sono limiti a quello che si puo&#8217; realizzare!</p>
]]></content:encoded>
			<wfw:commentRss>http://mindunpacked.com/2009/robocode-guerre-tra-robot-in-java/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

<!-- www.000webhost.com Analytics Code -->
<script type="text/javascript" src="http://analytics.hosting24.com/count.php"></script>
<noscript><a href="http://www.hosting24.com/"><img src="http://analytics.hosting24.com/count.php" alt="web hosting" /></a></noscript>
<!-- End Of Analytics Code -->
