This commit is contained in:
AndrewTrieu
2022-06-20 13:08:58 +07:00
commit f6062b2302
207 changed files with 4967 additions and 0 deletions

1
app/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/build

43
app/build.gradle Normal file
View File

@@ -0,0 +1,43 @@
plugins {
id 'com.android.application'
}
android {
compileSdk 32
defaultConfig {
applicationId "com.example.tictactoeapplut"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildFeatures {
viewBinding true
}
}
dependencies {
implementation 'androidx.appcompat:appcompat:1.3.0'
implementation 'com.google.android.material:material:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
implementation 'androidx.navigation:navigation-fragment:2.3.5'
implementation 'androidx.navigation:navigation-ui:2.3.5'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

21
app/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,26 @@
package com.example.tictactoeapplut;
import android.content.Context;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("com.example.tictactoeapplut", appContext.getPackageName());
}
}

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.tictactoeapplut" >
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.TicTacToeAppLUT"
tools:targetApi="31" >
<activity
android:name=".Game"
android:exported="false" />
<activity
android:name=".Prepare"
android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ListDataActivity"></activity>
<activity android:name=".EditDataActivity"></activity>
</application>
</manifest>

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@@ -0,0 +1,197 @@
package com.example.tictactoeapplut;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import androidx.annotation.Nullable;
public class Board extends View {
private final int boardColor;
private final int XColor;
private final int OColor;
private final int winColor;
private int cellSize = getWidth()/3;
private final Paint paint = new Paint();
private final Move game;
private boolean winLine = false;
public Board(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
game = new Move(context);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.Board,0,0);
try {
boardColor = a.getInteger(R.styleable.Board_boardColor, 0);
XColor = a.getInteger(R.styleable.Board_XColor, 0);
OColor = a.getInteger(R.styleable.Board_OColor, 0);
winColor = a.getInteger(R.styleable.Board_winColor, 0);
} finally {
a.recycle();
}
}
@Override
protected void onMeasure(int width, int height) {
super.onMeasure(width, height);
int size = Math.min(getMeasuredWidth(), getMeasuredHeight());
cellSize = size/3;
setMeasuredDimension(size, size);
}
@Override
protected void onDraw(Canvas canvas) {
paint.setStyle(Paint.Style.STROKE);
paint.setAntiAlias(true);
drawBoard(canvas);
drawMove(canvas);
if (winLine) {
paint.setColor(winColor);
drawWinLine(canvas);
}
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
int row = (int) Math.ceil(y/cellSize);
int column = (int) Math.ceil(x/cellSize);
if (!winLine) {
if (game.updateBoard(row, column)) {
invalidate();
if (game.winCheck()) {
winLine = true;
invalidate();
}
if (game.getPlayer() % 2 == 0) {
game.setPlayer(game.getPlayer() - 1);
} else {
game.setPlayer(game.getPlayer() + 1);
}
}
}
invalidate();
return true;
}
return false;
}
private void drawBoard(Canvas canvas) {
paint.setColor(boardColor);
paint.setStrokeWidth(16);
for (int x=1; x<3; x++) {
canvas.drawLine(cellSize*x, 0, cellSize*x, canvas.getWidth(), paint);
}
for (int y=1; y<3; y++) {
canvas.drawLine(0, cellSize*y, canvas.getWidth(), cellSize*y, paint);
}
paint.setStrokeWidth(32);
canvas.drawLine(0,0,cellSize*3,0,paint);
paint.setStrokeWidth(32);
canvas.drawLine(0,cellSize*3,cellSize*3,cellSize*3,paint);
paint.setStrokeWidth(16);
canvas.drawLine(0,0,0,cellSize*3,paint);
paint.setStrokeWidth(16);
canvas.drawLine(cellSize*3,0,cellSize*3,cellSize*3,paint);
}
private void drawMove(Canvas canvas) {
for (int r=0; r<3; r++) {
for (int c=0; c<3; c++) {
if (game.getBoard()[r][c]!=0) {
if (game.getBoard()[r][c]==1) {
drawX(canvas, r, c);
} else {
drawO(canvas, r, c);
}
}
}
}
}
private void drawX(Canvas canvas, int row, int column) {
paint.setColor(XColor);
canvas.drawLine((float)((column+1)*cellSize - cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)(column*cellSize+cellSize*0.1), (float)((row+1)*cellSize-cellSize*0.1), paint);
canvas.drawLine((float)(column*cellSize+cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)((column+1)*cellSize-cellSize*0.1), (float)((row+1)*cellSize-cellSize*0.1), paint);
}
private void drawO(Canvas canvas, int row, int column) {
paint.setColor(OColor);
canvas.drawOval((float)(column*cellSize+cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)(column*cellSize+cellSize-cellSize*0.1), (float)(row*cellSize+cellSize-cellSize*0.1), paint);
}
private void drawHorizontal(Canvas canvas, int row, int column) {
canvas.drawLine(column, row*cellSize + cellSize/2, cellSize*3, row*cellSize+cellSize/2,paint);
}
private void drawVertical(Canvas canvas, int row, int column) {
canvas.drawLine(column*cellSize+cellSize/2, row, column*cellSize+cellSize/2, cellSize*3,paint);
}
private void drawSlopeUp(Canvas canvas) {
canvas.drawLine(0, cellSize*3, cellSize*3, 0 ,paint);
}
private void drawSlopeDown(Canvas canvas) {
canvas.drawLine(0, 0, cellSize*3, cellSize*3 ,paint);
}
private void drawWinLine(Canvas canvas) {
int row = game.getWinType()[0];
int column = game.getWinType()[1];
switch (game.getWinType()[2]) {
case 1:
drawHorizontal(canvas, row, column);
break;
case 2:
drawVertical(canvas, row, column);
break;
case 3:
drawSlopeDown(canvas);
break;
case 4:
drawSlopeUp(canvas);
break;
}
}
public void setUp(Button again, Button home, TextView display, String[] names) {
game.setAgain(again);
game.setHome(home);
game.setTurn(display);
if (!names[0].equals("") && !names[1].equals("")){
game.setNames(names);
}
}
public void resetGame() {
game.resetBoard();
winLine = false;
}
}

