diff options
author | Camil Staps | 2015-04-29 10:59:40 +0200 |
---|---|---|
committer | Camil Staps | 2015-04-29 10:59:40 +0200 |
commit | 240eaf2f0d5b2896232906277c7f2df2aaaeebd1 (patch) | |
tree | 1b84fa3f2437356e73044fc039f31c64efeb855b /app/src/main/java | |
parent | Merge branch 'master' of github:camilstaps/RushHourAndroid into MainActivity (diff) | |
parent | Cleanup (diff) |
Merge branch 'master' into MainActivity
Diffstat (limited to 'app/src/main/java')
-rw-r--r-- | app/src/main/java/com/camilstaps/rushhour/Board.java | 53 | ||||
-rwxr-xr-x | app/src/main/java/com/camilstaps/rushhour/BoardLoader.java | 55 | ||||
-rwxr-xr-x[-rw-r--r--] | app/src/main/java/com/camilstaps/rushhour/Car.java | 61 | ||||
-rw-r--r-- | app/src/main/java/com/camilstaps/rushhour/DriveListener.java | 8 | ||||
-rwxr-xr-x[-rw-r--r--] | app/src/main/java/com/camilstaps/rushhour/GamePlayActivity.java | 60 | ||||
-rw-r--r-- | app/src/main/java/com/camilstaps/rushhour/HighScore.java | 40 | ||||
-rw-r--r-- | app/src/main/java/com/camilstaps/rushhour/HighScoreList.java | 36 |
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(); + } } |