HI EVERYONE
Today we make a basic tic tac toe game. It's easy for us 💪
If you follow these steps, it is easy for you. Firstly, open Android Studio. Next, create a project. Then, edit the main layout. After that, write codes. Finally, run the emulator. Let's do it.
You create three gradients and a gradient list. Next, create a font directory. Then, add a font.
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <item> <shape> <gradient android:startColor="#00FFEB" android:endColor="#073ABB" android:angle="135" /> </shape> </item> </selector>
![]() |
for example You create a gradient list. |
<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/background_1" android:duration="5000"></item> <item android:drawable="@drawable/background_2" android:duration="5000"></item> <item android:drawable="@drawable/background_3" android:duration="5000"></item> </animation-list>
<?xml version="1.0" encoding="utf-8"?> <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:id="@+id/mainLayout" android:background="@drawable/gradient_list" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/playerOneTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginStart="25dp" android:layout_marginTop="25dp" android:text="PLAYER ONE" android:textColor="#fff" android:textSize="24sp" app:fontFamily="@font/wrongdelivery" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/playerOneScoreTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="0" android:textColor="#fff" android:textSize="24sp" app:fontFamily="@font/wrongdelivery" app:layout_constraintEnd_toEndOf="@+id/playerOneTextView" app:layout_constraintStart_toStartOf="@+id/playerOneTextView" app:layout_constraintTop_toBottomOf="@+id/playerOneTextView" /> <TextView android:id="@+id/playerTwoTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="25dp" android:layout_marginEnd="25dp" android:text="PLAYER TWO" android:textColor="#fff" android:textSize="24sp" app:fontFamily="@font/wrongdelivery" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" /> <TextView android:id="@+id/playerTwoScoreTextView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:text="0" android:textColor="#fff" android:textSize="24sp" app:fontFamily="@font/wrongdelivery" app:layout_constraintEnd_toEndOf="@+id/playerTwoTextView" app:layout_constraintStart_toStartOf="@+id/playerTwoTextView" app:layout_constraintTop_toBottomOf="@+id/playerTwoTextView" /> <TextView android:id="@+id/playerStatusTextView" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginTop="15dp" android:gravity="center" android:text="" android:textColor="#fff" android:textSize="24sp" app:fontFamily="@font/wrongdelivery" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/playerOneScoreTextView" /> <androidx.constraintlayout.widget.ConstraintLayout android:id="@+id/buttonsLayout" android:layout_width="match_parent" android:layout_height="0dp" android:layout_marginTop="25dp" android:layout_marginBottom="25dp" app:layout_constraintBottom_toTopOf="@+id/resetButton" app:layout_constraintTop_toBottomOf="@+id/playerStatusTextView"> <Button app:fontFamily="@font/wrongdelivery" android:id="@+id/tictactoeButton0" android:layout_width="0dp" android:layout_height="0dp" android:text="" android:textSize="64sp" app:backgroundTint="#252020" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent=".25" app:layout_constraintHorizontal_bias=".05" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias=".05" app:layout_constraintWidth_percent=".30" /> <Button app:fontFamily="@font/wrongdelivery" android:id="@+id/tictactoeButton1" android:layout_width="0dp" android:layout_height="0dp" android:text="" android:textSize="64sp" app:backgroundTint="#252020" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent=".25" app:layout_constraintHorizontal_bias=".5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias=".05" app:layout_constraintWidth_percent=".30" /> <Button app:fontFamily="@font/wrongdelivery" android:id="@+id/tictactoeButton2" android:layout_width="0dp" android:layout_height="0dp" android:text="" android:textSize="64sp" app:backgroundTint="#252020" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent=".25" app:layout_constraintHorizontal_bias=".95" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias=".05" app:layout_constraintWidth_percent=".30" /> <Button app:fontFamily="@font/wrongdelivery" android:id="@+id/tictactoeButton3" android:layout_width="0dp" android:layout_height="0dp" android:text="" android:textSize="64sp" app:backgroundTint="#252020" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent=".25" app:layout_constraintHorizontal_bias=".05" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias=".4" app:layout_constraintWidth_percent=".30" /> <Button android:id="@+id/tictactoeButton4" android:layout_width="0dp" android:layout_height="0dp" android:text="" android:textSize="64sp" app:fontFamily="@font/wrongdelivery" app:backgroundTint="#252020" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent=".25" app:layout_constraintHorizontal_bias=".5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias=".4" app:layout_constraintWidth_percent=".30" /> <Button android:id="@+id/tictactoeButton5" android:layout_width="0dp" android:layout_height="0dp" android:text="" android:textSize="64sp" app:fontFamily="@font/wrongdelivery" app:backgroundTint="#252020" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent=".25" app:layout_constraintHorizontal_bias=".95" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias=".4" app:layout_constraintWidth_percent=".30" /> <Button android:id="@+id/tictactoeButton6" android:layout_width="0dp" android:layout_height="0dp" android:text="" android:textSize="64sp" app:fontFamily="@font/wrongdelivery" app:backgroundTint="#252020" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent=".25" app:layout_constraintHorizontal_bias=".05" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias=".75" app:layout_constraintWidth_percent=".30" /> <Button android:id="@+id/tictactoeButton7" android:layout_width="0dp" android:layout_height="0dp" android:text="" android:textSize="64sp" app:fontFamily="@font/wrongdelivery" app:backgroundTint="#252020" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent=".25" app:layout_constraintHorizontal_bias=".5" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias=".75" app:layout_constraintWidth_percent=".30" /> <Button android:id="@+id/tictactoeButton8" android:layout_width="0dp" android:layout_height="0dp" android:text="" android:textSize="64sp" app:fontFamily="@font/wrongdelivery" app:backgroundTint="#252020" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHeight_percent=".25" app:layout_constraintHorizontal_bias=".95" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias=".75" app:layout_constraintWidth_percent=".30" /> </androidx.constraintlayout.widget.ConstraintLayout> <Button android:id="@+id/resetButton" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginStart="75dp" android:layout_marginEnd="75dp" android:layout_marginBottom="25dp" android:text="Reset Game" app:fontFamily="@font/wrongdelivery" app:backgroundTint="#252020" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
![]() |
It looks pretty. |
package com.prometrx.tictactoe; import androidx.appcompat.app.AppCompatActivity; import androidx.constraintlayout.widget.ConstraintLayout; import androidx.core.content.res.ResourcesCompat; import android.graphics.Color; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends AppCompatActivity implements View.OnClickListener{ // implements for buttons onclick methods. private TextView playerOneScoreTextView, playerTwoScoreTextView, playerStatus; private Button [] buttons = new Button[9]; private Button resetGameButton; private int playerOneScoreCount, playerTwoScoreCount, rountCount; private boolean activePlayer; //p1 => 0 //p2 => 1 //empty => 2 private int[] gameState = {2, 2, 2, 2, 2, 2, 2, 2, 2}; private int[][] winningPosition = { {0, 1, 2}, {3, 4, 5}, {6, 7, 8}, //rows {0, 3, 6}, {1, 4, 7}, {2, 5, 8}, //columns {0, 4, 8}, {2, 4, 6} //cross }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); ConstraintLayout constraintLayout = findViewById(R.id.mainLayout); // AnimationDrawable animationDrawable = (AnimationDrawable) constraintLayout.getBackground(); // animationDrawable.setEnterFadeDuration(2500); // These lines are for live background. animationDrawable.setExitFadeDuration(2500); // animationDrawable.start(); // } private void init() { playerOneScoreTextView = findViewById(R.id.playerOneScoreTextView); playerTwoScoreTextView = findViewById(R.id.playerTwoScoreTextView); playerStatus = findViewById(R.id.playerStatusTextView); resetGameButton = findViewById(R.id.resetButton); for (int i = 0; i<buttons.length; i++) { int resourceId = getResources().getIdentifier("tictactoeButton"+i, "id", getPackageName()); //This line get button id. buttons[i] = findViewById(resourceId); // initialize buttons[i].setOnClickListener(this); } rountCount = 0; playerOneScoreCount = 0; playerTwoScoreCount = 0; activePlayer = true; } @Override public void onClick(View view) { Button button = ((Button) view);//Casting if(!button.getText().toString().equals("")) { return; } String buttonId= button.getResources().getResourceEntryName(button.getId()); int gameStatePointer = Integer.parseInt(buttonId.substring(buttonId.length()-1, buttonId.length())); if(activePlayer) { button.setText("X"); button.setTextColor(Color.parseColor("#D81B60")); gameState[gameStatePointer] = 0; } else{ button.setText("O"); button.setTextColor(Color.parseColor("#43A047")); gameState[gameStatePointer] = 1; } rountCount++; if(winning()) { if(activePlayer) { playerOneScoreCount++; updateScoreCount(); Toast.makeText(MainActivity.this, "Player One Won", Toast.LENGTH_LONG).show(); playAgain(); } else{ playerTwoScoreCount++; updateScoreCount(); Toast.makeText(MainActivity.this, "Player Two Won", Toast.LENGTH_LONG).show(); playAgain(); } } else if(rountCount == 9) { Toast.makeText(MainActivity.this, "No Winner", Toast.LENGTH_LONG).show(); playAgain(); } else{ activePlayer = !activePlayer; } if(playerOneScoreCount > playerTwoScoreCount) { playerStatus.setText("PLAYER ONE IS WINNING"); } else if(playerOneScoreCount < playerTwoScoreCount) { playerStatus.setText("PLAYER TWO IS WINNING"); }else{ playerStatus.setText("EQUALTY"); } resetGameButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { playAgain(); playerOneScoreCount = 0; playerTwoScoreCount = 0; playerStatus.setText(""); updateScoreCount(); } }); } private boolean winning() { for(int [] winArray : winningPosition) { if (gameState[winArray[0]] == gameState[winArray[1]] && gameState[winArray[1]] == gameState[winArray[2]] && gameState[winArray[0]] != 2) return true; } return false; } private void updateScoreCount() { playerOneScoreTextView.setText(playerOneScoreCount + ""); playerTwoScoreTextView.setText(playerTwoScoreCount + ""); } private void playAgain() { rountCount = 0; activePlayer = true; for(int i = 0; i<gameState.length; i++) { gameState[i] = 2; buttons[i].setText(""); } } }
As you can see, it's easy for us. Let's watch gameplay. :)
GOODBYE EVERYONE
If you want to use project files, click this.
Resources:
https://www.dafont.com/wrong-delivery.font
https://www.youtube.com/watch?v=CCQTD7ptYqY
0 Comments