View File

@@ -0,0 +1,66 @@
package com.example.tictactoeapplut;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import java.util.ArrayList;
public class CustomAdapter extends BaseAdapter {
private static final String TAG = "CustomAdapter";
Context context;
ArrayList<String> name;
ArrayList<String> winner;
ArrayList<String> time;
public CustomAdapter(Context context, ArrayList<String> name, ArrayList<String> winner, ArrayList<String> time) {
this.context = context;
this.name = name;
this.winner = winner;
this.time = time;
}
@Override
public int getCount() {
return name.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.list_item,parent,false);
TextView txtName, txtWin, txtTime;
txtName = convertView.findViewById(R.id.txt_name);
txtWin = convertView.findViewById(R.id.txt_win);
txtTime = convertView.findViewById(R.id.txt_time);
txtName.setText(name.get(position));
txtWin.setText(winner.get(position));
txtTime.setText(time.get(position));
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent editScreenIntent = new Intent(context, EditDataActivity.class);
editScreenIntent.putExtra("time",txtTime.getText().toString());
editScreenIntent.putExtra("players", txtName.getText().toString());
editScreenIntent.putExtra("winner", txtWin.getText().toString());
context.startActivity(editScreenIntent);
}
});
return convertView;
}
}

View File

@@ -0,0 +1,64 @@
package com.example.tictactoeapplut;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String TABLE_NAME = "record";
private static final String COL1 = "players";
private static final String COL2 = "winner";
private static final String COL3 = "time";
public DatabaseHelper(Context context) {
super(context, TABLE_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
String createTable = "CREATE TABLE " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
COL1 +" TEXT, " + COL2 + " TEXT, " + COL3 + " TEXT)";
db.execSQL(createTable);
}
@Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
db.execSQL("DROP IF TABLE EXISTS " + TABLE_NAME);
onCreate(db);
}
public boolean addData(String players, String winner, String time) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL1, players);
contentValues.put(COL2, winner);
contentValues.put(COL3, time);
long result = db.insert(TABLE_NAME, null, contentValues);
if (result == -1) {
return false;
} else {
return true;
}
}
public Cursor getData(){
SQLiteDatabase db = this.getWritableDatabase();
String query = "SELECT * FROM " + TABLE_NAME;
Cursor data = db.rawQuery(query, null);
return data;
}
public void deleteMatch(String time){
SQLiteDatabase db = this.getWritableDatabase();
String query = "DELETE FROM " + TABLE_NAME + " WHERE "
+ COL3 + " = '" + time + "'";
db.execSQL(query);
}
}

View File

