Erinevus lehekülje "ITI0011:Trips Traps Trull" redaktsioonide vahel

Allikas: Kursused
Mine navigeerimisribale Mine otsikasti
 
(ei näidata sama kasutaja 9 vahepealset redaktsiooni)
2. rida: 2. rida:
  
 
== Üldine ==
 
== Üldine ==
 
<div style="color: red;font-weight: bold;">Tähelepanu, ülesanne on uuendamisel! Tekst võib muutuda.</div>
 
  
 
'''Programmikood tuleb kirjutada selliselt, et checkstyle plugin Eclipse'is ei näita vigu.'''
 
'''Programmikood tuleb kirjutada selliselt, et checkstyle plugin Eclipse'is ei näita vigu.'''
11. rida: 9. rida:
  
 
Tuleb programmeerida Trips-Traps-Trulli mängimiseks käsurea programm ning kasutaja vastu mängiva arvuti strateegia.
 
Tuleb programmeerida Trips-Traps-Trulli mängimiseks käsurea programm ning kasutaja vastu mängiva arvuti strateegia.
 +
 +
Kuna kasutame ülesande testimiseks automaatseid teste, siis oleme ette andnud täpsed funktsioonide nimed. Kui teil jääb midagi arusaamatuks, küsige!
  
 
== Põhiosa - 5p ==
 
== Põhiosa - 5p ==
43. rida: 43. rida:
 
=== Programmi struktuur ===
 
=== Programmi struktuur ===
  
Ülesande lahendamisel kasutage laua seisu hoidmiseks ühemõõtmelist massiivi, kus iga ruudu jaoks on üks element. Elemendi väärtus tähistab seda, mis selles ruudus on: 0 - ruut on tühi, 1 - ruudul on kasutaja nupp, -1 - ruudul on arvuti nupp.
+
Programm peab olema klassis nimega '''TicTacToe''':
 +
<pre>
 +
public class TicTacToe
 +
</pre>
 +
 
 +
Ülesande lahendamisel kasutage laua seisu hoidmiseks ühemõõtmelist massiivi, kus iga ruudu jaoks on üks täisarvuline element. Elemendi väärtus tähistab seda, mis selles ruudus on: 0 - ruut on tühi, 1 - ruudul on kasutaja nupp ("X"), -1 - ruudul on arvuti nupp ("O").
  
 
Programm peab sisaldama järgmisi meetodeid (funktsioone):
 
Programm peab sisaldama järgmisi meetodeid (funktsioone):
  
 +
Funktsioon '''makeMove''', millele antakse ette laua praegune seis ja ta tagastab arvuti ("O") käigu (lauaruudu indeksi). Sisendina antud massiivis esinevad vaid lubatud väärtused (-1, 0, 1 - vastavalt arvuti nupp, tühi ruut, mängija nupp), ehk siis sisendit kontrollima ei pea.
 
<pre>
 
<pre>
 
/**
 
/**
82. rida: 88. rida:
 
* @return Cell index where the computer makes its move.
 
* @return Cell index where the computer makes its move.
 
*/
 
*/
public static int makeMove(int[] board)
+
public static int makeMove(int[] board) {
 +
// your code here
 +
}
 
</pre>
 
</pre>
  
  
Programm peab mõistlikult lahendama kasutaja väär-sisestused:
+
Funktsioon '''readInput''', mis loeb klaviatuurilt mängija sisendi ja tagastab saadud numbri. See funktsioon on suures osas teile ette antud. Te peate seda natuke muutma, et ta töötaks õigesti (sisendilugemise osa on korrektne).
# kui kasutaja ei sisestanud numbrit, annab vastava teate ja küsib uuesti
 
# kui kasutaja sisestas käigu, mis on juba käidud - annab programm vastava teate ja küsib uuesti
 
# ebakorrektne määramispiirkond 0 < x < 9
 
  
Programm võimaldab käike käia mängijatel ainult vaheldumisi. Üks mängija ei saa kunagi kaks käiku järjest teha.
+
<pre>
 
