diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2b75303 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +*.iml +.gradle +/local.properties +/.idea/caches +/.idea/libraries +/.idea/modules.xml +/.idea/workspace.xml +/.idea/navEditor.xml +/.idea/assetWizardSettings.xml +.DS_Store +/build +/captures +.externalNativeBuild diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..15a15b2 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..2996d53 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,15 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..37a7509 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml new file mode 100644 index 0000000..7f68460 --- /dev/null +++ b/.idea/runConfigurations.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/app/build.gradle b/app/build.gradle new file mode 100644 index 0000000..097fa85 --- /dev/null +++ b/app/build.gradle @@ -0,0 +1,28 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 28 + defaultConfig { + applicationId "com.connect.connect3" + minSdkVersion 19 + targetSdkVersion 28 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation 'com.android.support:appcompat-v7:28.0.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' +} diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro new file mode 100644 index 0000000..f1b4245 --- /dev/null +++ b/app/proguard-rules.pro @@ -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 diff --git a/app/release/app-release.apk b/app/release/app-release.apk new file mode 100644 index 0000000..3f7b06c Binary files /dev/null and b/app/release/app-release.apk differ diff --git a/app/release/output.json b/app/release/output.json new file mode 100644 index 0000000..c429e31 --- /dev/null +++ b/app/release/output.json @@ -0,0 +1 @@ +[{"outputType":{"type":"APK"},"apkData":{"type":"MAIN","splits":[],"versionCode":1,"versionName":"1.0","enabled":true,"outputFile":"app-release.apk","fullName":"release","baseName":"release"},"path":"app-release.apk","properties":{}}] \ No newline at end of file diff --git a/app/src/androidTest/java/com/example/connect3/ExampleInstrumentedTest.java b/app/src/androidTest/java/com/example/connect3/ExampleInstrumentedTest.java new file mode 100644 index 0000000..bb55886 --- /dev/null +++ b/app/src/androidTest/java/com/example/connect3/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.connect.connect3; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.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 Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class connectInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + assertEquals("com.connect.connect3", appContext.getPackageName()); + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..4b10526 --- /dev/null +++ b/app/src/main/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/ic_launcher-web.png b/app/src/main/ic_launcher-web.png new file mode 100644 index 0000000..93e7ea5 Binary files /dev/null and b/app/src/main/ic_launcher-web.png differ diff --git a/app/src/main/java/com/connect/connect3/MainActivity.java b/app/src/main/java/com/connect/connect3/MainActivity.java new file mode 100644 index 0000000..19dbaf7 --- /dev/null +++ b/app/src/main/java/com/connect/connect3/MainActivity.java @@ -0,0 +1,189 @@ +package com.connect.connect3; + +import android.media.Image; +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; +import android.view.Menu; +import android.view.MenuItem; +import android.view.View; +import android.widget.GridLayout; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +public class MainActivity extends AppCompatActivity +{ + // 0 = yellow, 1 = red + int activePlayer = 0; + boolean gameIsActive = true; + + // 2 means unplayed + int[] gameState = {2, 2, 2, 2, 2, 2, 2, 2, 2}; + + int[][] winningPositions = {{0,1,2}, {3,4,5}, {6,7,8}, {0,3,6}, {1,4,7}, {2,5,8}, {0,4,8}, {2,4,6}}; + + ImageView imageView, imageView2, imageView3, imageView4, imageView5, imageView6, imageView7, imageView8, imageView9; + + @Override + protected void onCreate(Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + imageView = (ImageView) findViewById(R.id.imageView); + imageView2 = (ImageView) findViewById(R.id.imageView2); + imageView3 = (ImageView) findViewById(R.id.imageView3); + imageView4 = (ImageView) findViewById(R.id.imageView4); + imageView5 = (ImageView) findViewById(R.id.imageView5); + imageView6 = (ImageView) findViewById(R.id.imageView6); + imageView7 = (ImageView) findViewById(R.id.imageView7); + imageView8 = (ImageView) findViewById(R.id.imageView8); + imageView9 = (ImageView) findViewById(R.id.imageView9); + + } + + public void dropIn(View view) + { + + ImageView counter = (ImageView) view; + + int tappedCounter = Integer.parseInt(counter.getTag().toString()); + + if (gameState[tappedCounter] == 2 && gameIsActive) + { + gameState[tappedCounter] = activePlayer; + + counter.setTranslationY(-1000f); + + if (activePlayer == 0) + { + counter.setImageResource(R.drawable.yellow); + activePlayer = 1; + } + else + { + counter.setImageResource(R.drawable.red); + activePlayer = 0; + } + + counter.animate().translationYBy(1000f).rotation(360).setDuration(300); + + for (int[] winningPosition : winningPositions) + { + + if (gameState[winningPosition[0]] == gameState[winningPosition[1]] && + gameState[winningPosition[1]] == gameState[winningPosition[2]] && + gameState[winningPosition[0]] != 2) + { + // Someone has won! + + gameIsActive = false; + + String winner = "Red"; + + if (gameState[winningPosition[0]] == 0) + { + + winner = "Yellow"; + + } + + TextView winnerMessage = (TextView) findViewById(R.id.winnerMessage); + + winnerMessage.setText(winner + " has won!"); + + LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout); + + layout.setVisibility(View.VISIBLE); + if (winner == "Red") + { + layout.setBackgroundResource(R.color.Red); + } + if (winner == "Yellow") + { + layout.setBackgroundResource(R.color.Yellow); + } + + } else { + + boolean gameIsOver = true; + + for (int counterState : gameState) { + + if (counterState == 2) gameIsOver = false; + + } + + if (gameIsOver) + { + + TextView winnerMessage = (TextView) findViewById(R.id.winnerMessage); + + winnerMessage.setText("It's a draw"); + + LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout); + + layout.setVisibility(View.VISIBLE); + layout.setBackgroundResource(R.color.Green); + + } + } + + } + } + } + + public void playAgain(View view) + { + gameIsActive = true; + + LinearLayout layout = (LinearLayout)findViewById(R.id.playAgainLayout); + + layout.setVisibility(View.INVISIBLE); + + activePlayer = 0; + + for (int i = 0; i < gameState.length; i++) + { + + gameState[i] = 2; + + } + + imageView.setImageResource(0); + imageView2.setImageResource(0); + imageView3.setImageResource(0); + imageView4.setImageResource(0); + imageView5.setImageResource(0); + imageView6.setImageResource(0); + imageView7.setImageResource(0); + imageView8.setImageResource(0); + imageView9.setImageResource(0); + + } + + + @Override + public boolean onCreateOptionsMenu(Menu menu) + { + // Inflate the menu; this adds items to the action bar if it is present. + getMenuInflater().inflate(R.menu.main_menu, menu); + return true; + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) + { + int id = item.getItemId(); + + if (id == R.id.action_exit) + { + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } + + +} + diff --git a/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 0000000..1f6bb29 --- /dev/null +++ b/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + diff --git a/app/src/main/res/drawable/board.png b/app/src/main/res/drawable/board.png new file mode 100644 index 0000000..95d5f75 Binary files /dev/null and b/app/src/main/res/drawable/board.png differ diff --git a/app/src/main/res/drawable/ic_launcher_background.xml b/app/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..2408e30 --- /dev/null +++ b/app/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/red.png b/app/src/main/res/drawable/red.png new file mode 100644 index 0000000..1956de5 Binary files /dev/null and b/app/src/main/res/drawable/red.png differ diff --git a/app/src/main/res/drawable/yellow.png b/app/src/main/res/drawable/yellow.png new file mode 100644 index 0000000..0ecb948 Binary files /dev/null and b/app/src/main/res/drawable/yellow.png differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..7757637 --- /dev/null +++ b/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +