aboutsummaryrefslogtreecommitdiff
path: root/app/src/main/java
diff options
context:
space:
mode:
authorCamil Staps2015-04-29 10:59:40 +0200
committerCamil Staps2015-04-29 10:59:40 +0200
commit240eaf2f0d5b2896232906277c7f2df2aaaeebd1 (patch)
tree1b84fa3f2437356e73044fc039f31c64efeb855b /app/src/main/java
parentMerge branch 'master' of github:camilstaps/RushHourAndroid into MainActivity (diff)
parentCleanup (diff)
Merge branch 'master' into MainActivity
Diffstat (limited to 'app/src/main/java')
-rw-r--r--app/src/main/java/com/camilstaps/rushhour/Board.java53
-rwxr-xr-xapp/src/main/java/com/camilstaps/rushhour/BoardLoader.java55
-rwxr-xr-x[-rw-r--r--]app/src/main/java/com/camilstaps/rushhour/Car.java61
-rw-r--r--app/src/main/java/com/camilstaps/rushhour/DriveListener.java8
-rwxr-xr-x[-rw-r--r--]app/src/main/java/com/camilstaps/rushhour/GamePlayActivity.java60
-rw-r--r--app/src/main/java/com/camilstaps/rushhour/HighScore.java40
-rw-r--r--app/src/main/java/com/camilstaps/rushhour/HighScoreList.java36
7 files changed, 275 insertions, 38 deletions
diff --git a/app/src/main/java/com/camilstaps/rushhour/Board.java b/app/src/main/java/com/camilstaps/rushhour/Board.java
index eeb2580..bdfb6d4 100644
--- a/app/src/main/java/com/camilstaps/rushhour/Board.java
+++ b/app/src/main/java/com/camilstaps/rushhour/Board.java
@@ -19,38 +19,75 @@ public class Board {
private DriveListener driveListener;
+ /**
+ * Move a car if possible, and call the appropriate listeners
+ */
private MoveListener moveListener = new MoveListener() {
@Override
public void onMove(Car car, int offset) {
Coordinate newC = car.wouldMoveTo(offset);
- if (newC.getY() > DIMENSION - 1 || newC.getX() > DIMENSION - 1 || newC.getX() < 0 || newC.getY() < 0) return;
- for (Car iter : cars)
- if (iter.occupies(newC))
+ if (newC.getY() > DIMENSION - 1 || newC.getX() > DIMENSION - 1 || newC.getX() < 0 || newC.getY() < 0) {
+ driveListener.onBlocked();
+ return;
+ }
+ for (Car iter : cars) {
+ if (iter.occupies(newC)) {
+ driveListener.onBlocked();
return;
+ }
+ }
car.move(offset);
driveListener.onDrive();
}
};
- public Board() {
- this(new HashSet<Car>());
- }
-
public Board(Set<Car> cars) {
for (Car car : cars) {
add(car);
}
}
+ public Board() {
+ this(new HashSet<Car>());
+ }
+
public void add(Car car) {
car.setMoveListener(moveListener);
cars.add(car);
}
+ /**
+ * Add all cars to an existing layout
+ * RelativeLayout is assumed, although this may work with other Layouts
+ * @param context
+ * @param layout
+ */
public void addToLayout(Context context, ViewGroup layout) {
for (Car car : cars) {
- layout.addView(car.getImageView(context, (layout.getWidth() - layout.getPaddingLeft() - layout.getPaddingRight()) / DIMENSION));
+ layout.addView(car.getImageView(
+ context,
+ (layout.getWidth() - layout.getPaddingLeft() - layout.getPaddingRight()) / DIMENSION
+ ));
+ }
+ }
+
+ /**
+ * True iff the red car can move out without problems
+ * @return
+ */
+ public boolean isSolved() {
+ for (int x = DIMENSION - 1; x >= 0; x++) {
+ for (Car car : cars) {
+ if (car.occupies(new Coordinate(x, 3))) {
+ if (car.canMoveHorizontally()) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ }
}
+ return false;
}
public void setDriveListener(DriveListener dl) {
diff --git a/app/src/main/java/com/camilstaps/rushhour/BoardLoader.java b/app/src/main/java/com/camilstaps/rushhour/BoardLoader.java
new file mode 100755
index 0000000..c92c96b
--- /dev/null
+++ b/app/src/main/java/com/camilstaps/rushhour/BoardLoader.java
@@ -0,0 +1,55 @@
+package com.camilstaps.rushhour;
+
+import android.graphics.Color;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Scanner;
+
+/**
+ * Created by Jos on 23-4-2015.
+ */
+public class BoardLoader {
+ public BoardLoader()
+ {}
+
+ public Board loadBoard(InputStream file)
+ {
+ /*
+ Level formaat:
+ 1 regel: Aantal auto's
+
+ voor iedere auto:
+ x1 y1 x2 y2 op een regel.
+ r g b op een regel.
+ */
+ Scanner scan = new Scanner(file);
+
+ Board board = new Board();
+
+ int numCars = scan.nextInt();
+ scan.nextLine();
+
+ for(int carN = 0; carN < numCars; carN++)
+ {
+ int x1 = scan.nextInt();
+ int y1 = scan.nextInt();
+ int x2 = scan.nextInt();
+ int y2 = scan.nextInt();
+ scan.nextLine();
+
+ int r = scan.nextInt();
+ int g = scan.nextInt();
+ int b = scan.nextInt();
+
+ Car c = new Car(new Coordinate(x1, y1), new Coordinate(x2, y2), Color.rgb(r, g, b));
+ board.add(c);
+
+ if(scan.hasNext()) scan.nextLine();
+ }
+
+ return board;
+ }
+}
diff --git a/app/src/main/java/com/camilstaps/rushhour/Car.java b/app/src/main/java/com/camilstaps/rushhour/Car.java
index 2dce203..faa5796 100644..100755
--- a/app/src/main/java/com/camilstaps/rushhour/Car.java
+++ b/app/src/main/java/com/camilstaps/rushhour/Car.java
@@ -11,6 +11,8 @@ import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TableLayout;
+import java.util.Random;
+
/**
* Created by camilstaps on 16-4-15.
*/
@@ -58,7 +60,40 @@ public class Car {
calculatedHeight = (int) ((endCoordinate.getY() - startCoordinate.getY() + 1) * (this.widthPerCell + MARGIN) - MARGIN);
iv = new ImageView(context);
- iv.setBackgroundColor(colour);
+
+ int[] images = null;
+ if(canMoveHorizontally()) {
+ if(getCarLength() == 2) {
+ images = new int[] {
+ R.drawable.car_1_white,
+ R.drawable.car_2_white,
+ R.drawable.car_3_white,
+ R.drawable.car_4_white};
+ }else{
+ images = new int[] {
+ R.drawable.truck_1_white,
+ R.drawable.truck_2_white,
+ R.drawable.truck_3_white,
+ R.drawable.truck_4_white};
+ }
+ }else{
+ if(getCarLength() == 2) {
+ images = new int[] {
+ R.drawable.car_1_white_vertical,
+ R.drawable.car_2_white_vertical,
+ R.drawable.car_3_white_vertical,
+ R.drawable.car_4_white_vertical};
+ }else{
+ images = new int[] {
+ R.drawable.truck_1_white_vertical,
+ R.drawable.truck_2_white_vertical,
+ R.drawable.truck_3_white_vertical,
+ R.drawable.truck_4_white_vertical};
+ }
+ }
+
+ iv.setImageResource(choose(images));
+ iv.setColorFilter(colour);
iv.setMinimumWidth(calculatedWidth);
iv.setMinimumHeight(calculatedHeight);
@@ -76,6 +111,30 @@ public class Car {
return iv;
}
+ private static int choose(int[] a)
+ {
+ Random r = new Random();
+ return a[r.nextInt(a.length)];
+ }
+
+ private float getCarDirection()
+ {
+ final double TWOPI = Math.PI * 2;
+ double radians = ((Math.atan2(startCoordinate.getY() - endCoordinate.getY(), endCoordinate.getX() - startCoordinate.getX()) + TWOPI) % TWOPI);
+ double degrees = radians / Math.PI * 180.0;
+
+ return (float)degrees;
+ }
+ private int getCarLength()
+ {
+ if(startCoordinate.getX() == endCoordinate.getX())
+ {
+ return endCoordinate.getY() - startCoordinate.getY() + 1;
+ }else{
+ return endCoordinate.getX() - startCoordinate.getX() + 1;
+ }
+ }
+
public boolean canMoveHorizontally() {
return startCoordinate.getY() == endCoordinate.getY();
}
diff --git a/app/src/main/java/com/camilstaps/rushhour/DriveListener.java b/app/src/main/java/com/camilstaps/rushhour/DriveListener.java
index f3a83e7..553c29f 100644
--- a/app/src/main/java/com/camilstaps/rushhour/DriveListener.java
+++ b/app/src/main/java/com/camilstaps/rushhour/DriveListener.java
@@ -4,5 +4,13 @@ package com.camilstaps.rushhour;
* Created by camilstaps on 22-4-15.
*/
public abstract class DriveListener {
+ /**
+ * Called when a car moves
+ */
public abstract void onDrive();
+
+ /**
+ * Called when a car attempted to move, but couldn't
+ */
+ public abstract void onBlocked();
}
diff --git a/app/src/main/java/com/camilstaps/rushhour/GamePlayActivity.java b/app/src/main/java/com/camilstaps/rushhour/GamePlayActivity.java
index 1c0b2ab..d7958c3 100644..100755
--- a/app/src/main/java/com/camilstaps/rushhour/GamePlayActivity.java
+++ b/app/src/main/java/com/camilstaps/rushhour/GamePlayActivity.java
@@ -1,17 +1,18 @@
package com.camilstaps.rushhour;
import android.app.Activity;
-import android.graphics.Color;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.view.ViewTreeObserver;
import android.widget.RelativeLayout;
+import java.io.InputStream;
+
public class GamePlayActivity extends Activity {
private SoundPool soundPool;
- private int soundBackgroundId, soundCarDriveId;
+ private int soundBackgroundId, soundCarDriveId, soundCantMoveId;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -19,31 +20,12 @@ public class GamePlayActivity extends Activity {
setContentView(R.layout.activity_fullscreen);
- final Board board = new Board();
- board.add(new Car(new Coordinate(0,0), new Coordinate(2,0), Color.YELLOW));
- board.add(new Car(new Coordinate(3,0), new Coordinate(3,1), Color.rgb(128,223,182)));
- board.add(new Car(new Coordinate(4,0), new Coordinate(4,2), Color.rgb(198, 134,221)));
- board.add(new Car(new Coordinate(0,2), new Coordinate(1,2), Color.RED));
- board.add(new Car(new Coordinate(5,2), new Coordinate(5,3), Color.rgb(255,165,0)));
- board.add(new Car(new Coordinate(0,3), new Coordinate(0,4), Color.rgb(158,231,246)));
- board.add(new Car(new Coordinate(1,3), new Coordinate(2,3), Color.rgb(245,158,246)));
- board.add(new Car(new Coordinate(3,3), new Coordinate(4,3), Color.rgb(150,126,196)));
- board.add(new Car(new Coordinate(1,4), new Coordinate(2,4), Color.GREEN));
- board.add(new Car(new Coordinate(3,4), new Coordinate(3,5), Color.BLACK));
- board.add(new Car(new Coordinate(5,4), new Coordinate(5,5), Color.rgb(219,202,161)));
- board.add(new Car(new Coordinate(0,5), new Coordinate(2,5), Color.rgb(25,195,167)));
+ setupSoundPool();
- soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
- soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
- @Override
- public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
- if (sampleId == soundBackgroundId) {
- soundPool.play(soundBackgroundId, 1, 1, 2, -1, 1);
- }
- }
- });
- soundCarDriveId = soundPool.load(this, R.raw.car_drive, 1);
- soundBackgroundId = soundPool.load(this, R.raw.tune, 2);
+ InputStream input = getResources().openRawResource(R.raw.level);
+
+ BoardLoader loader = new BoardLoader();
+ final Board board = loader.loadBoard(input);
final RelativeLayout boardLayout = (RelativeLayout) findViewById(R.id.board);
ViewTreeObserver vto = boardLayout.getViewTreeObserver();
@@ -55,11 +37,37 @@ public class GamePlayActivity extends Activity {
}
});
+ /*
+ * Sounds on move and attempt to move
+ */
board.setDriveListener(new DriveListener() {
@Override
public void onDrive() {
soundPool.play(soundCarDriveId, 1, 1, 1, 0, 1);
}
+
+ @Override
+ public void onBlocked() {
+ soundPool.play(soundCantMoveId, 1, 1, 1, 0, 1);
+ }
+ });
+ }
+
+ /**
+ * Load sounds; start background music
+ */
+ protected void setupSoundPool() {
+ soundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
+ soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
+ @Override
+ public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
+ if (sampleId == soundBackgroundId) {
+ soundPool.play(soundBackgroundId, 1, 1, 2, -1, 1);
+ }
+ }
});
+ soundBackgroundId = soundPool.load(this, R.raw.tune, 2);
+ soundCarDriveId = soundPool.load(this, R.raw.car_drive, 1);
+ soundCantMoveId = soundPool.load(this, R.raw.cantmove, 1);
}
}
diff --git a/app/src/main/java/com/camilstaps/rushhour/HighScore.java b/app/src/main/java/com/camilstaps/rushhour/HighScore.java
index ce5e001..9168f02 100644
--- a/app/src/main/java/com/camilstaps/rushhour/HighScore.java
+++ b/app/src/main/java/com/camilstaps/rushhour/HighScore.java
@@ -1,5 +1,8 @@
package com.camilstaps.rushhour;
+import org.json.JSONException;
+import org.json.JSONObject;
+
/**
* Created by camilstaps on 23-4-15.
* Edited by Halzyn on 23-4-15.
@@ -14,6 +17,24 @@ public class HighScore implements Comparable<HighScore> {
this.name = name;
}
+ /**
+ * HighScore from json
+ * @see #toString()
+ * @param jsonString
+ */
+ public HighScore(String jsonString) {
+ int temp_score = -1;
+ String temp_name = null;
+ try {
+ JSONObject json = new JSONObject(jsonString);
+ temp_score = json.getInt("score");
+ temp_name = json.getString("name");
+ } catch (JSONException e) {
+ }
+ score = temp_score;
+ name = temp_name;
+ }
+
public int getScore() {
return score;
}
@@ -24,11 +45,11 @@ public class HighScore implements Comparable<HighScore> {
@Override
public int compareTo(HighScore other_score) {
- if (other_score.getScore() < score)
+ if (other_score.score < score)
{
return -1;
}
- else if (other_score.getScore() == score)
+ else if (other_score.score == score)
{
return 0;
}
@@ -38,4 +59,19 @@ public class HighScore implements Comparable<HighScore> {
}
}
+ /**
+ * JSON representation
+ * @see #HighScore(String)
+ * @return
+ */
+ public String toString() {
+ JSONObject json = new JSONObject();
+ try {
+ json.put("score", score);
+ json.put("name", name);
+ } catch (JSONException ex) {
+ }
+ return json.toString();
+ }
+
}
diff --git a/app/src/main/java/com/camilstaps/rushhour/HighScoreList.java b/app/src/main/java/com/camilstaps/rushhour/HighScoreList.java
index c0a7e67..4d8f829 100644
--- a/app/src/main/java/com/camilstaps/rushhour/HighScoreList.java
+++ b/app/src/main/java/com/camilstaps/rushhour/HighScoreList.java
@@ -3,27 +3,61 @@
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
-package rushhour;
+package com.camilstaps.rushhour;
+
+import android.content.Context;
+import android.preference.PreferenceManager;
import java.util.Collections;
+import java.util.HashSet;
import java.util.List;
+import java.util.Set;
/**
*
* @author Created by halzyn on 23-4-15.
*/
public class HighScoreList {
+
+ private final String PREFERENCES_KEY = "highscores";
private List<HighScore> list;
public HighScoreList (List<HighScore> some_list) {
this.list = some_list;
}
+
+ /**
+ * Get highscores from sharedpreferences
+ * @param context
+ */
+ public HighScoreList(Context context) {
+ Set<String> jsonList = PreferenceManager.getDefaultSharedPreferences(context).getStringSet(PREFERENCES_KEY, new HashSet<String>());
+ for (String json : jsonList) {
+ list.add(new HighScore(json));
+ }
+ }
+
+ public List<HighScore> getList() {
+ return list;
+ }
public void addToList(HighScore score)
{
list.add(score);
Collections.sort(list);
}
+
+ /**
+ * Save highscores to sharedpreferences
+ * @param context
+ */
+ public void save(Context context) {
+ Set<String> jsonList = new HashSet<>();
+ for (HighScore hs : list) {
+ jsonList.add(hs.toString());
+ }
+ PreferenceManager.getDefaultSharedPreferences(context).edit().putStringSet(PREFERENCES_KEY, jsonList).apply();
+ }
}