+
/**
Pärast igat käiku kuvatakse mängulaua uus seis.
+
* Text scanner which is used in readInput().
 
+
* We declare it here as a separate variable
Programm suudab tuvastada, kui mängulaual ei ole rohkem legaalseid käike ja lõpetab mängu. St. massiivi kõik elemendid on väärtustatud, ei ole 0-id.
+
* in order to avoid warnings about not closing it.
 +
*/
 +
private static Scanner scanner = new Scanner(System.in);
  
Märkused:
 
* "põhiosas" on täiesti piisav, et arvuti vaatab mängulauda ja valib esimese või juhusliku käigu, mis ei ole veel võetud, - midagi keerulisemat tegema ei pea.
 
 
<pre>
 
 
/**
 
/**
 
* Reads a number from the standard input and returns it.
 
* Reads a number from the standard input and returns it.
107. rida: 110. rida:
 
*/
 
*/
 
public static int readInput() {
 
public static int readInput() {
Scanner scanner = new Scanner(System.in);
+
if (scanner.hasNextInt()) { // if number
if (scanner.hasNextInt()) {
+
int nr = scanner.nextInt(); // let's read it
int nr = scanner.nextInt();
 
 
}
 
}
scanner.close();
+
scanner.nextLine(); // read the rest of the line
 
return 0;
 
return 0;
 
}
 
}
 
</pre>
 
</pre>
  
== I lisaosa - 2p ==
+
Ülaltoodud kood peaks minema class'i bloki sisse (näiteks peale main meetodi bloki lõppu). Kood ei tohiks olla main meetodi sees, samuti ei tohiks see olla väljaspool klassi definitsiooni.
 +
 
 +
 
 +
Lisaks peate koodifaili üles esimestele ridadele (kui teil on "package ..." rida, siis peale seda) enne "public class ..." rida kirjutama sellise rea:
 +
<pre>
 +
import java.util.Scanner;
 +
</pre>
 +
See rida ütleb, et vastava objekti kirjeldus laetakse teie programmi. Kui seda rida pole, siis Scanner objekti kasutada ei saa. Eclipse'i oskab selle importimise automaatselt ka teha, kui proovite quick-fix valikut tekkiva vea juures. Täpsemalt importimisest räägime järgmistes loengutes.
 +
 
 +
Funktsioon, mis prindib välja lauaseisu (nime võita vabalt valida).
 +
 
 +
main funktsioonis pange kõik jupid omavahel kokku.
 +
 
 +
Põhiosa nõuded:
 +
* Kui kasutaja sisend oli ebakorrektne (näiteks polnud number või on liiga suur number (100) vms), antakse sellest kasutajale teada ja küsitakse uut sisendit.
 +
* Kui kasutaja poolt sisestatud ruut on juba hõivatud, antakse sellest kasutajale teada ja küsitakse uut sisendit.
 +
* Programm võimaldab käike käia kordamööda. Üks mängija ei saa kahte käiku järjest teha.
 +
* Peale igat käiku kuvatakse mängulaua seis.
 +
* Programm tuvastab, kui mäng on läbi (kõik ruudud on täis - kuhugi enam käia ei saa), ja annab vastava teate.
 +
* Arvuti käik võib olla suvaline (kasvõi esimene vaba koht).
 +
 
 +
== Lisa: arvuti eelistatud käigud - 1p ==
  
 
Arvuti eelistab käike:
 
Arvuti eelistab käike:
 
* kõigepeal keskele
 
* kõigepeal keskele
* siis nurkadesse
+
* siis nurkadesse (juhslik (''random'') valik vabadest nurkadest)
* ülejäänud
+
* ülejäänud (juhslik (''random'') valik vabadest ruutudest)
 +
 
 +
Selleks täiendada '''makeMove''' meetodit vastavalt.
 +
 
 +
== Lisa: võitja tuvastamine - 1p ==
  
 
Programm suudab tuvastada, et mäng on lõppenud - kumbki mängijatest on 3-märki ritta saanud. Teatab mängu võitja.
 
Programm suudab tuvastada, et mäng on lõppenud - kumbki mängijatest on 3-märki ritta saanud. Teatab mängu võitja.
  
== II lisaosa - 3p ==
+
Selleks kirjutada funktsioon '''checkWin''', mis saab sisendiks mängulaua seisu ja tagastab võitja, kui ühel mängijatest on kolm nuppu reas, või 0, kui kumbki mängija ei ole võitnud (mäng läheb edasi).
 +
 
 +