@@ -0,0 +1,57 @@
package com.example.tictactoeapplut;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class EditDataActivity extends AppCompatActivity {
private Button btnDelete;
private TextView txtPlayers, txtWinner, txtTime;
DatabaseHelper mDatabaseHelper;
private String selectedPlayers, selectedWinner, selectedTime;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_data_layout);
btnDelete = (Button) findViewById(R.id.btnDelete);
txtPlayers = (TextView) findViewById(R.id.txtPlayers);
txtWinner = (TextView) findViewById(R.id.txtWinner);
txtTime = (TextView) findViewById(R.id.txtTime);
mDatabaseHelper = new DatabaseHelper(this);
Intent receivedIntent = getIntent();
selectedPlayers = receivedIntent.getStringExtra("players");
selectedWinner = receivedIntent.getStringExtra("winner");
selectedTime = receivedIntent.getStringExtra("time");
txtPlayers.setText(selectedPlayers);
txtWinner.setText(selectedWinner);
txtTime.setText(selectedTime);
btnDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mDatabaseHelper.deleteMatch(selectedTime);
txtPlayers.setText("");
txtWinner.setText("");
txtTime.setText("");
toaster();
}
});
}
private void toaster(){
Toast.makeText(this, "Match removed", Toast.LENGTH_SHORT).show();
}
}

View File

@@ -0,0 +1,46 @@
package com.example.tictactoeapplut;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class Game extends AppCompatActivity {
private Board board;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
Button again = findViewById(R.id.button6);
Button home = findViewById(R.id.button5);
TextView turn = findViewById(R.id.textView5);
again.setVisibility(View.GONE);
home.setVisibility(View.GONE);
String[] names = getIntent().getStringArrayExtra("PLAYERS");
assert names != null;
if (names[0].equals("")){
turn.setText((String)("Player 1's turn"));
}else{
turn.setText((String)(names[0] + "'s turn"));
}
board = findViewById(R.id.board);
board.setUp(again, home, turn, names);
}
public void againClick(View view) {
board.resetGame();
board.invalidate();
}
public void homeClick(View view) {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
}

View File

@@ -0,0 +1,48 @@
package com.example.tictactoeapplut;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
public class ListDataActivity extends AppCompatActivity {
private static final String TAG = "ListDataActivity";
DatabaseHelper mDatabaseHelper;
private ListView mListView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_layout);
mListView = (ListView) findViewById(R.id.listView);
mDatabaseHelper = new DatabaseHelper(this);
populateListView();
}
private void populateListView() {
Log.d(TAG, "populateListView: Displaying data in the ListView.");
Cursor data = mDatabaseHelper.getData();
ArrayList<String> listPlayers = new ArrayList<>();
ArrayList<String> listWinner = new ArrayList<>();
ArrayList<String> listTime = new ArrayList<>();
while(data.moveToNext()){
listPlayers.add(data.getString(1));
listWinner.add(data.getString(2));
listTime.add(data.getString(3));
}
CustomAdapter adapter = new CustomAdapter(this, listPlayers, listWinner, listTime);
mListView.setAdapter(adapter);
}
}

View File

@@ -0,0 +1,50 @@
package com.example.tictactoeapplut;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView description = (TextView) findViewById(R.id.textView2);
TextView link = (TextView) findViewById(R.id.textView3);
description.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Uri lut = Uri.parse((String)"https://www.lut.fi/en");
Intent toLUT = new Intent(Intent.ACTION_VIEW, lut);
if (toLUT.resolveActivity(getPackageManager()) != null) {
startActivity(toLUT);
}
}
});
link.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Uri github = Uri.parse((String)"https://github.com/AndrewTrieu/tictactoeapp");
Intent toGitHub = new Intent(Intent.ACTION_VIEW, github);
if (toGitHub.resolveActivity(getPackageManager()) != null) {
startActivity(toGitHub);
}
}
});
}
public void startClick(View view){
Intent intent = new Intent(this, Prepare.class);
startActivity(intent);
}
public void recordClick(View view){
Intent intent = new Intent(this, ListDataActivity.class);
startActivity(intent);
}
}

View File

