Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

NB: WORK IN PROGRESS

 

Excerpt

Dette eksemplet handler om ConnectFour-spillet med en tydelig oppdeling i klasser for brett og spill-logikk.

...

Oppgavebeskrivelse

For å beregne omkretsen og arealet til en sirkel må objektet ihvertfall vite om radiusen. Hvis objektet også skal kunne vises som grafikk, vil en også trenge posisjon, men dette utelater vi her.

...

I tillegg er det greit å lage en passende toString()-metode og et hovedprogram, slik at en kan sjekke at oppførselen stemmer med spesifikasjonen, altså beskrivelsen over.

JExercise-testkode for denne oppgaven finner du her: stateandbehavior/CircleTest.java.

Eksempelløsning

...

Klassen lagrer radiusen i et attributt (kalt felt i Java) av typen double. Dette feltet initialiseres av konstruktøren, som tar inn et double-argumentet og setter radius-feltet til denne verdien. Her brukes this.radius for å referere til attributtet (og "hoppe over" argumentet) og kun radius for å referere til argumentet.

...

Code Block
package connectfour;

public class Piece {

	private char value;

	public Piece(char value) {
		this.value = value;
	}

	public char getValue() {
		return value;
	}

	public void setValue(char value) {
		this.value = value;
	}

	public String toString() {
		return "" + getValue();
	}
}

something here

Code Block
package connectfour;


import java.util.ArrayList;

public class ConnectFour {
	private ArrayList<ArrayList<Piece>> board;
	private char player;

	public ConnectFour() {
		board = new ArrayList<ArrayList<Piece>>();
		for (int r = 0; r < 7; r++) {
			board.add(new ArrayList<Piece>());
			for (int c = 0; c < 7; c++) {
				board.get(r).add(new Piece(' '));
			}
		}
		player = 'o';
	}


	public Piece getPiece(int r, int c) {
		return board.get(r).get(c);
	}


	public void setPiece(int r, int c, Piece piece) {
		board.get(r).set(c, piece);
	}

	public boolean drop(int c) {
		if (getPiece(0, c).getValue() != ' ') {
			return false;
		} else {
			for (int r = 6; r >= 0; r--) {
				if (getPiece(r, c).getValue() == ' ') {
					setPiece(r, c, new Piece(player));
					return true;
				}
			}
			return true;
		}
	}

	public boolean hasWon() {
		for (int r = 0; r < 7; r++) {
			for (int c = 0; c < 7; c++) {
				if (getPiece(r,c).getValue() != ' ' && hasWonFromPosition(r,c)) {
					return true;
				}
			}
		}
		return false;
	}

	private boolean hasWonFromPosition(int r, int c) {
		for (int dr = -1; dr <= 1; dr++) {
			for (int dc = -1; dc <= 1; dc++) {
				if (dr != 0 || dc != 0) {
					if (hasWonFromPositionWithDirection(r,c,getPiece(r,c), dr, dc)) {
						return true;
					}
				}
			}
		}
		return false;
	}

	private boolean hasWonFromPositionWithDirection(int r, int c, Piece piece, int dr, int dc) {
		int counter = 0;
		while (0 <= r && r < 7 && 0 <= c && c < 7 && getPiece(r, c).getValue() == piece.getValue()) {
			r += dr;
			c += dc;
			counter++;
		}
		return counter >= 4;
	}


	public char getPlayer() {
		return player;
	}

	public void changePlayer() {
		if (player == 'o') {
			player = 'x';
		} else {
			player = 'o';
		}
	}

	public String toString() {
		String str = "";
		for (int r = 0; r < 7; r++) {
			str += "| ";
			for (int c = 0; c < 7; c++) {
				str += getPiece(r, c) + " ";
			}
			str += "|\n";
		}
		return str;
	}
}

something here

Code Block
package connectfour;


import java.util.Scanner;

public class ConnectFourProgram {

	ConnectFour cf;


	public void init() {
		cf = new ConnectFour();
	}

	public void run() {
		Scanner scanner = new Scanner(System.in);
		while (! cf.hasWon()) {
			System.out.println(cf);
			System.out.println("Player " + cf.getPlayer() + ", enter index of column to drop next piece: ");
			int c = scanner.nextInt();
			if (cf.drop(c) && ! cf.hasWon()) {
				cf.changePlayer();
			}
		}
		System.out.println(cf);
		System.out.println("Congratulations player " + cf.getPlayer() + "! You have won the game.");
	}

	public static void main(String[] args) {
		ConnectFourProgram cfp = new ConnectFourProgram();
		cfp.init();
		cfp.run();
	}
}

...