Java 如何改进我的井字游戏设计?
我用java创建了一个基于文本的tic-tac-toe游戏,我尝试应用了一些 OOP原则,但事情变得复杂了 评论什么以及如何正确评论?这是个好主意吗 两人目标 如何摆脱这么多if-else语句 这是我的TictaToeGame.class: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
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尝试在清理后重建项目并使用无效缓存。两个答案可以帮助你。谢谢你的帮助,我非常感谢你的欢迎。接受这一正确答案,以便将来帮助他人。