<pre>
 +
/**
 +
* Checks the board and returns which player
 +
* has winning combination.
 +
* @param board The current state of the board
 +
* @return The indicator of the player who has winning combination.
 +
* If there are no winning combinations, 0 is returned.
 +
*/
 +
public static int checkWin(int[] board) {
 +
// your code here ...
 +
}
 +
</pre>
 +
 
 +
== Lisa: võidukäik - 3p ==
  
 
* Arvuti käib mängu võitva käigu, kui selline laual leidub: arvutil on kaks märki juba reas ja arvuti kord on käia.
 
* Arvuti käib mängu võitva käigu, kui selline laual leidub: arvutil on kaks märki juba reas ja arvuti kord on käia.
132. rida: 174. rida:
  
 
== Lisamaterjale ==
 
== Lisamaterjale ==
* [http://dl.dropbox.com/u/6838568/p42-gordon.pdf A general algorithm for tic-tac-toe board evaluation]
+
* [http://rowdy.msudenver.edu/~gordona/cs1050/progs/tictactoermccsc.pdf A general algorithm for tic-tac-toe board evaluation]

Viimane redaktsioon: 11. september 2014, kell 12:13

Tagasi ITI0011 lehele.

Üldine

Programmikood tuleb kirjutada selliselt, et checkstyle plugin Eclipse'is ei näita vigu.

Tähtaeg: 22. - 26. september (vastavalt rühma tunnile)
Enne seda nädalat esitamine annab +1 lisapunkti.

Tuleb programmeerida Trips-Traps-Trulli mängimiseks käsurea programm ning kasutaja vastu mängiva arvuti strateegia.

Kuna kasutame ülesande testimiseks automaatseid teste, siis oleme ette andnud täpsed funktsioonide nimed. Kui teil jääb midagi arusaamatuks, küsige!

Põhiosa - 5p

Programm kuvab mängulaua ja võimaldab kasutajal mängida arvutiga.

Arvuti mängib "O"-idega, kasutaja "X"-idega.

Näiteks:

+---+---+---+
| O | O |   |
+---+---+---+
|   | X |   |
+---+---+---+
|   |   |   |
+---+---+---+

Kasutaja sisestab käigud mänguruutude indeksitena järgmiselt:

+---+---+---+
| 1 | 2 | 3 |
+---+---+---+
| 4 | 5 | 6 |
+---+---+---+
| 7 | 8 | 9 |
+---+---+---+

Seega, kui kasutaja sisestab "5", siis märgitakse "X" keskmisele ruudule.

Programmi struktuur

Programm peab olema klassis nimega TicTacToe:

public class TicTacToe

Ülesande lahendamisel kasutage laua seisu hoidmiseks ühemõõtmelist massiivi, kus iga ruudu jaoks on üks täisarvuline element. Elemendi väärtus tähistab seda, mis selles ruudus on: 0 - ruut on tühi, 1 - ruudul on kasutaja nupp ("X"), -1 - ruudul on arvuti nupp ("O").

Programm peab sisaldama järgmisi meetodeid (funktsioone):

Funktsioon makeMove, millele antakse ette laua praegune seis ja ta tagastab arvuti ("O") käigu (lauaruudu indeksi). Sisendina antud massiivis esinevad vaid lubatud väärtused (-1, 0, 1 - vastavalt arvuti nupp, tühi ruut, mängija nupp), ehk siis sisendit kontrollima ei pea.

	/**
	 * Takes the current state of the board
	 * and returns the cell index where computer
	 * makes its move.
	 *
	 * The one-dimensional board is indexed as follows:
	 *
	 * +---+---+---+
	 * | 0 | 1 | 2 |
	 * +---+---+---+
	 * | 3 | 4 | 5 |
	 * +---+---+---+
	 * | 6 | 7 | 8 |
	 * +---+---+---+
	 *
	 * So, the following state:
	 *
	 * +---+---+---+
	 * | X |   |   |
	 * +---+---+---+
	 * |   | O | X |
	 * +---+---+---+
	 * |   |   |   |
	 * +---+---+---+
	 *
	 * is given as an array:
	 * {1, 0, 0, 0, -1, 1, 0, 0, 0}
	 * where 1 indicates a player stone ("X") and
	 * -1 indicates a computer stone ("O")
	 *
	 * @param board Current state of the board.
	 * See the description of the method for more information.
	 * @return Cell index where the computer makes its move.
	 */
	public static int makeMove(int[] board) {
		// your code here
	}


Funktsioon readInput, mis loeb klaviatuurilt mängija sisendi ja tagastab saadud numbri. See funktsioon on suures osas teile ette antud. Te peate seda natuke muutma, et ta töötaks õigesti (sisendilugemise osa on korrektne).

	/**
	 * Text scanner which is used in readInput().
	 * We declare it here as a separate variable
	 * in order to avoid warnings about not closing it.
	 */
	private static Scanner scanner = new Scanner(System.in);

	/**
	 * Reads a number from the standard input and returns it.
	 * Beware: this method needs some improvements!
	 * @return Number read from the input
	 */
	public static int readInput() {
		if (scanner.hasNextInt()) { // if number
			int nr = scanner.nextInt(); // let's read it
		}
		scanner.nextLine(); // read the rest of the line
		return 0;
	}

Ülaltoodud kood peaks minema class'i bloki sisse (näiteks peale main meetodi bloki lõppu). Kood ei tohiks olla main meetodi sees, samuti ei tohiks see olla väljaspool klassi definitsiooni.


Lisaks peate koodifaili üles esimestele ridadele (kui teil on "package ..." rida, siis peale seda) enne "public class ..." rida kirjutama sellise rea:

import java.util.Scanner;

See rida ütleb, et vastava objekti kirjeldus laetakse teie programmi. Kui seda rida pole, siis Scanner objekti kasutada ei saa. Eclipse'i oskab selle importimise automaatselt ka teha, kui proovite quick-fix valikut tekkiva vea juures. Täpsemalt importimisest räägime järgmistes loengutes.

Funktsioon, mis prindib välja lauaseisu (nime võita vabalt valida).

main funktsioonis pange kõik jupid omavahel kokku.

Põhiosa nõuded:

  • Kui kasutaja sisend oli ebakorrektne (näiteks polnud number või on liiga suur number (100) vms), antakse sellest kasutajale teada ja küsitakse uut sisendit.
  • Kui kasutaja poolt sisestatud ruut on juba hõivatud, antakse sellest kasutajale teada ja küsitakse uut sisendit.
  • Programm võimaldab käike käia kordamööda. Üks mängija ei saa kahte käiku järjest teha.
  • Peale igat käiku kuvatakse mängulaua seis.
  • Programm tuvastab, kui mäng on läbi (kõik ruudud on täis - kuhugi enam käia ei saa), ja annab vastava teate.
  • Arvuti käik võib olla suvaline (kasvõi esimene vaba koht).

Lisa: arvuti eelistatud käigud - 1p

Arvuti eelistab käike:

  • kõigepeal keskele
  • siis nurkadesse (juhslik (random) valik vabadest nurkadest)
  • ülejäänud (juhslik (random) valik vabadest ruutudest)

Selleks täiendada makeMove meetodit vastavalt.

Lisa: võitja tuvastamine - 1p

Programm suudab tuvastada, et mäng on lõppenud - kumbki mängijatest on 3-märki ritta saanud. Teatab mängu võitja.

Selleks kirjutada funktsioon checkWin, mis saab sisendiks mängulaua seisu ja tagastab võitja, kui ühel mängijatest on kolm nuppu reas, või 0, kui kumbki mängija ei ole võitnud (mäng läheb edasi).

	/**
	 * Checks the board and returns which player
	 * has winning combination.
	 * @param board The current state of the board
	 * @return The indicator of the player who has winning combination.
	 * If there are no winning combinations, 0 is returned.
	 */
	public static int checkWin(int[] board) {
		// your code here ...
	}

Lisa: võidukäik - 3p

  • Arvuti käib mängu võitva käigu, kui selline laual leidub: arvutil on kaks märki juba reas ja arvuti kord on käia.
  • Sarnaselt suudab arvuti blokeerida Kasutaja võitvat käiku: kasutajal on kaks märki juba reas, aga arvuti kord on käia.

Lisamaterjale