I am attempting to work through a hackerrank algorithm challenge which will predict the height of a tree after a series of alternating weather patterns. I'm not sure why my logic isn't working. Java says that the break points in my switch statement are not working. I have pasted the code below in full.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int i = scan.nextInt(); // user input how many test cases
System.out.println("test cases set.");
int[] cycles = new int[i];
for (int x = 0; x < i; x++) {
cycles[x] = scan.nextInt(); // user input test cycles
}
for (int x = 0; x < i; x++) {
System.out.println(cycles[x]);
int temp = predictor(cycles[x]);
System.out.println(temp);
}
}
public static int predictor(int cycles) {
// determines the remainder to find even or odd cycle year
int heightRemainder = cycles % 2;
switch (heightRemainder) {
case 0:
System.out.println("Even number");
return cycles; // UNREACHABLE, cycles is a temp variable to check functionality
break;
case 1:
System.out.println("Odd number");
return cycles; // UNREACHABLE, same here
break;
}
return -1;
}
}
Yes, it will not work because your break statement is after return statement, execution control will not go to break statement.
Instead of returning in switch case use variable to store value of cycles and then return that variable at end of method, like this
public static int predictor(int cycles) {
// determines the remainder to find even or odd cycle year
int heightRemainder = cycles % 2;
int r=-1;
switch (heightRemainder) {
case 0:
System.out.println("Even number");
r =cycles;
break;
case 1:
System.out.println("Odd number");
r=cycles
break;
}
return r;
}
}
in the predictor method: remove the break; statement... that is dead code because you are returning the cycle values
switch (heightRemainder) {
case 0:
System.out.println("Even number");
return cycles; // UNREACHABLE, cycles is a temp variable to check functionality
case 1:
System.out.println("Odd number");
return cycles; // UNREACHABLE, same here
}
Related
My program is designed to assign an integer value based on a class size that the user inputs (S, M, L, X). Then, in a later method, I use this value to calculate the remaining seats available in the class. This issue that I'm having is that, in spite of the program running, the value returned is always zero, no matter what class size the user inputs or the number of students entered as being registered already.
The program includes a few other unrelated steps, so I've isolated the aforementioned methods for ease of reference but I can post my complete code if this is easier.
My code to assign the integer value:
public static int courseSize() {
System.out.print("Please enter the course size (possible values are:
S, M, L, or X):");
size = console.next().charAt(0);
switch(size) {
case 'S': totalSeats = 25;
break;
case 'M': totalSeats = 32;
break;
case 'L': totalSeats = 50;
break;
case 'X': totalSeats = 70;
break;
default: System.out.println("Please enter S, M, L, or X");
}//Close switch statement
console.nextLine();
return totalSeats;
}//Close courseSize
This is the code for obtaining the number of students registered and calculating the number of seats available:
public static void numStudents() {
System.out.print("How many students are currently registered for this course? ");
studentsReg = console.nextInt();
}//Close numStudents method
//This method returns the number of open seats remaining
public static int calcAvail () {
openSeats = (totalSeats - seatsTaken);
return openSeats;
} //Close calcAvail method
This is the output for collecting the user input. You can see the user entered L (50 seats) and 13 students are registered.
However, you can see in the below output that it states there are 0 remaining seats.
All of the variables in this code are declared under my class as public, static variables.
Any thoughts as to why my calculation isn't working? I'm leaning toward the issue being my switch statement because it uses a char as input and then stores it as an integer; however, the output is still printing out the correct number to the screen.
move this console.nextLine(); in numStudents()
default is missing break
default: System.out.println("Please enter S, M, L, or X");
break;
}
return totalSeats;
}
You can do
default: System.out.println("Incorrect entry");
courseSize();
break;
}
and
openSeats = (totalSeats - seatsTaken); should be
openSeats = (totalSeats - studentsReg );
I would clear the EOL character left by your call to nextInt() in your numStudents() with the following code
public static void numStudents() {
System.out.print("How many students are currently registered for this course? ");
//code A
studentsReg = console.nextInt();
console.nextLine();
//or
//code B
studentsReg = Integer.parseInt(console.nextLine());
}//Close numStudents method
Then I would wrap a while() around your switch to make sure your user has to input a valid selection or retry, and use nextLine() instead of next() which also leaves behind an EOL character ('\n').
public static int courseSize() {
boolean validInput = false;
while(!validInput)
{
validInput = true;
System.out.print("Please enter the course size (possible values are: S, M, L, or X):");
size = console.nextLine().charAt(0);
switch(size) {
case 'S': totalSeats = 25;
break;
case 'M': totalSeats = 32;
break;
case 'L': totalSeats = 50;
break;
case 'X': totalSeats = 70;
break;
default: System.out.println("Incorrect Value Entered, Please enter S, M, L, or X");
validInput = false;
break;
}//Close switch statement
}
return totalSeats;
}//Close courseSize
I'm more than 90 percent done with my code... Wanna add a few things but I've got no idea how to proceed.
This is my code so far... I have other classes as well, and I'm calling them in this code.
import java.io.IOException;
import java.util.InputMismatchException;
import java.util.Scanner;
public class SensorStatsApp extends Sensor {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
HumiditySensor hSensor = new HumiditySensor();
int sChoice = -2;
int hChoice = -2;
int seasonTemp = -2;
int humidityTemp = -2;
int iterations = -2;
while(true)
{
try {
System.out.println("What season would you like to simulate?");
System.out.println(" 1. Winter \n 2. Spring \n 3. Summer \n 4. Fall \n 5. Random \n 6. EXIT");
System.out.print("Selection: ");
sChoice = sc.nextInt(); // gathers user input for which season to simulate
System.out.println(); // adds a break from the previous question
if(sChoice == 6){
System.exit(0); // exits the program
}
System.out.println("What humidity would you like to simulate?");
System.out.println(" 1. Full Range \n 2. Low Humidity \n 3. High Humidity \n 4. Random \n 5. EXIT");
System.out.print("Selection: ");
hChoice = sc.nextInt(); // gathers user input for humidity to simulate
System.out.println(); // adds a break from previous question
if(hChoice == 5){
System.exit(0); // exits the program
}
System.out.print("Input number of simulations: ");
iterations = sc.nextInt(); // gathers user input for number of iterations
}
catch(InputMismatchException e) { // if user inputed non numeric characters
System.out.println(e + " - Error: expecting a number for input");
return; // exits the program
}
for(int i = 0; i < iterations; i++){
try {
seasonTemp = seasonToSimulate(sChoice); // sends the sChoice int to be converted
humidityTemp = humidityToSimulate(hChoice); // sends the sChoice int to be converted and processed
display(seasonTemp, humidityTemp, i); // displays the current iteration of information
}
catch(IOException e){
System.out.println(e + " - Error: user input"); // lets the user know why their sChoice failed.
return; // doesn't return anything cause the return type is void. This just ends the program.
}
}
}
}
public static void display(int sTemp, int hTemp, int iteration){
System.out.println();
System.out.println(++iteration + " Simulations:");
System.out.println("Season Temperature: " + sTemp);
System.out.println("Humidity Temperature: " + hTemp);
System.out.println();
}
public static int humidityToSimulate(int choice) throws IOException {
int temp = -2;
HumiditySensor hSensor = new HumiditySensor();
Boolean done = false; // if random another iteration through switch is needed
while(!done){ // if the user decides to use random then done != true so I can iterate one more time in the switch statement
switch(choice){ // sChoice is the season in terms of an int
case 1: { // full range, if choice is 1 it falls into this case and breaks at the statement break; (ends the current switch)
temp = hSensor.getHumidity();
done = true;
break;
}
case 2: { // low humidity, if choice is 2 it falls into this case.
temp = hSensor.getLowHumidity();
done = true;
break;
}
case 3: { // high humidity
temp = hSensor.getHighHumidity();
done = true;
break;
}
case 4: { // random
choice = (int) Math.random() * 3; // random times (3) for 3 humidity types
if(choice == 0) choice++; // 0 is a possibility but not an option
break;
}
case 5: { // exit
temp = -1; // lets the calling function know it's done
break;
}
default:
{
throw new IOException(); // user gave improper option
}
}
}
return temp;
}
public static int seasonToSimulate(int choice) throws IOException {
int temp = -1;
TemperatureSensor tSensor = new TemperatureSensor();
Boolean done = false; // if random through switch is needed
while(!done){
switch(choice) {
case 1: { // winter
temp = tSensor.getWinterTemp();
done = true;
break;
}
case 2: { // spring
temp = tSensor.getSpringTemp();
done = true;
break;
}
case 3: { // summer
temp = tSensor.getSummerTemp();
done = true;
break;
}
case 4: { // fall
temp = tSensor.getFallTemp();
done = true;
break;
}
case 5: { // random
choice = (int) Math.random() * 4;// random *(4) for 4seasons
if(choice == 0) choice++;// 0 is a possibility not an option
break;
}
case 6: { // exit
temp = -1; // lets the calling function know it's done
break;
}
default:
{
throw new IOException(); // user gave improper option
}
}
}
return temp;
}
}
How would I do the following in my program?
Each iteration should display the readings being generated for each temperature and humidity. At the end your program should display a summary of the simulation as follows:
Season: _________ (if random, then display Random:Summer for example)
1- First temperature generated
2- Last temperature generated
3- Lowest temperature generated
4- Highest temperature generated
5- Total sum of all temperatures generated
6- Average for the season
Humidity Type: _________ (if random, then display Random:Full for example)
1- First humidity reading generated
2- Last humidity reading generated
3- Lowest humidity reading generated
4- Highest humidity reading generated
5- Total sum of all humidity readings generated
6- Average humidity reading
Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
Questions asking for code must demonstrate a minimal understanding of the problem being solved. Include attempted solutions, why they didn't work, and the expected results. See also: Stack Overflow question checklist
Closed 9 years ago.
Improve this question
I'm new to stack overflow and I'm trying to help a friend with their programming homework.
So far we have this
package range;
import java.util.Arrays;
import java.util.Scanner;
public class Range
{
static int[] series = new int[100];
static int seriesLength = 0;
public static void main(String[] args)
{
Scanner t = new Scanner(System.in);
boolean run = true;
while(run)
{
int option;
System.out.println("1. Loading a range of up to 100 numbers");
System.out.println("2. Showing the range of given(loaded) numbers");
System.out.println("3. Determination of the middle value of the series");
System.out.println("4. Determination of the biggest element of the series");
System.out.println("5. Determination of the smallest element of the series\n");
System.out.println("Enter the number of the option you want (1-5), or 0 to end");
option = t.nextInt();
switch(option)
{
case 1:
{
System.out.println("Please input a number from 1 -100");
seriesLength = t.nextInt();
System.out.println(seriesLength);
if((seriesLength < 1) || (seriesLength > 100))
{
System.out.println("Invalid input, series must be between 1 and 100.\nPress any key to try again.\n");
break;
}
for(int i = 0; i < seriesLength; i++)
{
series[i] = i+1;
}
break;
}
case 2:
{
System.out.println(seriesLength);
if(seriesLength == 0)
{
System.out.println("You must first load a series of numbers\n");
break;
}
showSeries(series, seriesLength);
break;
}
case 3:
{
if(seriesLength == 0)
{
System.out.println("You must first load a series of numbers\n");
break;
}
middleNum(series, seriesLength);
break;
}
case 4:
{
if(seriesLength == 0)
{
System.out.println("You must first load a series of numbers\n");
break;
}
biggestNum(series, seriesLength);
break;
}
case 5:
{
if(seriesLength == 0)
{
System.out.println("You must first load a series of numbers\n");
break;
}
smallestNum(series, seriesLength);
break;
}
case 0:
{
System.out.println("BYE, DOBRO DOBRO.");
run = false;
break;
}
default:
{
System.out.println("Invalid input");
break;
}
}
}
}
public static void showSeries(int[] input, int range)
{
for(int i = 0; i < range; i++)
{
System.out.println(input[i]);
}
}
public static void biggestNum(int[] input, int range)
{
Arrays.sort(input);
System.out.println(input[0]);
}
public static void middleNum(int[] input, int range)
{
int Middle = input.length / 2;
if ((input.length % 2) > 0)
{
System.out.println(input[Middle]);
}
else
{
System.out.println((input[Middle-1] + input[Middle]) / 2.0);
}
}
public static void smallestNum(int[] input, int range)
{
Arrays.sort(input);
for(int i = 0; i < range; i++)
{
System.out.println(input[i]);
}
}
}
The task was to write a program which works with an array of numbers using a menu
with few options. But also the task of each option needs to be a separate method and the main method needs to only show the menu and call for each method depending on the number(option) chosen. Also needs to check users errors, example if option 2 is chosen before option 1 or the chosen option doesn't exist and etc.
I'm confused on how to proceed as I'm no expert in java. How would this be done considering that the only things can be used are defined by the task
Maybe you want something more like this, Where the show series method actually sets the array, so the other methods can use the array
static int[] series = new int[100];
static int seriesLength = 0;
...
// Get the input for range
public static void showSeries(int range)
{
seriesLength = range;
series = new int[seriesLength];
for (int i = 0; i < series.legnth; i++) {
series[i] = i;
System.out.print(series[i] + " ");
}
}
Because this first method needs to be the first one called before anything, the array will be set. Then the other methods shouldn't have to take any arguments, as the array is already set, and they can just use the static array.
In this interactive program, you will find a menu with options to perform different functions on an array. This array is taken from a file called "data.txt". The file contains integers, one per line. Obviously, I have not included the entire code (it was too long). However, I was hoping that someone could help me with the problem of finding the prime numbers in the array Right now, the console prints the address of the array for the primes ([I#4a13ccea). Any suggestions are welcome. Part of my program is below. Thanks.
public static void main(String[] args) throws FileNotFoundException {
Scanner sc = new Scanner(System.in);
System.out.println("Welcome to Calculation Program!\n");
startMenus(sc);
}
private static void startMenus(Scanner sc) throws FileNotFoundException {
while (true) {
System.out.println("(Enter option # and press ENTER)\n");
System.out.println("1. Display the average of the list");
System.out.println("2. Display the number of occurences of a given element in the list");
System.out.println("3. Display the prime numbers in a list");
System.out.println("4. Display the information above in table form");
System.out.println("5. Save the information onto a file in table form");
System.out.println("6. Exit");
int option = sc.nextInt();
sc.nextLine();
switch (option) {
case 1:
System.out.println("You've chosen to compute the average.");
infoMenu1(sc);
break;
case 2:
infoMenu2(sc, sc);
break;
case 3:
infoMenu3(sc);
break;
case 4:
infoMenu4(sc);
break;
case 5:
infoMenu5(sc);
break;
case 6:
System.exit(0);
default:
System.out.println("Unrecognized Option!\n");
}
}
}
private static void infoMenu3(Scanner sc) throws FileNotFoundException {
File file = new File("data.txt");
sc = new Scanner(file);
int[] numbers = new int[100];
int i = 0;
while (sc.hasNextInt()) {
numbers[i] = sc.nextInt();
++i;
}
for (int j = 0; j < i; ++j) {
System.out.print("The numbers in the file are: " + numbers[j] + " ");
}
}
public static boolean prime(int x) {
boolean answer = true;
for (int i = 2; i <= x / 2; i = i + 1) {
if (i != x) {
if (i % x == 0) {
answer = false;
}
}
}
return answer;
}
public static int[] primes(int[] numbers) {
int primesCount = 0;
for (int i : numbers) {
if (prime(i)) {
primesCount = (primesCount + 1);
}
}
if (primesCount == 0) {
return null;
}
int[] result = new int[primesCount];
int index = 0;
for (int i : numbers) {
if (prime(i)) {
result[index] = i;
index = index + 1;
}
}
return result;
}
}
Loop through your array and print every element, or use the java.util.Arrays.toString(int[]) method if its format suits your needs.
Two marks
If you print an array like this, you will get the address of the array, not the inside.
System.out.println("The primes in the file are: " + primes(numbers));
Replace this line with a loop that iterates over primes(numbers)
The second is, in your public static boolean prime(int x) function you have this line
for (int i = 2; i <= x / 2; i = i + 1)
Although this works, to find a prime yo do not need to iterate until x / 2 . For performance benefits Square root of x would suit better.
I am doing a TicTacToe Program, the only missing part is to have the user to choose whether to quit the game or to replay. I can't find a way to "return" to the gaming.
import java.io.*;
public class Expierment
{
static char c1 [] = new char[10];
static char c2 [] = new char[10];
static char c3 [] = new char[10];
static char p1;
static char p2;
static boolean gameOver = false;
public static void main(String args[])
{
int counter = 0;
int p1Wins = 0;
int p2Wins = 0;
int r1 = 0;
int r2 = 0;
int r3 = 0;
int r4 = 0;
int r5 = 0;
int r6 = 0;
int r7 = 0;
int r8 = 0;
int r9 = 0;
int pick1 = 0;
int pick2 = 0;
int pick3 = 0;
int pick4 = 0;
int pick5 = 0;
int pick6 = 0;
int pick7 = 0;
int pick8 = 0;
int pick9 = 0;
char turn = 'X';
int choice = menu();
switch(choice)
{
case 1:
System.out.println("The game is called 'Tic-Tac-Toe', you should have known it. If you don't, search it.") ;
case 2:
gameOver = false;
break;
case 3:
System.out.println("\nSee you next time !!");
return;
default:
System.out.println("\nYou hit the wrong key......\n");
return;
}//end of switch
System.out.println("\nPlayer 1 initials ?");
String n1 = GCS();
p1 = n1.charAt(0);
System.out.println("\nPlayer 2 initials ?");
String n2 = GCS();
p2 = n2.charAt(0);
c1[2]='1';
c2[2]='2';
c3[2]='3';
c1[1]='4';
c2[1]='5';
c3[1]='6';
c1[0]='7';
c2[0]='8';
c3[0]='9';
printBoard ();
while(gameOver!=true)
{
System.out.println("Which spot ?");
int pick = Integer. parseInt(GCS());
switch (pick)
{
case 1:
if (r1<1)
{
c1[2] = turn;
r1++;
}
else
{
System.out.println("That column is full, pick another.\n");
continue;
}
break;
case 2:
if (r2<1)
{
c2[2] = turn;
r2++;
}
else
{
System.out.println("That column is full, pick another.\n");
continue;
}
break;
case 3:
if (r3<1)
{
c3[2] = turn;
r3++;
}
else
{
System.out.println("That column is full, pick another.\n");
continue;
}
break;
case 4:
if (r4<1)
{
c1[1] = turn;
r4++;
}
else
{
System.out.println("That column is full, pick another.\n");
continue;
}
break;
case 5:
if (r5<1)
{
c2[1] = turn;
r5++;
}
else
{
System.out.println("That column is full, pick another.\n");
continue;
}
break;
case 6:
if (r6<1)
{
c3[1] = turn;
r6++;
}
else
{
System.out.println("That column is full, pick another.\n");
continue;
}
break;
case 7:
if (r7<1)
{
c1[0] = turn;
r7++;
}
else
{
System.out.println("That column is full, pick another.\n");
continue;
}
break;
case 8:
if (r8<1)
{
c2[0] = turn;
r8++;
}
else
{
System.out.println("That column is full, pick another.\n");
continue;
}
break;
case 9:
if (r9<1)
{
c3[0] = turn;
r9++;
}
else
{
System.out.println("That column is full, pick another.\n");
continue;
}
break;
default:
System.out.println("Seriously?! Pick a possible spot.\n");
continue;
}//end of switch
if (turn=='X') turn = 'O';
else turn = 'X';
printBoard();
if (checkWinner())
{
while(gameOver==true)
{
int Echoice = EGM();
switch(Echoice)
{
case 1:
System.out.println("The game is called 'Tic-Tac-Toe', you should have known it. If you don't, search it.") ;
case 2:
gameOver = false;
menu();
break;
case 3:
System.out.println("\nSee you next time !!");
return;
default:
System.out.println("\nYou hit the wrong key......\n");
return;
}//end of switch
}//end of while true
return;
}
counter ++;
if (counter==9)
{
System.out.println("\n\nYou tied.\n");
return;
}
}//end of while not true
}//end of main
public static boolean checkWinner()
{
for (int k=0; k<2; k++)
{
if ((c1[k]!=' ')&&(c1[k]==c2[k])&&(c1[k]==c3[k]))
{
System.out.println("\nYo " + c1[k] + " is the winner!\n");
gameOver=true;
return true;
}//checks column 1-3 horizontally
}//end of horizontal check
for (int m=0; m<2; m++)
{
if((c1[m]!=' ')&&(c1[m]==c1[m+1])&&(c1[m+1]==c1[m+2])&&(c1[m]==c1[m+2]))
{
System.out.println("\nYo " + c1[m] + " is the winner!\n");
gameOver=true;
return true;
}//checks column 1 vertically
if((c2[m]!=' ')&&(c2[m]==c2[m+1])&&(c2[m+1]==c2[m+2])&&(c2[m]==c2[m+2]))
{
System.out.println("\nYo " + c2[m] + " is the winner!\n");
gameOver=true;
return true;
}//checks column 2 vertically
if((c3[m]!=' ')&&(c3[m]==c3[m+1])&&(c3[m+1]==c3[m+2])&&(c3[m]==c1[m+2]))
{
System.out.println("\nYo " + c3[m] + " is the winner!\n");
gameOver=true;
return true;
}//checks column 3 vertically
if ((c1[m]!=' ')&&(c1[m]==c2[m+1])&&(c1[m]==c3[m+2]))
{
System.out.println("\nYo " + c1[m] + " is the winner!\n");
gameOver=true;
return true;
}//checks upward diagonal
if ((c3[m]!=' ')&&(c3[m]==c2[m+1])&&(c3[m]==c1[m+2]))
{
System.out.println("\nYo " + c1[m] + " is the winner!\n");
gameOver=true;
return true;
}
}//end of vertical check
return false;
}//end of checkWinner
public static void printBoard()
{
System.out.println("_______");
for (int j = 2; j > -1; j--)
{
System.out.println("|" + c1[j] + "|" + c2[j] + "|" + c3[j] + "|");
System.out.println("-------");
}
}//end of printBoard
public static int menu()
{
System.out.println("Tic-Tac-Toe ~ Main Menu\n\n1. Instructions\n2. Play a 1 player game"+"\n3. Exit\n");
int selection = Integer.parseInt(GCS());
return selection;
}//end of menu
public static int EGM()
{
System.out.println("Tic-Tac-Toe ~ End of Game Menu\n\n1. Instructions\n2. Play again"+"\n3. Exit\n");
int Eselection = Integer.parseInt(GCS());
return Eselection;
}
public static String GCS()
{
int noMoreInput=-1;
char enterKeyHit='\n';
int InputChar;
StringBuffer InputBuffer = new StringBuffer(100);
try
{
InputChar=System.in.read();
while(InputChar != noMoreInput)
{
if((char)InputChar !=enterKeyHit)
{
InputBuffer.append((char)InputChar);
}
else
{
InputBuffer.setLength(InputBuffer.length()-1);
break;
}
InputChar=System.in.read();
}
}
catch (IOException IOX)
{
System.err.println(IOX);
}
return InputBuffer.toString();
}//end of GCS
}//end of public class
You really should get some of that code out of the main function.
Specifically, I'd put the whole game loop in a separate function, maybe called playGame(), which contains the logic for playing the game, checking winner, etc., and either returns the winner or just prints the winner and returns void.
Then the main function could put a call to playGame() in a loop, and at the end of the loop, ask the user if s/he wants to play again.
In general, you want each function to do one logical task. You've done well with moving checkWinner out, now do the same with some of the other code.
If you need help on the "asking the user about playing again", leave a comment and I'll make an edit to address that.
quick and dirty pseudo-code - not modular
do {
//everything in your main goes here
.
.
.
playAgain = prompt the user
} while(playAgain);
With the current program layout, there is no "clean" way to accomplish that. Here are some constructive criticism :
Your main method should only be a bootstrapper
You should only initialize your program in your main method. Consequently, try to have 1 method doing only 1 thing. You're design now has the game menu and game main loop inside the same method.
Your game loop could look like this:
while still playing
read input from user
if game is active
process game input
update game
else
process menu input
update menu
This way, you only need to swith the game is active state for the menu or the game. Etc.
Do not reinvent the wheel
Your GCS method is way too complicated, just replace it with :
Scanner scanner = new Scanner(); // put this somewhere at the class level (so it is reusable)
...
String input = scanner.nextLine(); // put this somewhere in a method reading an input
Variable abuse
Instead of initializing many variables, perhaps (like other have suggested) you could use arrays, or more specifically a 2-dimensional array.
int grid[][] = new int[3][3];
// grid[0][0] points to the top-left cell, grid[2][2] points to the bottom right one
Or you could use a single int to store everything; represent your grid as a bit array
int grid = 0; // empty grid
...
// set player move
grid |= (1 << (y*3)+x) << PLAYER_OFFSET; // PLAYER_OFFSET: 0=player 1, 16=player 2
// reset (clear) player move
grid &= ~((1 << (y*3)+x) << PLAYER_OFFSET); // ...
// check if player move is set
boolean isSet = (grid >> ((1 << (y*3)+x) << PLAYER_OFFSET)) && 1; // ...
Why are bit arrays cool? Because to check if a player wins, you don't need fancy for..loop and other complicated algorithms, just validate against a winning pattern... :
int pattern = 273; // test for diagonal from [0,0] to [2,2], or bits "100 010 001"
boolean isWinning = (grid && (pattern << PLAYER_OFFSET)) != 0;
That's it!
Also, using 0 to 9 may be good to identify the grid cell, however as input value is not that intuitive for a player. Many games (chess, checkers, LOA, etc.) and applications (Excel, Calc, etc.), for example, are using the Algebraic chess notation system. Converting the notation in x and y is very simple. For example :
boolean cellPlayed = false;
while (!cellPlayed) {
String cellStr = scanner.readLine().toLower(); // ex: "b2" for the center cell
try {
int gridx = cellStr.charAt(0) - 'a'; // ex: for "b2" should return 1
int gridy = cellStr.charAt(1) - '1'; // ex: for "b2" should return 1
grid(gridx][gridy] = playerValue; // 1 for "player 1" and 2 for "player 2"
cellPlayed = true;
} catch (Exception e) {
System.out.println("Error! Invalid input");
}
}
Don't feel discouraged! We all start somewhere! :)
Even dirtier than the do-while method. Will eventually cause stack-overflow.
//your current main method
boolean playAgain = prompt the user
if(playAgain){
main(args);
}
Things would be a lot more clear with a more concise main method. The really quick and dirty way would be to copy everything in your main method into a new method and just call that method from the main and when the user chooses to start a new game.