@@ -0,0 +1,147 @@
package com.example.tictactoeapplut;
import android.content.Context;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Move {
private int[][] board;
private String[] names = {"Player 1", "Player 2"};
private int[] winType = {-1, -1, -1};
private Button again;
private Button home;
private TextView turn;
private int player = 1;
private static final SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss dd.MM.yyyy");
DatabaseHelper databaseHelper;
Move(Context context) {
databaseHelper = new DatabaseHelper(context);
board = new int[3][3];
for (int r=0; r<3; r++) {
for (int c=0; c<3; c++) {
board[r][c] = 0;
}
}
}
public boolean updateBoard(int row, int column) {
if (board[row-1][column-1]==0) {
board[row-1][column-1] = player;
if (player == 1) {
turn.setText((String)(names[1]+"'s turn"));
} else {
turn.setText((String)(names[0]+"'s turn"));
}
return true;
} else {
return false;
}
}
public boolean winCheck() {
boolean won = false;
for (int r = 0; r < 3; r++) {
if (board[r][0] == board[r][1] && board[r][0] == board[r][2] && board[r][0] != 0) {
winType = new int[] {r, 0, 1};
won = true;
break;
}
}
for (int c = 0; c < 3; c++) {
if (board[0][c] == board[1][c] && board[0][c] == board[2][c] && board[0][c] != 0) {
winType = new int[] {0, c, 2};
won = true;
break;
}
}
if (board[0][0]==board[1][1] && board[0][0]==board[2][2] && board[0][0]!=0) {
winType = new int[] {0, 2, 3};
won = true;
}
if (board[2][0]==board[1][1] && board[2][0]==board[0][2] && board[2][0]!=0) {
winType = new int[] {2, 2, 4};
won = true;
}
int boardFilled = 0;
for (int r=0; r<3; r++) {
for (int c=0; c<3; c++) {
if (board[r][c]!=0){
boardFilled+=1;
}
}
}
if (won) {
again.setVisibility(View.VISIBLE);
home.setVisibility(View.VISIBLE);
turn.setText((String)(names[player-1]+" won!"));
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
databaseHelper.addData(names[0]+" vs "+names[1], names[player-1], sdf.format(timestamp));
return true;
} else if(boardFilled==9){
again.setVisibility(View.VISIBLE);
home.setVisibility(View.VISIBLE);
turn.setText((String)("Tie game!"));
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
databaseHelper.addData(names[0]+" vs "+names[1], "Tie", sdf.format(timestamp));
return false;
} else {
return false;
}
}
public void resetBoard() {
for (int r=0; r<3; r++) {
for (int c=0; c<3; c++) {
board[r][c] = 0;
}
}
player = 1;
again.setVisibility(View.GONE);
home.setVisibility(View.GONE);
turn.setText((String)(names[0]+"'s turn"));
}
public void setAgain(Button again) {
this.again = again;
}
public void setHome(Button home) {
this.home = home;
}
public void setTurn(TextView turn) {
this.turn = turn;
}
public void setNames(String[] names) {
this.names = names;
}
public int[][] getBoard() {
return board;
}
public void setPlayer(int player) {
this.player = player;
}
public int getPlayer() {
return player;
}
public int[] getWinType() {
return winType;
}
}

View File

@@ -0,0 +1,29 @@
package com.example.tictactoeapplut;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class Prepare extends AppCompatActivity {
private EditText player1;
private EditText player2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_prepare);
player1 = findViewById(R.id.editTextTextPersonName4);
player2 = findViewById(R.id.editTextTextPersonName3);
}
public void playClick(View view) {
String player1Name = player1.getText().toString();
String player2Name = player2.getText().toString();
Intent intent = new Intent(this, Game.class);
intent.putExtra("PLAYERS", new String[] {player1Name, player2Name});
startActivity(intent);
}
}

View File

@@ -0,0 +1,30 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
<aapt:attr name="android:fillColor">
<gradient
android:endX="85.84757"
android:endY="92.4963"
android:startX="42.9492"
android:startY="49.59793"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
android:strokeWidth="1"
android:strokeColor="#00000000" />
</vector>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#36AE7C"/>
<corners android:radius="100dp"/>
<stroke android:color="@color/black" android:width="1dp"/>
</shape>
</item>
</selector>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#92B4EC"/>
<corners android:radius="100dp"/>
<stroke android:color="@color/black" android:width="1dp"/>
</shape>
</item>
</selector>

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<path
android:fillColor="#3DDC84"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeWidth="0.8"
android:strokeColor="#33FFFFFF" />
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#cc0000"/>
<corners android:radius="100dp"/>
<stroke android:color="@color/black" android:width="1dp"/>
</shape>
</item>
</selector>

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<solid android:color="#FFD24C"/>
<corners android:radius="100dp"/>
<stroke android:color="@color/black" android:width="1dp"/>
</shape>
</item>
</selector>

View File

