四胜玩家vs电脑

时间:2019-02-05 16:54:59

标签: java random

Hello Stack溢出社区, Iam在应用计算的第一学期学习,必须用Java编写游戏的四胜制。我的游戏已经有2位玩家可以使用控制台互相对抗。但是我还需要一个随机数生成器来与在控制台上提供命令的人员进行对抗。我试图给Player 2一个rng选项,但是没有成功。我希望你们能帮助我。我试图用英语翻译我的程序,希望它可以理解。谢谢您的帮助

public class FourWins {
	static String Player; 
	/**
	 * @param args -> unused
	 */
	public static void main(String[] args) {
		int columns, rows, zaehler = 0, eingabe;
		String player1, player2;
		char zeichen;
		char[][] spielfeld;
		
		//asking Player Names
		player1 = eingabeString("Name from Player A: ");
		
		do {
			player2 = eingabeString("Name from Player B: ");
		} while(player1.equals(player2)); //ask again when Names are the same
		//ask dimensions
		do {
			columns = eingabeInt("width of the matchfield (atleast 4): ");
		} while (columns < 4); //ask again when matchfield is to small
		do {
			rows = eingabeInt("high of the matchfield (atleast 4): ");
		} while (rows < 4); //ask again when matchfield is to small
		spielfeld = new char[rows][columns];
		while (zaehler < columns*rows) {
			zeichen = (zaehler % 2 == 0) ? 'o' : '+';
			SPIELER = (zaehler % 2 == 0) ? player1 : player2;
			showSpielfeld(spielfeld);
			eingabe = eingabeInt("\n" + SPIELER + "(" + zeichen
					+ ") is on the move. Please insert the column: ");
			if (eingabe > columns || eingabe < 1)
				System.err.println("Field doesnt exist.. Please try again!");
			else {
				zaehler++; // next one please
				setzeFeld(spielfeld, eingabe, zeichen);
			}
		}
		showSpielfeld(spielfeld);
		System.err.println("draw!");
	}
	/**
	 * @param text -> screen input
	 * @return -> keyboard input
	 */
	static int eingabeInt(String text) {
		System.out.print(text);
		java.util.Scanner input = new java.util.Scanner(System.in);
		return input.nextInt();
	}
	/**
	 * @param text -> screen output
	 * @return -> keyboard input
	 */
	static String eingabeString(String text) {
		System.out.print(text);
		java.util.Scanner input = new java.util.Scanner(System.in);
		return input.next();
	}
	/**
	 * Column is passed and the field is set
	 * @param spielfeld -> The playing field with all required data
	 * @param column -> entered column
	 * @param zeichen -> each player has a sign (*) or (+)
	 */
	static void setzeFeld(char[][] spielfeld, int column, char zeichen) {
		column--; // Because the common man thinks the number range would range from 1 to 4
		int pos2check;
		if (spielfeld[0][column] != '\0')
			System.err.println("The series is full .. bad luck!");
		else
			for (int i = 0; i < spielfeld.length; i++) { //Iterate through the lines
				if (i + 1 == spielfeld.length) {
					// After the last line nothing comes ..
					// so may be written in the current box, although in the
					// nothing stands next
					pos2check = i;
					if (spielfeld[pos2check][column] == '\0') {
						spielfeld[i][column] = zeichen;
						if(IsGameOver(spielfeld, i, column, zeichen)) {// Did somebody win ?
							System.out.println("Player with"+zeichen+" has won");
							System.exit(0);
						}
						break;
					}
				} else {
					//check the following field
					pos2check = i+1;
					if (spielfeld[pos2check][column] != '\0') {
						spielfeld[i][column] = zeichen;
						if(IsGameOver(spielfeld, i, column, zeichen)) {// Did somebody win ?
							System.out.println("Player with "+zeichen+" has won");
							System.exit(0);
						}
						break;
					}
				}
			}
	}
	/**
	 * Collection point for the functions that check whether jmd won
	 * @param spielfeld -> The playing field with all required data
	 * @param column -> the column at which the character was set
	 * @param row -> the row at which the character was set
	 * @param zeichen -> the sign
	 */
	static boolean IsGameOver(char[][] spielfeld, int column, int row, char zeichen) {
		boolean b1 = GameIsOver_row(spielfeld, column, row, zeichen);
		boolean b2 = GameIsOver_column(spielfeld, column, row, zeichen);
		boolean b3 = GameIsOver_straight1(spielfeld, column, row, zeichen);
		boolean b4 = GameIsOver_straight2(spielfeld, column, row, zeichen);
		
		return (b1||b2||b3||b4);
	}
	static boolean GameIsOver_row(char[][] spielfeld, int column, int row, char zeichen) {
		// to the left
		int go = row - 1; // start with the point left above the set
		int i = 1; // the set point = 1 hits
		while (go >= 0) {
			if (spielfeld[column][go] != zeichen)
				break;
			go--;
			i++;
		}
		// to the right
		go = row + 1;
		while (go < spielfeld.length) {
			if (spielfeld[column][go] != zeichen)
				break;
			go++;
			i++;
		}
		return (i > 3);
	}
	static boolean GameIsOver_column(char[][] spielfeld, int column, int row, char zeichen) {
		// up
		int go = column - 1;
		int i = 1;
		while (go >= 0) {
			if (spielfeld[go][row] != zeichen)
				break;
			go--;
			i++;
		}
		// down
		go = column + 1;
		while (go < spielfeld.length) {
			if (spielfeld[go][row] != zeichen)
				break;
			go++;
			i++;
		}
		return (i > 3);
	}
	static boolean GameIsOver_straight1(char[][] spielfeld, int column, int row, char zeichen) {
		// top left
		int go = row - 1;
		int go2 = column - 1;
		int i = 1;
		while (go >= 0 && go2 >= 0) {
			if (spielfeld[go2][go] != zeichen)
				break;
			go--;
			go2--;
			i++;
		}
		// down right
		go = row + 1;
		go2 = column + 1;
		while (go < spielfeld[0].length && go2 < spielfeld.length) {
			if (spielfeld[go2][go] != zeichen)
				break;
			go++;
			go2++;
			i++;
		}
		return (i > 3);
	}
	static boolean GameIsOver_straight2(char[][] spielfeld, int column, int row, char zeichen) {
		// down left
		int go = row - 1;
		int go2 = column + 1;
		int i = 1;
		while (go >= 0 && go2 < spielfeld.length) {
			if (spielfeld[go2][go] != zeichen)
				break;
			go--;
			go2++;
			i++;
		}
		// up right
		go = row + 1;
		go2 = column - 1;
		while (go < spielfeld[0].length && go2 >= 0) {
			if (spielfeld[go2][go] != zeichen)
				break;
			go++;
			go2--;
			i++;
		}
		return (i > 3);
	}
	/**
	 * Cancels the program and delivers the winner
	 * @param spielfeld -> The playing field with all required data
	 */
	static void spielFertig(char[][] spielfeld) {
		showSpielfeld(spielfeld);
		System.out.println(SPIELER + " has won\n");
		System.exit(1);
	}
	/**
	 * Shows the complete playing field on the screen
	 * @param spielfeld -> The playing field with all required data
	 */
	static void showSpielfeld(char[][] spielfeld) {
		StringBuffer Geruest = new StringBuffer(); 
		StringBuffer row_start = new StringBuffer(" "); // first row 1 2 3 4
		StringBuffer row_divide = new StringBuffer("|"); // dividing line |-----|
		StringBuffer row_end = new StringBuffer("-"); // last row -------
		if (spielfeld[0].length > 9) {
			for (int i = 1; i <= spielfeld[0].length; i++)
				row_start.append((i/10==0) ? " " : i/10).append(" ");
			row_start.append("\n ");
		}
		for (int i = 1; i <= spielfeld[0].length; i++) {
			row_start.append(i%10).append(" ");
			row_divide.append((i==spielfeld[0].length)? "-|" : "--");
			row_end.append("--");
		}
		System.out.println(row_start);
		System.out.println(row_divide);
		for (char[] arrZeile : spielfeld) { //iterate through all lines
			for (char arrSpalte : arrZeile) { //iterate through all columns
				Geruest.append("|");
				Geruest.append((arrSpalte == '\0') ? ' ' : arrSpalte);
			}
			Geruest.append("|\n");
		}
		Geruest.append(row_end).append("\n");
		System.out.println(Geruest);
	}
}


