我的生活从未像现在这样受挫。甚至不能在这里做基础..只需要做一个简单的tic tac toe程序。我现在在这个世界上感到很孤单..我得到了基本的想法,但不能逻辑地把它放在一起。
类实例变量:
方法:
以下是我的代码:
import java.util.Scanner;
public class Six1
{
public static void main(String[] args)
{
TicTacToe ttt = new TicTacToe();
ttt.TicTacToe();
ttt.print();
}
static class TicTacToe
{
private char player; // 'X' or 'O'
private char[][] board;
// make board
public TicTacToe()
{
// construct board
board = new char[3][3];
// initialize elements
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
board[i][j] = ' ' ;
}
}
}
// print board
public void print()
{
for ( int i = 0; i < 3; i++)
{
System.out.println(" ");
for( int j = 0; j < 3; j++)
{
System.out.print(board[i][j] + " ");
}
System.out.println("\n------");
}
}
}
}
答案 0 :(得分:11)
你还没有完成很多工作,但你所拥有的东西似乎最合理。使用内部类可能会使事情变得过于复杂。如果你想要发生某些事情,你需要在main
中放一些东西。
您无法一次性编写整个程序。您可以从顶部开始,然后查看详细信息,或者处理详细信息,然后将它们组合成一个整体。
如果您不确定从哪里开始,这可能是让事情发生变化的好方法。使用您希望存在的任何函数编写代码的主体。也许你会从
开始public static void main(String[] args) {
printBoard();
while (!isWinner()) {
readMove(); // get move from stdin and mark on board
printBoard(); // redraw board
}
printWinner(); // say who won
}
这些功能尚不存在。获得主要级别后,开始实现这些组成的功能,必要时使用更多的组合功能。重复直到您完成 知道如何实现的简单功能。
如果要在不实现每个方法的情况下编译代码,可以使用throw new UnsupportedOperationException("not implemented");
作为需要返回值的任何方法的主体。
如果你知道你需要某些部分,但不确定它们如何组合在一起,那就从这个方法开始吧。
你知道你需要某种方式来询问用户他们想要做出什么样的举动。因此,创建一个能够执行此操作并在其上自行测试的函数。你知道你需要一种方法来检查是否有胜利者。将某些值硬编码到board[]
并测试您的isWinner()
函数。一旦你有了一些工件,你可以将它们组装成更大更大的块,直到你有一个正常运行的程序。
答案 1 :(得分:2)
你说你不知道主要做什么:
public static void main(String[] args)
{
// what the hell do i need here?!?!
// TicTacToe() <--???
// print() <-????
}
简单地调用这些方法不会有两个原因:
main
是一个静态方法,它在没有对象实例的情况下运行。您要调用的方法是实例方法,即您需要一个对象来调用它们。
您已经定义了一个内部类。这些方法是内部类的一部分。
当然,你可以解决这两个问题,尽管正如bemace所说,2.使你的程序比必要的更复杂。你可以放弃“class TicTacToe”定义。如果你想保留它,你可以创建它的实例,如下所示:
TicTacToe ttt = new TicTacToe();
编辑:请注意,正如NamshubWriter所评论的那样,除非您将内部类声明为static
,否则这将无效:
static class TicTacToe
然后你可以调用它上面的方法:
ttt.print();
您尝试调用的TicTacToe()
实际上是一个构造函数。当您执行new TicTacToe()
创建新对象时会自动调用它。
如果你在主方法中加上以上两行,你应该更进一步。
答案 2 :(得分:2)
令人困惑的一件事是内部/嵌套类。我假设作业要求你有一个名为Six1
的类。我会让TicTacToe
成为顶级课程。因此,您将在同一目录中拥有两个源文件:
开始Six1.java
public class Six1 {
public static void main(String[] args)
TicTacToe ttt = new TicTacToe();
ttt.play();
}
}
结束Six1.java
开始TicTacToe.java
public class TicTacToe {
private char[][] board;
private char player; // 'X' or 'O'
/**
* Constructs a new Tic Tac Toe object
*/
public TicTacToe() {
// initialize board
}
/**
* Plays a game
*/
public void play() {
// play the game
print();
}
/**
* Prints the board
*/
public void print() {
}
}
结束TicTacToe.java
答案 3 :(得分:1)
稍微解决这个问题并尝试不要整体解决它。
现在专注于测试胜利的方法。你希望函数在每个实例中返回什么(Draw,未完成的游戏,玩家1赢或玩家2赢了)?
你将如何测试这场胜利?
一旦你有了这种方法,剩下的就应该更容易适应。
答案 4 :(得分:0)
这就是我想出的。如果有人仍然感兴趣,希望这会有所帮助!
public class TicTacToe {
static int SIZE = 3;
static int MAX_MOVES = SIZE * SIZE;
static char[][] matrix = new char[SIZE][SIZE];
static int[][] moveMatrix = new int[][] { { 1, 2, 3 }, { 4, 5, 6 },
{ 7, 8, 9 } };
public static void printState() {
System.out.println("Current State:");
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++)
if ((matrix[i][j] == 'x') || (matrix[i][j] == 'o'))
System.out.print(" " + matrix[i][j]);
else
System.out.print(" -");
System.out.println();
}
}
public static int enterMove() {
System.out.println("Enter your move as follows:");
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++)
if ((matrix[i][j] == 'x') || (matrix[i][j] == 'o'))
System.out.print(" -");
else
System.out.print(" " + moveMatrix[i][j]);
System.out.println();
}
System.out.println("Enter your move :");
int move = 0;
move = Integer.parseInt(System.console().readLine());
return move;
}
public static boolean updateMatrix(int move, char ch) {
int i = 0;
int j = 0;
boolean status;
switch (move) {
case 1:
break;
case 2:
i = 0;
j = 1;
break;
case 3:
i = 0;
j = 2;
break;
case 4:
i = 1;
j = 0;
break;
case 5:
i = 1;
j = 1;
break;
case 6:
i = 1;
j = 2;
break;
case 7:
i = 2;
j = 0;
break;
case 8:
i = 2;
j = 1;
break;
case 9:
i = 2;
j = 2;
break;
default:
System.out.println("Invalid entry");
status = false;
break;
}
if (moveMatrix[i][j] == -1) {
System.out
.println("Entry already marked,please re-enter your move.");
status = false;
} else {
matrix[i][j] = ch;
moveMatrix[i][j] = -1;
status = true;
}
return status;
}
public static boolean isGameOver() {
boolean status = false;
if ((matrix[0][0] == matrix[1][1]) && (matrix[1][1] == matrix[2][2])
&& ((matrix[1][1] == 'x') || (matrix[1][1]) == 'o'))
status = true;
else if ((matrix[2][0] == matrix[1][1])
&& (matrix[1][1] == matrix[0][2])
&& ((matrix[1][1] == 'x') || (matrix[1][1]) == 'o'))
status = true;
for (int i = 0; i < SIZE; i++)
if ((matrix[i][0] == matrix[i][1])
&& (matrix[i][1] == matrix[i][2])
&& ((matrix[i][1] == 'x') || (matrix[i][1]) == 'o'))
status = true;
else if ((matrix[0][i] == matrix[1][i])
&& (matrix[1][i] == matrix[2][i])
&& ((matrix[1][i] == 'x') || (matrix[1][i]) == 'o'))
status = true;
return status;
}
public static void main(String[] args) {
char ch;
int k = 0;
int player;
do {
player = k % 2 + 1;
k++;
if (player == 1)
ch = 'x';
else
ch = 'o';
printState();
System.out.println("Player" + player + " [" + ch + "]:");
if (!updateMatrix(enterMove(), ch))
k--;
} while ((!isGameOver()) && (k < MAX_MOVES));
printState();
if (isGameOver())
System.out.println("Game Over. Player" + player + " [" + ch
+ "] wins!");
else
System.out.println("Game Tied. No winner!");
}
}