java - 井字游戏 - 2 个带碎片的棋盘
问题描述
我有这个问题:
在游戏中,我需要两块板,其中一个是另一个的副本。然后单击其中一个板并根据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 播放器为 GIOCATOREO 输入数值,反之亦然。但是,当其他用户轮到他们时,他们无法输入值。
推荐阅读
- c++ - 为什么一个简单的链表反向函数总是返回最后一个节点而不是第一个节点
- linux - Linux 上的 Dns 资格(.NET Core 的 UnicastIPAddressInformation.IsDnsEligible)
- ruby-on-rails - docker-api 检查方法是否运行成功
- r - 将函数应用于匹配模式的数据框列表和列
- android - 我想在我的主屏幕顶部覆盖全屏小部件或屏幕?
- java - 使用 Springboot 缓存 UserDetails
- sql - SQL 查询不使用创建的索引
- python-3.x - 打印子字符串出现的函数
- javascript - 这个 .forEach() 方法在这里是如何工作的?
- javascript - 将接口 A 传递给 B 丢失属性