// Original Code not translate (if there is any mistake)


public class VierGewinnt {
	static String SPIELER; // der aktuelle Spielername -> für die Gewinner Ausgabe
	/**
	 * @param args -> unbenutzt
	 */
	public static void main(String[] args) {
		int columns, rows, zaehler = 0, eingabe;
		String player1, player2;
		char zeichen;
		char[][] spielfeld;
		
		//Abfragen des Spielernamens
		player1 = eingabeString("Name von Spieler A: ");
		
		do {
			player2 = eingabeString("Name von Spieler B: ");
		} while(player1.equals(player2)); //Frage erneut, wenn die Spielernamen gleich sind
		//Abfragen der Maße
		do {
			columns = eingabeInt("Breite des Spielfeldes (mindestens 4): ");
		} while (columns < 4); //Frage erneut, wenn die Breite zu klein gewählt wurde
		do {
			rows = eingabeInt("Hoehe des Spielfeldes (mindestens 4): ");
		} while (rows < 4); //Frage erneut, wenn die Höhe zu klein gewählt wurde
		spielfeld = new char[rows][columns];
		while (zaehler < columns*rows) {
			zeichen = (zaehler % 2 == 0) ? 'o' : '+';
			SPIELER = (zaehler % 2 == 0) ? player1 : player2;
			showSpielfeld(spielfeld);
			eingabe = eingabeInt("\n" + SPIELER + "(" + zeichen
					+ ") ist am Zug. Bitte gib die Spalte ein: ");
			if (eingabe > columns || eingabe < 1)
				System.err.println("Feld existriert nicht.. Bitte versuch es nochmal!");
			else {
				zaehler++; // naechster Bitte
				setzeFeld(spielfeld, eingabe, zeichen);
			}
		}
		showSpielfeld(spielfeld);
		System.err.println("Unentschieden!");
	}
	/**
	 * @param text -> Bildschirmausgabe
	 * @return -> Tastatureingabe
	 */
	static int eingabeInt(String text) {
		System.out.print(text);
		java.util.Scanner input = new java.util.Scanner(System.in);
		return input.nextInt();
	}
	/**
	 * @param text -> Bildschirmausgabe
	 * @return -> Tastatureingabe
	 */
	static String eingabeString(String text) {
		System.out.print(text);
		java.util.Scanner input = new java.util.Scanner(System.in);
		return input.next();
	}
	/**
	 * Spalte wird übergeben und das Feld wird gesetzt
	 * @param spielfeld -> Das Spielfeld mit allen benötigten Daten
	 * @param column -> eingegebene Spalte
	 * @param zeichen -> jeder Spieler hat ein Zeichen (*) oder (+)
	 */
	static void setzeFeld(char[][] spielfeld, int column, char zeichen) {
		column--; // Weil der gemeine Mensch denkt, der Zahlenbereich würde sich von 1 bis 4 erstrecken
		int pos2check;
		if (spielfeld[0][column] != '\0')
			System.err.println("Die Reihe ist voll.. Pech!");
		else
			for (int i = 0; i < spielfeld.length; i++) { //Iteriere durch die Zeilen
				if (i + 1 == spielfeld.length) {
					// Nach der letzten Zeile kommt nichts mehr..
					// also darf in das aktuelle Kästchen geschrieben werden, obwohl im
					// nächsten nichts steht
					pos2check = i;
					if (spielfeld[pos2check][column] == '\0') {
						spielfeld[i][column] = zeichen;
						if(IsGameOver(spielfeld, i, column, zeichen)) {// Hat jmd gewonnen?
							System.out.println("Spieler mit "+zeichen+" hat gewonnen");
							System.exit(0);
						}
						break;
					}
				} else {
					//Überprüfe immer das folgende Feld
					pos2check = i+1;
					if (spielfeld[pos2check][column] != '\0') {
						spielfeld[i][column] = zeichen;
						if(IsGameOver(spielfeld, i, column, zeichen)) {// Hat jmd gewonnen?
							System.out.println("Spieler mit "+zeichen+" hat gewonnen");
							System.exit(0);
						}
						break;
					}
				}
			}
	}
	/**
	 * Sammelstelle für die Funktionen, die überprüfen ob jmd. gewonnen hat
	 * @param spielfeld -> Das Spielfeld mit allen benötigten Daten 
	 * @param column -> die Spalte an der das Zeichen gesetzt wurde
	 * @param row -> die Reihe an der das Zeichen gesetzt wurde
	 * @param zeichen -> das Zeichen
	 */
	static boolean IsGameOver(char[][] spielfeld, int column, int row, char zeichen) {
		boolean b1 = GameIsOver_row(spielfeld, column, row, zeichen);
		boolean b2 = GameIsOver_column(spielfeld, column, row, zeichen);
		boolean b3 = GameIsOver_straight1(spielfeld, column, row, zeichen);
		boolean b4 = GameIsOver_straight2(spielfeld, column, row, zeichen);
		
		return (b1||b2||b3||b4);
	}
	static boolean GameIsOver_row(char[][] spielfeld, int column, int row, char zeichen) {
		// nach links
		int go = row - 1; // mit dem Punkt links neber dem gesetzten beginne
							// ich
		int i = 1; // der gesetzte Punkt = 1 Treffer
		while (go >= 0) {
			if (spielfeld[column][go] != zeichen)
				break;
			go--;
			i++;
		}
		// nach rechts
		go = row + 1;
		while (go < spielfeld.length) {
			if (spielfeld[column][go] != zeichen)
				break;
			go++;
			i++;
		}
		return (i > 3);
	}
	static boolean GameIsOver_column(char[][] spielfeld, int column, int row, char zeichen) {
		// nach oben
		int go = column - 1;
		int i = 1;
		while (go >= 0) {
			if (spielfeld[go][row] != zeichen)
				break;
			go--;
			i++;
		}
		// nach unten
		go = column + 1;
		while (go < spielfeld.length) {
			if (spielfeld[go][row] != zeichen)
				break;
			go++;
			i++;
		}
		return (i > 3);
	}
	static boolean GameIsOver_straight1(char[][] spielfeld, int column, int row, char zeichen) {
		// nach links oben
		int go = row - 1;
		int go2 = column - 1;
		int i = 1;
		while (go >= 0 && go2 >= 0) {
			if (spielfeld[go2][go] != zeichen)
				break;
			go--;
			go2--;
			i++;
		}
		// nach rechts unten
		go = row + 1;
		go2 = column + 1;
		while (go < spielfeld[0].length && go2 < spielfeld.length) {
			if (spielfeld[go2][go] != zeichen)
				break;
			go++;
			go2++;
			i++;
		}
		return (i > 3);
	}
	static boolean GameIsOver_straight2(char[][] spielfeld, int column, int row, char zeichen) {
		// nach links unten
		int go = row - 1;
		int go2 = column + 1;
		int i = 1;
		while (go >= 0 && go2 < spielfeld.length) {
			if (spielfeld[go2][go] != zeichen)
				break;
			go--;
			go2++;
			i++;
		}
		// nach rechts oben
		go = row + 1;
		go2 = column - 1;
		while (go < spielfeld[0].length && go2 >= 0) {
			if (spielfeld[go2][go] != zeichen)
				break;
			go++;
			go2--;
			i++;
		}
		return (i > 3);
	}
	/**
	 * Bricht das Programm ab und liefert den Gewinner 
	 * @param spielfeld -> Das Spielfeld mit allen benötigten Daten
	 */
	static void spielFertig(char[][] spielfeld) {
		showSpielfeld(spielfeld);
		System.out.println(SPIELER + " hat gewonnen\n");
		System.exit(1);
	}
	/**
	 * Zeigt das komplette Spielfeld auf dem Bildschirm
	 * @param spielfeld -> Das Spielfeld mit allen benötigten Daten
	 */
	static void showSpielfeld(char[][] spielfeld) {
		StringBuffer Geruest = new StringBuffer(); 
		StringBuffer row_start = new StringBuffer(" "); // erste Zeile 1 2 3 4
		StringBuffer row_divide = new StringBuffer("|"); // Trennzeile |-----|
		StringBuffer row_end = new StringBuffer("-"); // letzte Zeile -------
		if (spielfeld[0].length > 9) {
			for (int i = 1; i <= spielfeld[0].length; i++)
				row_start.append((i/10==0) ? " " : i/10).append(" ");
			row_start.append("\n ");
		}
		for (int i = 1; i <= spielfeld[0].length; i++) {
			row_start.append(i%10).append(" ");
			row_divide.append((i==spielfeld[0].length)? "-|" : "--");
			row_end.append("--");
		}
		System.out.println(row_start);
		System.out.println(row_divide);
		for (char[] arrZeile : spielfeld) { //iteriere durch alle Zeilen
			for (char arrSpalte : arrZeile) { //iteriere durch alle Spalten
				Geruest.append("|");
				Geruest.append((arrSpalte == '\0') ? ' ' : arrSpalte);
			}
			Geruest.append("|\n");
		}
		Geruest.append(row_end).append("\n");
		System.out.println(Geruest);
	}
	public static int randomOneToSeven() {
        return (int) (Math.random()*((7-1)+1)+1);
    }
}

// random number generator i tried for player 2

public static int randomOneToSeven() {
        return (int) (Math.random()*((7-1)+1)+1);
    }

0 个答案:

没有答案