diff options
| -rw-r--r-- | .idea/deploymentTargetDropDown.xml | 17 | ||||
| -rw-r--r-- | app/build.gradle | 14 | ||||
| -rw-r--r-- | app/src/main/java/com/jopek/pai_fillo_nai/Bot.java | 8 | ||||
| -rw-r--r-- | app/src/main/java/com/jopek/pai_fillo_nai/OnlineGameActivity.java | 282 | ||||
| -rw-r--r-- | app/src/main/res/layout-land/activity_main.xml | 52 | ||||
| -rw-r--r-- | app/src/main/res/layout-land/activity_online_game.xml | 133 | ||||
| -rw-r--r-- | build.gradle | 2 |
7 files changed, 358 insertions, 150 deletions
diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml new file mode 100644 index 0000000..55f5375 --- /dev/null +++ b/.idea/deploymentTargetDropDown.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="deploymentTargetDropDown"> + <runningDeviceTargetSelectedWithDropDown> + <Target> + <type value="RUNNING_DEVICE_TARGET" /> + <deviceKey> + <Key> + <type value="SERIAL_NUMBER" /> + <value value="290c726c731c7ece" /> + </Key> + </deviceKey> + </Target> + </runningDeviceTargetSelectedWithDropDown> + <timeTargetWasSelectedWithDropDown value="2022-12-12T19:13:28.469126Z" /> + </component> +</project>
\ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 96f4dfc..1da03cc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,6 +1,6 @@ plugins { id 'com.android.application' -// id 'com.google.gms.google-services' + id 'com.google.gms.google-services' } android { @@ -40,12 +40,12 @@ android { dependencies { - implementation 'androidx.appcompat:appcompat:1.4.1' - implementation 'com.google.android.material:material:1.6.0' + implementation 'androidx.appcompat:appcompat:1.5.1' + implementation 'com.google.android.material:material:1.7.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' -// implementation 'com.google.firebase:firebase-database:19.2.1' -// implementation 'com.google.firebase:firebase-database' + implementation 'com.google.firebase:firebase-database:20.1.0' + implementation 'com.google.firebase:firebase-database' testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.3' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' + androidTestImplementation 'androidx.test.ext:junit:1.1.4' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.0' }
\ No newline at end of file diff --git a/app/src/main/java/com/jopek/pai_fillo_nai/Bot.java b/app/src/main/java/com/jopek/pai_fillo_nai/Bot.java index 4b04a55..523da7b 100644 --- a/app/src/main/java/com/jopek/pai_fillo_nai/Bot.java +++ b/app/src/main/java/com/jopek/pai_fillo_nai/Bot.java @@ -1,5 +1,7 @@ package com.jopek.pai_fillo_nai; +import android.os.Build; + import java.util.Arrays; public class Bot { @@ -38,7 +40,7 @@ public class Bot { if (score == -10) return score; - if (isntBoardFull() == false) + if (!isntBoardFull()) return 0; int best; @@ -73,7 +75,9 @@ public class Bot { int bestVal = -1000; int bestMove = -1; - if(Arrays.stream(board).filter(c -> c == -1).count() == 9) return 4; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + if(Arrays.stream(board).filter(c -> c == -1).count() == 9) return 4; + } for (int i = 0; i < board.length; i++) { if (board[i] == -1) { diff --git a/app/src/main/java/com/jopek/pai_fillo_nai/OnlineGameActivity.java b/app/src/main/java/com/jopek/pai_fillo_nai/OnlineGameActivity.java index 71c1267..461c1b1 100644 --- a/app/src/main/java/com/jopek/pai_fillo_nai/OnlineGameActivity.java +++ b/app/src/main/java/com/jopek/pai_fillo_nai/OnlineGameActivity.java @@ -15,11 +15,12 @@ import android.widget.TextView; import androidx.annotation.RequiresApi; import androidx.appcompat.app.AppCompatActivity; -//import com.google.firebase.database.DataSnapshot; -//import com.google.firebase.database.DatabaseError; -//import com.google.firebase.database.DatabaseReference; -//import com.google.firebase.database.FirebaseDatabase; -//import com.google.firebase.database.ValueEventListener; +import com.google.firebase.FirebaseApp; +import com.google.firebase.database.DataSnapshot; +import com.google.firebase.database.DatabaseError; +import com.google.firebase.database.DatabaseReference; +import com.google.firebase.database.FirebaseDatabase; +import com.google.firebase.database.ValueEventListener; import java.util.ArrayList; import java.util.Arrays; @@ -38,8 +39,8 @@ public class OnlineGameActivity extends AppCompatActivity { Arrays.asList(-1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L) ); List<ImageView> squares = new ArrayList<>(); -// DatabaseReference rooms; -// DatabaseReference room; + DatabaseReference rooms; + DatabaseReference room; // FinishGameAlert AlertDialog fgAlert = null; long whoami = 0; @@ -48,7 +49,7 @@ public class OnlineGameActivity extends AppCompatActivity { boolean revengeRequested = false; String TAG = "maks"; ImageView p0Img; - ImageView p1Img; + //ImageView p1Img; ImageView square0, square1, square2, square3, square4, square5, square6, square7, square8; TextView tvName; @@ -59,9 +60,10 @@ public class OnlineGameActivity extends AppCompatActivity { getSupportActionBar().hide(); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_online_game); + FirebaseApp.initializeApp(this); p0Img = findViewById(R.id.p0Img); - p1Img = findViewById(R.id.p1Img); + //p1Img = findViewById(R.id.p1Img); tvName = findViewById(R.id.onPlayerName); square0 = findViewById(R.id.square0); @@ -80,7 +82,7 @@ public class OnlineGameActivity extends AppCompatActivity { square.setOnClickListener(view -> onSquareClick((ImageView) view, finalI)); i++; } -// rooms = FirebaseDatabase.getInstance("https://pai-fillo-nai-default-rtdb.europe-west1.firebasedatabase.app/").getReference("rooms"); + rooms = FirebaseDatabase.getInstance("https://pai-fillo-nai-default-rtdb.europe-west1.firebasedatabase.app/").getReference("rooms"); askForRoomId(false); } @@ -114,7 +116,7 @@ public class OnlineGameActivity extends AppCompatActivity { whoami = rand.nextInt(2); tvName.setText("You're player 1 (playing as " + (whoami == 0 ? "O" : "X") + ")"); -// room = rooms.child(rid); + room = rooms.child(rid); Map<String, Object> data = new HashMap<>(); data.put("started", 0); data.put("player1", whoami); @@ -124,32 +126,32 @@ public class OnlineGameActivity extends AppCompatActivity { data.put("winner", -1); data.put("revenge0", -1); data.put("revenge1", -1); -// room.setValue(data); + room.setValue(data); waitFor2Player(rid); } else { -// rooms.child(roomId).addListenerForSingleValueEvent(new ValueEventListener() { -// @Override -// public void onDataChange(DataSnapshot dataSnapshot) { -// if (!(dataSnapshot.getValue() instanceof HashMap)) { -// askForRoomId(true); -// } -// HashMap data = (HashMap) dataSnapshot.getValue(); -// if ((long) data.get("started") == 1) { -// askForRoomId(true); -// } -// whoami = (long) data.get("player2"); -// whoseTurn = (long) data.get("whoseTurn"); -// tvName.setText("You're player 1 (playing as " + (whoami == 0 ? "O" : "X") + ")"); -// room = rooms.child(roomId); -// startGame(true); -// } -// -// @Override -// public void onCancelled(DatabaseError databaseError) { -// askForRoomId(true); -// } -// }); + rooms.child(roomId).addListenerForSingleValueEvent(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + if (!(dataSnapshot.getValue() instanceof HashMap)) { + askForRoomId(true); + } + HashMap data = (HashMap) dataSnapshot.getValue(); + if ((long) data.get("started") == 1) { + askForRoomId(true); + } + whoami = (long) data.get("player2"); + whoseTurn = (long) data.get("whoseTurn"); + tvName.setText("You're player 1 (playing as " + (whoami == 0 ? "O" : "X") + ")"); + room = rooms.child(roomId); + startGame(true); + } + + @Override + public void onCancelled(DatabaseError databaseError) { + askForRoomId(true); + } + }); } } @@ -163,92 +165,92 @@ public class OnlineGameActivity extends AppCompatActivity { alert.show(); alert.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); -// room.addValueEventListener(new ValueEventListener() { -// @Override -// public void onDataChange(DataSnapshot dataSnapshot) { -// HashMap data = (HashMap) dataSnapshot.getValue(); -// if ((long) data.get("started") == 1) { -// room.removeEventListener(this); -// alert.dismiss(); -// startGame(false); -// } -// } -// -// @Override -// public void onCancelled(DatabaseError databaseError) { -// Log.d(TAG, "onCancelled: Waiter Value Event Listener"); -// } -// }); + room.addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + HashMap data = (HashMap) dataSnapshot.getValue(); + if ((long) data.get("started") == 1) { + room.removeEventListener(this); + alert.dismiss(); + startGame(false); + } + } + + @Override + public void onCancelled(DatabaseError databaseError) { + Log.d(TAG, "onCancelled: Waiter Value Event Listener"); + } + }); } -// protected void startGame(boolean markStarted) { -// if (markStarted) { -// room.child("started").setValue(1); -// } -// room.addValueEventListener(new ValueEventListener() { -// @Override -// public void onDataChange(DataSnapshot dataSnapshot) { -// HashMap data = (HashMap) dataSnapshot.getValue(); -// if (data == null) { -// room.removeEventListener(this); -// return; -// } -// -// Log.d(TAG, "onDataChange: " + Arrays.toString(data.entrySet().toArray())); -// gameBoard = (List) data.get("board"); -// Log.d(TAG, "onDataChange: " + Arrays.toString(gameBoard.toArray())); -// whoseTurn = (long) data.get("whoseTurn"); -// myTurn = whoseTurn == whoami; -// playTurn(); -// long winner = (long) data.get("winner"); -// long opRevenge = (long) data.get("revenge" + (whoami == 0 ? 1 : 0)); -// revengePossible = opRevenge != 0; -// if (revengeRequested && winner == -1) { -// myTurn = whoami == (long) data.get("whoseTurn"); -// revengePossible = true; -// revengeRequested = false; -// gameWasEnd = false; -// playTurn(); -// } else if (!revengePossible && revengeRequested) { -// fgAlert.dismiss(); -// new AlertDialog.Builder(OnlineGameActivity.this) -// .setTitle("Sad info") -// .setMessage("Second player don't want to play with ya :(") -// .setCancelable(false) -// .setNegativeButton("Go to menu without friend", (dialog, which) -> { -// room.removeValue(); -// Intent intent = new Intent(OnlineGameActivity.this, MainActivity.class); -// startActivity(intent); -// }) -// .setIcon(R.drawable.ic_baseline_gamepad_24) -// .show(); -// } else if (opRevenge == 1 && revengeRequested) { -// Map<String, Object> data2 = new HashMap<>(); -// gameBoard = new ArrayList<>(Arrays.asList(-1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L)); -// data2.put("started", 1); -// data2.put("player1", whoami); -// data2.put("player2", whoami == 0 ? 1L : 0L); -// data2.put("whoseTurn", new Long(ThreadLocalRandom.current().nextInt(0, 1 + 1))); -// data2.put("board", gameBoard); -// data2.put("winner", -1L); -// data2.put("revenge0", -1L); -// data2.put("revenge1", -1L); -// myTurn = whoami == (long) data2.get("whoseTurn"); -// room.setValue(data2); -// playTurn(); -// } -// -// if (winner != -1) { -// endGame(winner); -// } -// } -// -// @Override -// public void onCancelled(DatabaseError databaseError) { -// Log.d(TAG, "onCancelled: Main Value Event Listener"); -// } -// }); -// } + protected void startGame(boolean markStarted) { + if (markStarted) { + room.child("started").setValue(1); + } + room.addValueEventListener(new ValueEventListener() { + @Override + public void onDataChange(DataSnapshot dataSnapshot) { + HashMap data = (HashMap) dataSnapshot.getValue(); + if (data == null) { + room.removeEventListener(this); + return; + } + + Log.d(TAG, "onDataChange: " + Arrays.toString(data.entrySet().toArray())); + gameBoard = (List) data.get("board"); + Log.d(TAG, "onDataChange: " + Arrays.toString(gameBoard.toArray())); + whoseTurn = (long) data.get("whoseTurn"); + myTurn = whoseTurn == whoami; + playTurn(); + long winner = (long) data.get("winner"); + long opRevenge = (long) data.get("revenge" + (whoami == 0 ? 1 : 0)); + revengePossible = opRevenge != 0; + if (revengeRequested && winner == -1) { + myTurn = whoami == (long) data.get("whoseTurn"); + revengePossible = true; + revengeRequested = false; + gameWasEnd = false; + playTurn(); + } else if (!revengePossible && revengeRequested) { + fgAlert.dismiss(); + new AlertDialog.Builder(OnlineGameActivity.this) + .setTitle("Sad info") + .setMessage("Second player don't want to play with ya :(") + .setCancelable(false) + .setNegativeButton("Go to menu without friend", (dialog, which) -> { + room.removeValue(); + Intent intent = new Intent(OnlineGameActivity.this, MainActivity.class); + startActivity(intent); + }) + .setIcon(R.drawable.ic_baseline_gamepad_24) + .show(); + } else if (opRevenge == 1 && revengeRequested) { + Map<String, Object> data2 = new HashMap<>(); + gameBoard = new ArrayList<>(Arrays.asList(-1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L, -1L)); + data2.put("started", 1); + data2.put("player1", whoami); + data2.put("player2", whoami == 0 ? 1L : 0L); + data2.put("whoseTurn", new Long(ThreadLocalRandom.current().nextInt(0, 1 + 1))); + data2.put("board", gameBoard); + data2.put("winner", -1L); + data2.put("revenge0", -1L); + data2.put("revenge1", -1L); + myTurn = whoami == (long) data2.get("whoseTurn"); + room.setValue(data2); + playTurn(); + } + + if (winner != -1) { + endGame(winner); + } + } + + @Override + public void onCancelled(DatabaseError databaseError) { + Log.d(TAG, "onCancelled: Main Value Event Listener"); + } + }); + } protected void playTurn() { int i = 0; @@ -270,8 +272,8 @@ public class OnlineGameActivity extends AppCompatActivity { } protected void finishTurn() { -// room.child("whoseTurn").setValue(whoseTurn); -// room.child("board").setValue(gameBoard); + room.child("whoseTurn").setValue(whoseTurn); + room.child("board").setValue(gameBoard); } @RequiresApi(api = Build.VERSION_CODES.N) @@ -319,26 +321,26 @@ public class OnlineGameActivity extends AppCompatActivity { gameWasEnd = true; finishTurn(); -// room.child("winner").setValue(whoWon); -// AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this) -// .setTitle(whoWon == 2 ? "DRAW" : "Player " + (whoWon + 1) + " WON") -// .setMessage(whoWon == 2 ? "Maybe next time" : "Congratulations to Player " + (whoWon + 1)) -// .setCancelable(false) -// .setPositiveButton("Request revenge", (dialog, which) -> { -// revengeRequested = true; -// room.child("revenge" + whoami).setValue(1); -// }) -// .setNegativeButton("Go to menu", (dialog, which) -> { -// room.child("revenge" + whoami).setValue(0); -// if (!revengePossible) { -// room.removeValue(); -// } -// Intent intent = new Intent(OnlineGameActivity.this, MainActivity.class); -// startActivity(intent); -// }) -// .setIcon(R.drawable.ic_baseline_gamepad_24); -// fgAlert = alertBuilder.create(); -// fgAlert.show(); + room.child("winner").setValue(whoWon); + AlertDialog.Builder alertBuilder = new AlertDialog.Builder(this) + .setTitle(whoWon == 2 ? "DRAW" : "Player " + (whoWon + 1) + " WON") + .setMessage(whoWon == 2 ? "Maybe next time" : "Congratulations to Player " + (whoWon + 1)) + .setCancelable(false) + .setPositiveButton("Request revenge", (dialog, which) -> { + revengeRequested = true; + room.child("revenge" + whoami).setValue(1); + }) + .setNegativeButton("Go to menu", (dialog, which) -> { + room.child("revenge" + whoami).setValue(0); + if (!revengePossible) { + room.removeValue(); + } + Intent intent = new Intent(OnlineGameActivity.this, MainActivity.class); + startActivity(intent); + }) + .setIcon(R.drawable.ic_baseline_gamepad_24); + fgAlert = alertBuilder.create(); + fgAlert.show(); } // CheckTripleEqualityOnGameBoard diff --git a/app/src/main/res/layout-land/activity_main.xml b/app/src/main/res/layout-land/activity_main.xml new file mode 100644 index 0000000..eb03ff8 --- /dev/null +++ b/app/src/main/res/layout-land/activity_main.xml @@ -0,0 +1,52 @@ +<?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"> +<LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:background="@mipmap/main_bg_foreground" + > + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + android:gravity="center" + android:text="Pai Fillo Nai" + android:textColor="@color/white" + android:textSize="60sp"/> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + android:padding="20dp" + > + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + android:gravity="center" + android:text="ONLINE" + android:id="@+id/txtvOnline" + android:layout_margin="20dp" + android:textColor="#03A9F4" + android:background="@drawable/bg_rounded_rectangle" + android:textSize="30sp"/> + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + android:gravity="center" + android:text="OFFLINE" + android:layout_margin="20dp" + android:textColor="#AAAAAA" + android:id="@+id/txtvOffline" + android:background="@drawable/bg_rounded_rectangle" + android:textSize="30sp"/> + </LinearLayout> +</LinearLayout> +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/app/src/main/res/layout-land/activity_online_game.xml b/app/src/main/res/layout-land/activity_online_game.xml new file mode 100644 index 0000000..19ff086 --- /dev/null +++ b/app/src/main/res/layout-land/activity_online_game.xml @@ -0,0 +1,133 @@ +<?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" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@mipmap/bg_offline_game_foreground" + tools:context=".OfflineGameActivity"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="horizontal"> + + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="2"> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="2" + android:layout_margin="20dp" + android:background="@drawable/bg_rounded_blue" + android:orientation="vertical"> + <TextView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + android:textSize="30sp" + android:textColor="@color/white" + android:gravity="center" + android:id="@+id/onPlayerName" + android:textAlignment="center" + android:text="Second Player (X)" /> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:id="@+id/p0Img" + android:src="@mipmap/bg_no_no_foreground" + android:layout_weight="1" /> + </LinearLayout> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" + android:background="@drawable/bg_rounded_grey" + android:layout_margin="5dp" + android:layout_weight="1"> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + android:padding="10dp"> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@mipmap/emptiness_foreground" + android:id="@+id/square0" + android:layout_margin="10dp" + android:layout_weight="1" /> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@mipmap/emptiness_foreground" + android:id="@+id/square1" + android:layout_margin="10dp" + android:layout_weight="1" /> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@mipmap/emptiness_foreground" + android:id="@+id/square2" + android:layout_margin="10dp" + android:layout_weight="1" /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + android:padding="10dp"> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@mipmap/emptiness_foreground" + android:id="@+id/square3" + android:layout_margin="10dp" + android:layout_weight="1" /> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@mipmap/emptiness_foreground" + android:id="@+id/square4" + android:layout_margin="10dp" + android:layout_weight="1" /> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@mipmap/emptiness_foreground" + android:id="@+id/square5" + android:layout_margin="10dp" + android:layout_weight="1" /> + </LinearLayout> + <LinearLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout_weight="1" + android:padding="10dp"> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@mipmap/emptiness_foreground" + android:id="@+id/square6" + android:layout_margin="10dp" + android:layout_weight="1" /> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@mipmap/emptiness_foreground" + android:id="@+id/square7" + android:layout_margin="10dp" + android:layout_weight="1" /> + <ImageView + android:layout_width="match_parent" + android:layout_height="match_parent" + android:src="@mipmap/emptiness_foreground" + android:id="@+id/square8" + android:layout_margin="10dp" + android:layout_weight="1" /> + </LinearLayout> + </LinearLayout> + </LinearLayout> +</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file diff --git a/build.gradle b/build.gradle index a95d7d0..62bb4b1 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ buildscript { dependencies { -// classpath 'com.google.gms:google-services:4.3.10' + classpath 'com.google.gms:google-services:4.3.14' } }// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { |
