Java 如何改进我的井字游戏设计?

Java 如何改进我的井字游戏设计?,java,oop,Java,Oop,我用java创建了一个基于文本的tic-tac-toe游戏,我尝试应用了一些 OOP原则,但事情变得复杂了 评论什么以及如何正确评论?这是个好主意吗 两人目标 如何摆脱这么多if-else语句 这是我的TictaToeGame.class: import java.util.*; import java.util.zip.*; import java.nio.channels.*; import org.apache.http.conn.scheme.*; public class TicTa

我用java创建了一个基于文本的tic-tac-toe游戏,我尝试应用了一些 OOP原则,但事情变得复杂了

评论什么以及如何正确评论?这是个好主意吗 两人目标

如何摆脱这么多if-else语句

这是我的TictaToeGame.class:

import java.util.*;
import java.util.zip.*;
import java.nio.channels.*;
import org.apache.http.conn.scheme.*;

public class TicTacToeGame implements IGame
{
    private  Scanner in;

    static  Player currentPlayer;

    private static String PlayerInput;

    private String xMark="x";

    private String oMark="o";

    public static boolean isGameRunning=true;

    private  static Map<String,String>grid;

    Player playerOne;

    Player playerTwo;

    private  final String

    a1="a1",    a2="a2",    a3="a3",

    b1="b1",    b2="b2",    b3="b3",

    c1="c1",    c2="c2",    c3="c3";

//Switch player
    public void nextTurn()
    {
        // TODO: Implement this method



        if (currentPlayer.getMark() == playerOne.getMark())
        {


            currentPlayer = playerTwo;

        }
        else
        {

            currentPlayer = playerOne;

        }


    }

    @Override
    public  String getUserInput()
    {

        System.out.println("");
        System.out.print("enter cell:");
        return PlayerInput = in.nextLine();
    }

    //update cell state by updating grid hashmap 
    //
    @Override
    public void updateGame()
    {

        System.out.println("");
        System.out.println("");
        System.out.println("      1   2   3");
        System.out.println("   A) " + grid.get(a1) + " | " + grid.get(a2) + " | " + grid.get(a3) + "");
        System.out.println("     ---|---|---");
        System.out.println("   B) " + grid.get(b1) + " | " + grid.get(b2) + " | " + grid.get(b3) + "");
        System.out.println("     ---|---|---");
        System.out.println("   C) " + grid.get(c1) + " | " + grid.get(c2) + " | " + grid.get(c3) + "");


    }


    @Override

    //check userinput and game state 

    public  void updateState()
    {

        getUserInput();

        if (isValideInput() == false){


            updateState();

            return;

        }

        grid.put(PlayerInput, currentPlayer.getMark());

    if(isGridFull()&&!isAWin()){

        System.out.println("its a tie");

        updateGame();

        displayGameOver();

        isGameRunning=false;

    }else if(isAWin()){

        System.out.println(currentPlayer.getName()+" wins");

        updateGame();

        displayGameOver();

        isGameRunning=false;
    }

        else{

            System.out.println(currentPlayer.getName()+" ends his turn");
        nextTurn();

        }

    }

    @Override
    public void initLogic()
    {
        // TODO: Implement this method
        in = new Scanner(System.in);

        grid = new HashMap<String,String>();


        grid.put(a1, " "); grid.put(a2, " "); grid.put(a3, " "); 
        grid.put(b1, " "); grid.put(b2, " "); grid.put(b3, " ");
        grid.put(c1, " "); grid.put(c2, " "); grid.put(c3, " ");


        playerOne = new Player(); 
        playerTwo = new Player();

        playerOne.setMark(xMark);
        playerTwo.setMark(oMark);

        if (currentPlayer == null)
        {

            currentPlayer = playerOne;
        }
    }


    @ Override
    public boolean isValideInput()
    {

        if (grid.containsKey(PlayerInput))
        {

            return true;

        }

        System.out.println("invalid input");

        return false;
    }

    @Override

    public  boolean isAWin()
    {

        if ((grid.get(a1) + grid.get(a2) + grid.get(a3)).equals("ooo") ||
            (grid.get(b1) + grid.get(b2) + grid.get(b3)).equals("ooo") ||
            (grid.get(c1) + grid.get(c2) + grid.get(c3)).equals("ooo") ||
            (grid.get(a1) + grid.get(b1) + grid.get(c1)).equals("ooo") ||
            (grid.get(a2) + grid.get(b2) + grid.get(c2)).equals("ooo") ||
            (grid.get(a3) + grid.get(b3) + grid.get(c3)).equals("ooo") ||
            (grid.get(a1) + grid.get(b2) + grid.get(c3)).equals("ooo") ||
            (grid.get(a3) + grid.get(b2) + grid.get(c1)).equals("ooo") ||
            (grid.get(a1) + grid.get(a2) + grid.get(a3)).equals("xxx") ||
            (grid.get(b1) + grid.get(b2) + grid.get(b3)).equals("xxx") ||
            (grid.get(c1) + grid.get(c2) + grid.get(c3)).equals("xxx") ||
            (grid.get(a1) + grid.get(b1) + grid.get(c1)).equals("xxx") ||
            (grid.get(a2) + grid.get(b2) + grid.get(c2)).equals("xxx") ||
            (grid.get(a3) + grid.get(b3) + grid.get(c3)).equals("xxx") ||
            (grid.get(a1) + grid.get(b2) + grid.get(c3)).equals("xxx") ||
            (grid.get(a3) + grid.get(b2) + grid.get(c1)).equals("xxx"))
        {

            return true;



        }

        return false;
    }


    public boolean isATie(){

        if(isGridFull()&&(!isAWin())){



            return true;
        }

        return false;
    }

    public boolean isGridFull(){

        if(!grid.containsValue(" ")){


            return true;
        }

        return false;
    }


    @Override
    public  void displayGameOver()
    {

        System.out.println("");
        System.out.println("            ===============");
        System.out.println("            ||           ||");
        System.out.println("            || game over ||");
        System.out.println("            ||           ||");
        System.out.println("            ===============");
    }


    @Override
    public boolean isGameRunning()
    {
        // TODO: Implement this method
        return isGameRunning;
    }

}
主回路

        while(game.isGameRunning()==true){

            game.updateGame();

            game.updateState();

            }


        }

    }
有什么建议吗


建筑渐变中更改

