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);
}