#java #sorting
#java #сортировка
Вопрос:
мне нужно отсортировать мои угаданные буквы в алфавитном порядке. я знаю, что мне нужно использовать array.sort, но я не могу понять, как. мне также нужно сделать так, чтобы программа спрашивала, хотите ли вы снова поиграть после окончания игры, и я пытался заставить это работать, но, похоже, у меня не получается. пожалуйста, помогите. Спасибо
import java.io.BufferedReader;
import java.util.Arrays;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Random;
public class DRMproject2
{
public static void main( String[] args )
{
HangmanSession hangmanSession = new HangmanSession();
hangmanSession.play();
}
}
class HangmanSession
{
private Player player;
private Words secretWord;
private LetterBox letterBox;
private int wrongGuessCount = 6;
public HangmanSession()
{
player = new Player();
player.askName();
secretWord = new Words();
letterBox = new LetterBox();
}
private void printState()
{
letterBox.print();
System.out.print( "Hidden word : " );
secretWord.print();
System.out.print( "Tries left: " wrongGuessCount "nguess letter: " );
}
public void play()
{
boolean bool = true;
while( true )
{
bool = true;
printState();
char ch = player.guess();
if( letterBox.contains( ch ) ) {
System.out.println( "Try again, you've already used the letter " ch );
bool = false;
}
if( bool )
{
if( secretWord.guess( ch ) )
{
System.out.println( "You have found the letter " ch );
}
else {
wrongGuessCount--;
}
if( wrongGuessCount < 1 )
lose();
if( secretWord.found() )
win();
}
}
}
public void win()
{
System.out.println( "Congratulations " player ", you win!" );
System.exit( 0 );
}
public void lose()
{
System.out.println( "Sorry " player ", you lose. Better luck next time!" );
System.exit( 0 );
}
}
class Words
{
private String fv;
private StringBuffer pv;
private int found = 0;
{
String Words[] = new String[23];
Words[0] = "carbon";
Words[1] = "dictionary";
Words[2] = "restaurant";
Words[3] = "television";
Words[4] = "responsible";
Words[5] = "technology";
Words[6] = "computer";
Words[7] = "communicate";
Words[8] = "automobile";
Words[9] = "coffee";
Words[10] = "federation";
Words[11] = "exaggerate";
Words[12] = "cappuccino";
Words[13] = "macintosh";
Words[14] = "apple";
Words[15] = "microsoft";
Words[16] = "lighter";
Words[17] = "shark";
Words[18] = "bunker";
Words[19] = "argument";
Words[20] = "playstation";
Words[21] = "parrot";
Words[22] = "canine";
Random random = new Random();
int randomWord = random.nextInt(22);
String[] displayLetters = new String[Words[randomWord].length()];
fv = Words[randomWord];
pv = new StringBuffer(fv.length());
for (int i = 0; i < displayLetters.length; i )
{
displayLetters[i] = "_";
pv.append('_');
}
}
public boolean found()
{
System.out.println( "Letters found:" found "/" fv.length() );
return ( found == fv.length() );
}
public boolean guess( char c )
{
int index = fv.indexOf( c );
if( index == -1 )
return false;
else {
found = found findOccurances( c );
return true;
}
}
private int findOccurances( char c )
{
int idx = fv.indexOf( c );
pv.setCharAt( idx, fv.charAt( idx ) );
int counter = 1;
while( idx != -1 ) {
int index = fv.indexOf( c, idx 1 );
idx = index;
if( idx != -1 ) {
counter ;
pv.setCharAt( idx, fv.charAt( idx ) );
}
}
return counter;
}
public void print()
{
System.out.println( pv );
}
}
class Player
{
private String name = " ";
public void askName()
{
System.out.println("Welcome to Hangman");
System.out.print( "Player, enter your name: " );
name = input();
}
public char guess()
{
return input().charAt( 0 );
}
private String input()
{
String str = " ";
BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
try
{
str = br.readLine();
}
catch( IOException ex )
{
ex.printStackTrace();
}
return str;
}
public String toString()
{
return name;
}
}
class LetterBox
{
private char[] lbox = new char[24];
private int counter = 0;
public boolean contains( char c )
{
for( int i = 0; i < counter; i )
{
if( lbox[i] == c )
return true;
}
lbox[counter] = c;
counter ;
return false;
}
public void print()
{
System.out.print( "LetterBox: " );
for( int i = 0; i < counter; i )
{
System.out.print( lbox[i] );
}
System.out.println( " " );
}
Комментарии:
1. Я не вижу никаких ссылок на Array.sort в вашем коде …? Что касается повторяющихся игр, как насчет цикла в вашем основном методе, который неоднократно создает новый сеанс, воспроизводит его, а затем спрашивает, хотите ли вы сыграть снова?
2. я не мог понять, куда поместить массивы.sort в коде, чтобы он сортировал угаданные буквы
3. @user вы бы просто поместили это сразу после добавления нового символа. Кроме того, как уже говорилось, предпочтительнее было бы использовать отсортированную структуру данных, подобную
SortedSet
.
Ответ №1:
Чтобы возобновить работу программы и поиграть в другую игру, вы не должны вызывать это в win()
или lose()
: System.exit( 0 );
Вместо этого используйте цикл и спросите пользователя, что он хочет сделать, например, play again
или exit
. Для play again
сбросьте состояние игры и запустите новый запуск.
Чтобы отсортировать массив символов, просто вызовите Arrays.sort(lbox)
. Однако это может вывести unitialized на передний план. Вместо этого вы могли бы захотеть использовать a, SortedSet<Character>
который уже предоставляет contains
метод и сортировал бы символы в их естественном порядке (обратите внимание на использование class Character
, а не примитива здесь, хотя через автоматическую (un) упаковку вы также должны иметь возможность передавать примитивы, просто не в объявлении).
Ответ №2:
Не уверен, что вы имели в виду под сортировкой массива, но использование array.sort отсортирует массив, эта ссылка может пролить некоторый свет на это.
http://www.rgagnon.com/javadetails/java-0343.html
Что касается повторного воспроизведения, вам нужно изменить свой метод win, чтобы спросить пользователя, хочет ли он снова сыграть, проверьте входные данные, а затем, если они действительно захотят сыграть снова, вы сможете снова вызвать play ().
public void win() {
System.out.println( "Congratulations " player ", you win!" );
ask to play again
get input
check input
if want to play again
play()
else
exit
}
Комментарии:
1. Я бы не стал указывать это на
win()
. Как насчет того, чтобы сделать еще одну попытку после проигрыша? 😉2. Совершенно верно, я не думал этим утром :), вы могли бы поместить этот код в метод завершения игры, который отображал бы ваш выигрыш или проигрыш, а затем проверить, хотите ли вы играть снова.
Ответ №3:
вот ваш почтовый ящик, имплицирующий
class LetterBox {
private SortedSet<Byte> data = new TreeSet<Byte>();
public int getSize() {
return data.size();
}
public void add(char c) {
data.add(Byte.valueOf((byte) c));
}
public boolean contains(char c) {
return data.contains(Byte.valueOf((byte) c));
}
public void print() {
System.out.print("LetterBox: ");
for (Byte _char : data) {
System.out.print(((char) _char.byteValue()));
}
System.out.println(" ");
}
}