dependencies {
    compile 'com.android.support:design:25.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

这是因为你正在使用

compileSdkVersion 21

如果要使用设计支持库版本25,则应使用
compileSdkVersio 25
targetSdkVersion 25

我建议您使用这样的依赖项

dependencies {
    compile 'com.android.support:design:25.0.0'

}
因为当你使用com.android.support:design:25.+'
每次同步gradle时,它都要检查版本25+中的最后一个版本,以及它在同步中浪费时间的原因。

构建gradle更改中

dependencies {
    compile 'com.android.support:design:25.+'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

这是因为你正在使用

compileSdkVersion 21

如果要使用设计支持库版本25,则应使用
compileSdkVersio 25
targetSdkVersion 25

我建议您使用这样的依赖项

dependencies {
    compile 'com.android.support:design:25.0.0'

}
因为当你使用com.android.support:design:25.+'
每次你同步gradle时,它都想检查版本25中的最后一个版本。+以及它浪费同步时间的原因。

我认为aide ide m2repository和我遇到的问题之间存在联系,所以我尝试使用android studio m2repository,它可以正常工作,现在我的项目像符咒一样编译,我的应用程序启动时没有任何问题。
我希望这会对其他人有所帮助。

我认为aide ide m2repository和我遇到的问题之间存在联系,所以我尝试使用android studio m2repository,它可以正常工作,现在我的项目可以像符咒一样编译,我的应用程序启动时没有任何问题。
minSdkVersion 14
我希望这能帮助别人

minSdkVersion 14
以及styles.xml中的values文件夹

<style name="ActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimaryDark">#d55d55</item>
</style>
以及styles.xml中的values文件夹

<style name="ActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorPrimaryDark">#d55d55</item>
</style>

显然,您的xml文件没有正确创建。试试下面的xml文件,它肯定会有用的

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout

 xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:fabview="http://schemas.android.com/apk/res-auto"
  android:id="@+id/main_coordinator_layout"
 android:layout_width="match_parent"
  android:layout_height="match_parent"
 android:fitsSystemWindows="true" >

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true" >

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@android:color/transparent" />

</android.support.design.widget.AppBarLayout>


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="?attr/actionBarSize"
    android:orientation="vertical" >

 <!-- your stuff here -->

</LinearLayout>


<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#ff00ff"
    android:src="@drawable/your_png_image"
    android:tint="#ffffff"
    android:layout_gravity="bottom|end"
    android:layout_marginBottom="35dp"
    android:layout_marginEnd="15dp" />
</android.support.design.widget.CoordinatorLayout>


我在助手中尝试了你自己的代码,它在启动时强制关闭。因此,我用您的其他代码重新创建了main.xml文件,它成功了。别忘了导入包的R

,显然您的xml文件没有正确创建。试试下面的xml文件,它肯定会有用的

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout

 xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:fabview="http://schemas.android.com/apk/res-auto"
  android:id="@+id/main_coordinator_layout"
 android:layout_width="match_parent"
  android:layout_height="match_parent"
 android:fitsSystemWindows="true" >

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fitsSystemWindows="true" >

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@android:color/transparent" />

</android.support.design.widget.AppBarLayout>


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginTop="?attr/actionBarSize"
    android:orientation="vertical" >

 <!-- your stuff here -->

</LinearLayout>


<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="#ff00ff"
    android:src="@drawable/your_png_image"
    android:tint="#ffffff"
    android:layout_gravity="bottom|end"
    android:layout_marginBottom="35dp"
    android:layout_marginEnd="15dp" />
</android.support.design.widget.CoordinatorLayout>


我在助手中尝试了你自己的代码,它在启动时强制关闭。因此,我用您的其他代码重新创建了main.xml文件,它成功了。别忘了导入包的R

发生了什么故障?你能发布堆栈跟踪吗?Aide ide logCat没有显示任何内容,它是无用的。有没有其他方法可以在我的手机上获取堆栈跟踪?编辑之前已经有多个答案的问题不是一个好主意。试着恢复你以前的问题并问一个新问题,因为这里的答案与编辑过的问题毫不相干。崩溃是什么?你能发布堆栈跟踪吗?Aide ide logCat没有显示任何内容,它是无用的。有没有其他方法可以在我的手机上获取堆栈跟踪?编辑之前已经有多个答案的问题不是一个好主意。尝试还原以前的问题并提出新问题,因为此处的答案与编辑的问题毫不相关。我已将compileSdkVersion和targetSdkVersion更改为“25”,现在我遇到了此问题:未知成员“main”“android.R.layout”的名字,所以我试着清理这个项目,但什么也没发生。有没有solutions@Didine尝试在清理后重建项目并使用无效缓存。两个答案可以帮助你。谢谢你的帮助,我非常感谢你的欢迎。接受这一正确答案,以便将来帮助其他人。我将compileSdkVersion和targetSdkVersion更改为“25”,现在我遇到了这个问题:“android.R.layout”的未知成员“main”,因此我尝试清理该项目,但什么也没有发生。有问题吗solutions@Didine尝试在清理后重建项目并使用无效缓存。两个答案可以帮助你。谢谢你的帮助,我非常感谢你的欢迎。接受这一正确答案,以便将来帮助他人。