@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:custom="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Game"
android:background="#FFFFFF">
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="84dp"
android:fontFamily="monospace"
android:text="@string/name"
android:textColor="#000000"
android:textSize="24sp"
android:textStyle="italic"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/constraintLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="60dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.493"
app:layout_constraintStart_toStartOf="parent">
<Button
android:id="@+id/button5"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:layout_marginEnd="30dp"
android:background="@drawable/yellow"
android:onClick="homeClick"
android:text="@string/again"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/button6"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.0" />
<Button
android:id="@+id/button6"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:background="@drawable/blue"
android:onClick="againClick"
android:text="@string/more"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
<com.example.tictactoeapplut.Board
android:id="@+id/board"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
custom:boardColor="#000000"
custom:XColor="#DD2C00"
custom:OColor="#3F51B5"
custom:winColor="#fc00fc"/>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,97 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="#FFFFFF">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="84dp"
android:fontFamily="casual"
android:text="@string/home"
android:textAlignment="center"
android:textAppearance="@style/TextAppearance.AppCompat.Display1"
android:textColor="#EF6C00"
android:textSize="48sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_marginTop="252dp"
android:background="@drawable/button"
android:fontFamily="sans-serif-light"
android:onClick="startClick"
android:text="@string/start"
android:textAllCaps="false"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<Button
android:id="@+id/button3"
android:layout_width="100dp"
android:layout_height="50dp"
android:layout_marginTop="16dp"
android:background="@drawable/button"
android:fontFamily="sans-serif-light"
android:onClick="recordClick"
android:text="@string/record"
android:textAllCaps="false"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="104dp"
android:text="@string/author"
android:textAlignment="center"
android:textColor="#757575"
android:textSize="11sp"
android:textStyle="italic"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.492"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:text="@string/github"
android:textSize="11sp"
android:textStyle="italic"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" />
<ImageView
android:id="@+id/imageView3"
android:layout_width="353dp"
android:layout_height="347dp"
app:layout_constraintBottom_toTopOf="@+id/button"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView"
app:layout_constraintVertical_bias="0.617"
app:srcCompat="@drawable/logo" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,91 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Prepare"
android:background="#FFFFFF">
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="160dp"
android:fontFamily="casual"
android:text="@string/players"
android:textColor="#EF6C00"
android:textSize="34sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="56dp"
android:background="@drawable/button"
android:fontFamily="sans-serif-light"
android:onClick="playClick"
android:text="@string/play"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextTextPersonName3" />
<TextView
android:id="@+id/textView7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/player2"
android:textColor="#3F51B5"
app:layout_constraintBottom_toTopOf="@+id/editTextTextPersonName3"
app:layout_constraintStart_toStartOf="@+id/editTextTextPersonName3" />
<EditText
android:id="@+id/editTextTextPersonName3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="52dp"
android:autofillHints=""
android:ems="10"
android:hint="@string/name"
android:inputType="textPersonName"
android:minHeight="48dp"
android:textColor="#757575"
android:textColorHint="#757575"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/editTextTextPersonName4"
tools:ignore="DuplicateSpeakableTextCheck" />
<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/player1"
android:textColor="#DD2C00"
app:layout_constraintBottom_toTopOf="@+id/editTextTextPersonName4"
app:layout_constraintStart_toStartOf="@+id/editTextTextPersonName4" />
<EditText
android:id="@+id/editTextTextPersonName4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="68dp"
android:autofillHints=""
android:ems="10"
android:hint="@string/name"
android:inputType="textPersonName"
android:minHeight="48dp"
android:textColor="#757575"
android:textColorHint="#757575"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView4" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,96 @@
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:background="#FFFFFF">
<Button
android:id="@+id/btnDelete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="230dp"
android:background="@drawable/red"
android:text="@string/delete"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.514"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView8" />
<TextView
android:id="@+id/txtPlayers"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="60dp"
android:text="@string/temp"
android:textSize="20sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.501"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView8" />
<TextView
android:id="@+id/textView8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="80dp"
android:fontFamily="casual"
android:text="@string/details"
android:textColor="#EF6C00"
android:textSize="24sp"
android:textStyle="bold"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.498"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="150dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView8">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/time"
android:textSize="16sp" />
<TextView
android:id="@+id/txtTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/temp"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
android:orientation="horizontal"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView8">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/winner"
android:textSize="20sp" />
<TextView
android:id="@+id/txtWinner"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/temp"
android:textSize="20sp" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity"
android:orientation="vertical"
android:padding="10dp"
android:background="#FFFFFF">
<TextView
android:id="@+id/txt_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/players"
android:textColor="#000000"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
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"
app:layout_constraintStart_toStartOf="parent"
tools:layout_editor_absoluteY="131dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/winner"
android:textColor="#000000"
android:textSize="20sp" />
<TextView
android:id="@+id/txt_win"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/temp"
android:textSize="20sp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/time"
android:textColor="#000000"
android:textSize="20sp" />
<TextView
android:id="@+id/txt_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/temp"
android:textSize="20sp"/>
</LinearLayout>
</LinearLayout>

