我有这个问题:
在游戏中,我需要两个棋盘,其中一个是另一个的副本。然后,单击其中一个板,然后基于player1Turn
变量插入“ X”或“ O”符号。
[每个板都属于一个玩家,所以第一个属于“ X”,第二个属于“ O”。在游戏过程中,两个板都必须具有相同的状态,因此必须同步。
到目前为止,我设法制作了板子,但我不知道如何添加另一个板子,以及使用碎片。
1。如何制作两个带有碎片的另一个板的副本?
-我的应用程序仅适用于第一个棋盘-
喜欢这个
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button[][] buttonsX = new Button[3][3];
private Button[][] buttonsO = new Button[3][3];
private boolean player1Turn = true;
private int roundCount;
private int player1Points;
private int player2Points;
private TextView textViewPlayer1;
private TextView textViewPlayer2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewPlayer1 = findViewById(R.id.text_view_p1);
textViewPlayer2 = findViewById(R.id.text_view_p2);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
String buttonID = "button_X" + i + j;
int resID = getResources().getIdentifier(buttonID, "id", getPackageName());
buttonsX[i][j] = findViewById(resID);
buttonsX[i][j].setOnClickListener(this);
}
}
Button buttonReset = findViewById(R.id.button_reset);
buttonReset.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
resetGame();
}
});
}
@Override
public void onClick(View v) {
if (!((Button) v).getText().toString().equals("")) {
return;
}
if (player1Turn) {
((Button) v).setText("X");
} else {
((Button) v).setText("O");
}
roundCount++;
if (checkForWin()) {
if (player1Turn) {
player1Wins();
} else {
player2Wins();
}
} else if (roundCount == 9) {
draw();
} else {
player1Turn = !player1Turn;
}
}
private boolean checkForWin() {
String[][] field = new String[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
field[i][j] = buttonsX[i][j].getText().toString();
}
}
for (int i = 0; i < 3; i++) {
if (field[i][0].equals(field[i][1])
&& field[i][0].equals(field[i][2])
&& !field[i][0].equals("")) {
return true;
}
}
for (int i = 0; i < 3; i++) {
if (field[0][i].equals(field[1][i])
&& field[0][i].equals(field[2][i])
&& !field[0][i].equals("")) {
return true;
}
}
if (field[0][0].equals(field[1][1])
&& field[0][0].equals(field[2][2])
&& !field[0][0].equals("")) {
return true;
}
if (field[0][2].equals(field[1][1])
&& field[0][2].equals(field[2][0])
&& !field[0][2].equals("")) {
return true;
}
return false;
}
private void player1Wins() {
player1Points++;
Toast.makeText(this, "Player 1 wins!", Toast.LENGTH_SHORT).show();
updatePointsText();
resetBoard();
}
private void player2Wins() {
player2Points++;
Toast.makeText(this, "Player 2 wins!", Toast.LENGTH_SHORT).show();
updatePointsText();
resetBoard();
}
private void draw() {
Toast.makeText(this, "Draw!", Toast.LENGTH_SHORT).show();
resetBoard();
}
private void updatePointsText() {
textViewPlayer1.setText("Player 1: " + player1Points);
textViewPlayer2.setText("Player 2: " + player2Points);
}
private void resetBoard() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
buttonsX[i][j].setText("");
}
}
roundCount = 0;
player1Turn = true;
}
private void resetGame() {
player1Points = 0;
player2Points = 0;
updatePointsText();
resetBoard();
}
这是content_main.xml文件。
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RelativeLayout
android:id="@+id/relativeLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"/>
<TextView
android:id="@+id/text_view_p1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text="Player 1: 0"
android:textSize="30sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_view_p2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/text_view_p1"
android:layout_marginTop="41dp"
android:freezesText="true"
android:text="Player 2: 0"
android:textSize="30sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/text_view_p1" />
<TextView
android:id="@+id/text_view_p8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="DOPPIOTRIX"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="@+id/button_reset"
app:layout_constraintHorizontal_bias="0.633"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button_reset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:text="reset"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="418dp"
android:layout_height="586dp"
android:layout_marginTop="49dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="@+id/relativeLayout"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="@+id/text_view_p1">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text='GIOCATORE "X"' />
<androidx.gridlayout.widget.GridLayout
android:id="@+id/tabellaX"
android:layout_width="394dp"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="60dp">
<Button
android:id="@+id/button_X22"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="2"
app:layout_row="2" />
<Button
android:id="@+id/button_X00"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="0"
app:layout_row="0" />
<Button
android:id="@+id/button_X01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text="" />
<Button
android:id="@+id/button_X12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="2"
app:layout_row="1" />
<Button
android:id="@+id/button_X02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="2"
app:layout_row="0" />
<Button
android:id="@+id/button_X20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="0"
app:layout_row="2" />
<Button
android:id="@+id/button_X21"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text="" />
<Button
android:id="@+id/button_X10"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="0"
app:layout_row="1" />
<Button
android:id="@+id/button_X11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:freezesText="true"
android:text=""
app:layout_column="1"
app:layout_row="1" />
</androidx.gridlayout.widget.GridLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="353dp"
android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent">
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text='GIOCATORE "O"' />
<androidx.gridlayout.widget.GridLayout
android:id="@+id/TabellaO"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="60dp">
<Button
android:id="@+id/button22"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
app:layout_column="2"
app:layout_row="2" />
<Button
android:id="@+id/button_O00"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
app:layout_column="0"
app:layout_row="0" />
<Button
android:id="@+id/button02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
<Button
android:id="@+id/button12"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
app:layout_column="2"
app:layout_row="1" />
<Button
android:id="@+id/button.."
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
app:layout_column="2"
app:layout_row="0" />
<Button
android:id="@+id/button20"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
app:layout_column="0"
app:layout_row="2" />
<Button
android:id="@+id/button."
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="" />
<Button
android:id="@+id/button01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
app:layout_column="0"
app:layout_row="1" />
<Button
android:id="@+id/button11"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
app:layout_column="1"
app:layout_row="1" />
</androidx.gridlayout.widget.GridLayout>
</LinearLayout>
也许一种解决方案可能如下。
请注意,它不是完美的,并且有很多重复的代码和更多的问题,因此您有责任使其变得更好。但是它可以工作,但是如果某事有效,并不意味着可以将其标记为一段不错的代码。
首先创建一个新片段:
<Right-click-on-project> -> New -> Fragment -> Fragment(Blank)
并命名为BoardFragment
。
在生成的layout / fragment_board.xml]中的下一个放置以下代码段:
<?xml version="1.0" encoding="utf-8"?> <androidx.gridlayout.widget.GridLayout android:id="@+id/tabellaX" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:padding="10dp" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:freezesText="true" android:text="" app:layout_column="0" app:layout_row="0" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:freezesText="true" android:text="" app:layout_column="1" app:layout_row="0" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:freezesText="true" android:text="" app:layout_column="2" app:layout_row="0" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:freezesText="true" android:text="" app:layout_column="0" app:layout_row="1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:freezesText="true" android:text="" app:layout_column="1" app:layout_row="1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:freezesText="true" android:text="" app:layout_column="2" app:layout_row="1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:freezesText="true" android:text="" app:layout_column="0" app:layout_row="2" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:freezesText="true" android:text="" app:layout_column="1" app:layout_row="2" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:freezesText="true" android:text="" app:layout_column="2" app:layout_row="2" /> </androidx.gridlayout.widget.GridLayout>
BoardFragment.java
应该如下所示:
import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import androidx.fragment.app.Fragment; public class BoardFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_board, container, false); } }
然后使用以下代码段更改activity_main.xml,请记住以更改
fragment
标签中的包。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <TextView android:id="@+id/text_view_p8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="DOPPIOTRIX" android:textSize="30sp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/text_view_p1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:freezesText="true" android:text="Player 1: " android:textSize="20sp" android:visibility="visible" /> <TextView android:id="@+id/text_view_p1_score" android:layout_width="wrap_content" android:layout_height="wrap_content" android:freezesText="true" android:text="0" android:textSize="20sp" android:visibility="visible" /> <TextView android:id="@+id/text_view_p2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="16dp" android:layout_marginLeft="16dp" android:layout_marginBottom="24dp" android:freezesText="true" android:text="Player 2: " android:textSize="20sp" android:visibility="visible" /> <TextView android:id="@+id/text_view_p2_score" android:layout_width="wrap_content" android:layout_height="wrap_content" android:freezesText="true" android:text="0" android:textSize="20sp" android:visibility="visible" /> <Button android:id="@+id/button_reset" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="reset" android:layout_marginStart="8dp" android:layout_marginLeft="8dp" android:visibility="visible" /> </LinearLayout> <TextView android:id="@+id/textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:gravity="center" android:text='GIOCATORE "X"' android:visibility="visible" /> <!-- Change andorid:name--> <fragment android:name="hr.hello.dm.test.BoardFragment" android:id="@+id/grid_X" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> <TextView android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text='GIOCATORE "O"' /> <!-- Change andorid:name--> <fragment android:name="hr.hello.dm.test.BoardFragment" android:id="@+id/grid_O" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" /> </LinearLayout>
最后是Java文件。
import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import androidx.gridlayout.widget.GridLayout; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private boolean player1Turn = true; private int roundCount; private int player1Points; private int player2Points; private TextView textViewPlayer1Score; private TextView textViewPlayer2Score; private GridLayout gridLayoutX; private GridLayout gridLayoutO; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textViewPlayer1Score = findViewById(R.id.text_view_p1_score); textViewPlayer2Score = findViewById(R.id.text_view_p2_score); gridLayoutX = findViewById(R.id.grid_X); int id = 0; for(View v : gridLayoutX.getTouchables()){ v.setId(id++); v.setOnClickListener(this); } gridLayoutO = findViewById(R.id.grid_O); for(View v : gridLayoutO.getTouchables()){ v.setId(id++); v.setOnClickListener(this); } Button buttonReset = findViewById(R.id.button_reset); buttonReset.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { resetGame(); } }); } @Override public void onClick(View v) { if (!((Button) v).getText().toString().equals("")) { return; } GridLayout currentGridLayout = player1Turn ? gridLayoutX : gridLayoutO; if (player1Turn && currentGridLayout.findViewById(v.getId()) != null) { ((Button) v).setText("X"); ((Button) gridLayoutO.getTouchables().get(v.getId())).setText("X"); } else if (!player1Turn && currentGridLayout.findViewById(v.getId()) != null){ ((Button) v).setText("O"); ((Button) gridLayoutX.getTouchables().get(v.getId() - 9)).setText("O"); } else { return; } roundCount++; if (checkForWin()) { if (player1Turn) { player1Wins(); } else { player2Wins(); } } else if (roundCount == 9) { draw(); } else { player1Turn = !player1Turn; } } private boolean checkForWin() { String[][] field = new String[3][3]; for (int i = 0; i < 9; i++) { field[i/3][i%3] = ((Button) gridLayoutX.getTouchables().get(i)).getText().toString(); } for (int i = 0; i < 3; i++) { if (field[i][0].equals(field[i][1]) && field[i][0].equals(field[i][2]) && !field[i][0].equals("")) { return true; } } for (int i = 0; i < 3; i++) { if (field[0][i].equals(field[1][i]) && field[0][i].equals(field[2][i]) && !field[0][i].equals("")) { return true; } } if (field[0][0].equals(field[1][1]) && field[0][0].equals(field[2][2]) && !field[0][0].equals("")) { return true; } if (field[0][2].equals(field[1][1]) && field[0][2].equals(field[2][0]) && !field[0][2].equals("")) { return true; } return false; } private void player1Wins() { player1Points++; Toast.makeText(this, "Player 1 wins!", Toast.LENGTH_SHORT).show(); updatePointsText(); resetBoard(); } private void player2Wins() { player2Points++; Toast.makeText(this, "Player 2 wins!", Toast.LENGTH_SHORT).show(); updatePointsText(); resetBoard(); } private void draw() { Toast.makeText(this, "Draw!", Toast.LENGTH_SHORT).show(); resetBoard(); } private void updatePointsText() { textViewPlayer1Score.setText(String.valueOf(player1Points)); textViewPlayer2Score.setText(String.valueOf(player2Points)); } private void resetBoard() { for(View v : gridLayoutX.getTouchables()){ ((Button) v).setText(""); } for(View v : gridLayoutO.getTouchables()){ ((Button) v).setText(""); } roundCount = 0; player1Turn = true; } private void resetGame() { player1Points = 0; player2Points = 0; updatePointsText(); resetBoard(); } }
快速说明:
在GIOCATOREX板上,X播放器输入值,反之亦然。但是他们不能输入当其他用户转向时的值。