View File

@@ -0,0 +1,16 @@
<?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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF">
<ListView
android:id="@+id/listView"
android:layout_width="409dp"
android:layout_height="729dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1,3 @@
<resources>
<dimen name="fab_margin">48dp</dimen>
</resources>

View File

@@ -0,0 +1,16 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TicTacToeAppLUT" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_200</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/black</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_200</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
</resources>

View File

@@ -0,0 +1,3 @@
<resources>
<dimen name="fab_margin">200dp</dimen>
</resources>

View File

@@ -0,0 +1,3 @@
<resources>
<dimen name="fab_margin">48dp</dimen>
</resources>

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Board">
<attr name="boardColor" format="color"/>
<attr name="XColor" format="color"/>
<attr name="OColor" format="color"/>
<attr name="winColor" format="color"/>
</declare-styleable>
</resources>

View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="purple_200">#FFBB86FC</color>
<color name="purple_500">#FF6200EE</color>
<color name="purple_700">#FF3700B3</color>
<color name="teal_200">#FF03DAC5</color>
<color name="teal_700">#FF018786</color>
<color name="black">#FF000000</color>
<color name="white">#FFFFFFFF</color>
</resources>

View File

@@ -0,0 +1,3 @@
<resources>
<dimen name="fab_margin">16dp</dimen>
</resources>

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

View File

@@ -0,0 +1,24 @@
<resources>
<string name="app_name">Tic-Tac-Toe</string>
<string name="home">TIC-TAC-TOE</string>
<string name="author">Developed by Andrew Trieu for the course CT70A9120 at LUT University</string>
<string name="github">https://github.com/AndrewTrieu/tictactoeapp</string>
<string name="start">START</string>
<string name="logo">Logo</string>
<string name="players">Players</string>
<string name="player1">Player 1 - X</string>
<string name="player2">Player 2 - O</string>
<string name="play">Play</string>
<string name="name">Player\'s name</string>
<string name="again">Home</string>
<string name="more">Reset</string>
<string name="record">RECORD</string>
<string name="title_activity_record">Record</string>
<string name="empty">History is empty</string>
<string name="suggest">Maybe play some games first?</string>
<string name="temp"> </string>
<string name="delete">Delete</string>
<string name="details">Match details</string>
<string name="time">Time:\u0020</string>
<string name="winner">Winner:\u0020</string>
</resources>

View File

@@ -0,0 +1,25 @@
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.TicTacToeAppLUT" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Primary brand color. -->
<item name="colorPrimary">@color/purple_500</item>
<item name="colorPrimaryVariant">@color/purple_700</item>
<item name="colorOnPrimary">@color/white</item>
<!-- Secondary brand color. -->
<item name="colorSecondary">@color/teal_200</item>
<item name="colorSecondaryVariant">@color/teal_700</item>
<item name="colorOnSecondary">@color/black</item>
<!-- Status bar color. -->
<item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
<!-- Customize your theme here. -->
</style>
<style name="Theme.TicTacToeAppLUT.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<style name="Theme.TicTacToeAppLUT.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
<style name="Theme.TicTacToeAppLUT.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample backup rules file; uncomment and customize as necessary.
See https://developer.android.com/guide/topics/data/autobackup
for details.
Note: This file is ignored for devices older that API 31
See https://developer.android.com/about/versions/12/backup-restore
-->
<full-backup-content>
<!--
<include domain="sharedpref" path="."/>
<exclude domain="sharedpref" path="device.xml"/>
-->
</full-backup-content>

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?><!--
Sample data extraction rules file; uncomment and customize as necessary.
See https://developer.android.com/about/versions/12/backup-restore#xml-changes
for details.
-->
<data-extraction-rules>
<cloud-backup>
<!-- TODO: Use <include> and <exclude> to control what is backed up.
<include .../>
<exclude .../>
-->
</cloud-backup>
<!--
<device-transfer>
<include .../>
<exclude .../>
</device-transfer>
-->
</data-extraction-rules>

View File

@@ -0,0 +1,17 @@
package com.example.tictactoeapplut;
import org.junit.Test;
import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() {
assertEquals(4, 2 + 2);
}
}