River Flood

There is a patchwork of colours. You navigate from one corner to another by clicking on a colour. You have to avoid the house/s.

Stringsapp/res/values/strings.xml
Screen formatapp/res/layout/activity_main.xml
Code for appapp/java/com.(the project name)/MainActivity
Code for colour gridviewapp/java/com.(the project name)/ImageColour
Code for tile gridviewapp/java/com.(the project name)/ImageTile



app/manifests/AndroidManifest.xml - to force orientation

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.edkins.mosaic" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>


app/res/drawable - pictures

There are a number of colour images (one of them is a house). Some are, in fact, not used as I was allowing for more hazrds but decided they were unecessary.




app/res/mipmap/ic_launcher.png/ - icon for launching app




app/res/values/strings.xml - strings

<resources> <string name="app_name">Flood!</string> <string name="howTo">Tap above to direct water from pale to dark blue</string> <string name="finished">Success! Moves=</string> <string name="failure">You have flooded the house! Tap on NEW</string> <string name="clearMessage">new</string> <string name="quick">quick</string> <string name="slow">slow</string> <string name="easy">easy</string> <string name="medium">medium</string> <string name="hard">harder</string> <string name="hardest">very hard</string> </resources>


app/res/layout/activity_main.xml - screen format

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <GridView android:id="@+id/colourView" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:text="@string/howTo" android:layout_below="@id/colourView" /> <GridView android:id="@+id/tileView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="@dimen/activity_vertical_margin" android:layout_below="@id/message" /> <Button android:id="@+id/clearButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/clearMessage" android:onClick="doClear" android:paddingTop="@dimen/activity_vertical_margin" android:layout_below="@id/tileView" /> <RadioGroup xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/speed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:orientation="vertical" android:layout_below="@id/tileView" android:layout_toRightOf="@id/clearButton" android:layout_toEndOf="@id/clearButton" > <RadioButton android:id="@+id/quick" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/quick" android:onClick="doQuicker" /> <RadioButton android:id="@+id/slow" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/slow" android:onClick="doSlower" /> </RadioGroup> <RadioGroup xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/difficulty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" android:layout_below="@id/tileView" android:layout_toRightOf="@id/speed" android:layout_toEndOf="@id/speed" > <RadioButton android:id="@+id/easy" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/easy" android:onClick="doEasy" /> <RadioButton android:id="@+id/medium" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/medium" android:onClick="doMedium" /> <RadioButton android:id="@+id/hard" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hard" android:onClick="doHard" /> <RadioButton android:id="@+id/hardest" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hardest" android:onClick="doHardest" /> </RadioGroup> </RelativeLayout>


app/java/com.(the project name)/MainActivity - main code for app

package com.edkins.flood; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.GridView; import android.widget.RadioButton; import android.widget.TextView; import android.widget.Toast; import java.util.Random; public class MainActivity extends AppCompatActivity { public static int colourNum = 6; public static int colourType = -1; public static int floodWidth = 12; public static int floodSize = floodWidth * floodWidth; public static int difficulty = 1; public static int count = 0; public static int ok; public static int finish; public static int fail; public static int [] tile = new int [400]; static Random myRand = new Random(); protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RadioButton size = (RadioButton) findViewById(R.id.quick); size.setChecked(true); floodWidth = 12; floodSize = floodWidth * floodWidth; RadioButton acc = (RadioButton) findViewById(R.id.easy); acc.setChecked(true); difficulty = 1; GridView colour = (GridView) findViewById(R.id.colourView); colour.setNumColumns(colourNum); colour.setAdapter(new ImageColour(this)); colour.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { processColourClick(position); } }); setUp(); GridView tile = (GridView) findViewById(R.id.tileView); tile.setNumColumns(floodWidth); tile.setAdapter(new ImageTile(this)); tile.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { Toast.makeText(MainActivity.this, "Do not tap here!", Toast.LENGTH_SHORT).show(); } }); } public void processColourClick(int position) { if (fail == 1 || finish == 1) {return;} colourType = position + 10; count++; finish=0; fail=0; ok=1; while (ok==1) { ok = 0; for (int i = 0; i < floodSize; i++) { if (tile [i]==0) { int y = i / floodWidth; int x = i % floodWidth; checkNext(x, y - 1); checkNext(x, y + 1); checkNext(x - 1, y); checkNext(x + 1, y); } } } if (fail == 1) { TextView finish = (TextView) findViewById(R.id.message); finish.setText(R.string.failure); } else if (finish == 1) {hooray();} redo(); } public void checkNext(int x, int y) { if (x<0 || x>=floodWidth || y<0 || y>=floodWidth) {return;} int j = y*floodWidth + x; if (tile [j]==colourType) { tile [j] = 0; ok = 1; } else if (tile [j]==1) {finish=1;} else if (tile [j]==2) {fail=1;} } public void setUp() { colourType = -1; fail = 0; finish = 0; TextView newMessage = (TextView) findViewById(R.id.message); newMessage.setText(R.string.howTo); floodSize = floodWidth * floodWidth; count = 0; for (int i=0; i<floodSize;i++) {tile[i] = myRand.nextInt(colourNum)+10;} int c0 = 0; int c1 = floodWidth - 1; int c2=floodSize-1; int c3=floodSize-floodWidth; int start=-1; int end=-1; int house=-1; int r; r = myRand.nextInt(4); if (r==0) {start=c0;} else if (r==1) {start=c1;} else if (r==2) {start=c2;} else if (r==3) {start=c3;} if (difficulty<4) { if (start==c0) {end=c2;} else if (start==c1) {end=c3;} else if (start==c2) {end=c0;} else if (start==c3) {end=c1;} } if (difficulty==2) { int h0 = wobble(c0,1,1); int h1 = wobble(c1,-1,1); int h2 = wobble(c2,-1,-1); int h3 = wobble(c3,1,-1); r = myRand.nextInt(2); if ((start==c0 || start==c2) && r==0) {house=h1;} else if ((start==c0 || start==c2) && r==1) {house=h3;} else if ((start==c1 || start==c3) && r==0) {house=h0;} else if ((start==c1 || start==c3) && r==1) {house=h2;} } if (difficulty==3) {house=(floodSize-floodWidth)/2;} if (difficulty==4) { int h0 = floodWidth/2 + floodWidth; int h1 = floodSize/2 + 1; int h2 = floodSize - floodWidth/2 - floodWidth; int h3 = floodSize/2 - 2; if (floodWidth>12) { h0 = h0 + floodWidth; h1 = h1 + 1; h2 = h2 - floodWidth; h3 = h3 - 1; } r = myRand.nextInt(2); if (start==c0 && r==0) {end=c1; house=h0; tile[h2]=2;} else if (start==c0 && r==1) {end=c3; house=h1; tile[h3]=2;} else if (start==c1 && r==0) {end=c2; house=h1; tile[h3]=2;} else if (start==c1 && r==1) {end=c0; house=h0; tile[h2]=2;} else if (start==c2 && r==0) {end=c3; house=h0; tile[h2]=2;} else if (start==c2 && r==1) {end=c1; house=h1; tile[h3]=2;} else if (start==c3 && r==0) {end=c0; house=h1; tile[h3]=2;} else if (start==c3 && r==1) {end=c2; house=h0; tile[h2]=2;} } tile[start]=0; tile[end]=1; if (difficulty > 1) {tile[house]=2;} } public int wobble(int position, int xi, int yi) { int x = position % floodWidth; int y = position / floodWidth; int amount = 3; if (floodWidth>12) {amount = 5;} x = x + xi * myRand.nextInt(amount); y = y + yi * myRand.nextInt(amount); return x + floodWidth * y; } public void hooray() { String str=getString(R.string.finished)+count; TextView finish = (TextView) findViewById(R.id.message); finish.setText(str); for (int i=0; i<floodSize;i++) { if (tile[i]==0) {tile[i] = 1;} } } public void doClear(View view) { setUp(); redo(); } public void doQuicker(View view) {floodWidth = 12; setUp(); redo();} public void doSlower(View view) {floodWidth = 20; setUp(); redo();} public void doEasy(View view) {difficulty=1; setUp(); redo();} public void doMedium(View view) {difficulty=2; setUp(); redo();} public void doHard(View view) {difficulty=3; setUp(); redo();} public void doHardest(View view) {difficulty=4; setUp(); redo();} public void redo() { GridView tile = (GridView) findViewById(R.id.tileView); tile.setNumColumns(floodWidth); tile.setAdapter(new ImageTile(this)); } // Colours - initialises palette public static Integer[] colour = { R.drawable.colour0, R.drawable.colour1, R.drawable.colour2, R.drawable.colour3, R.drawable.colour4, R.drawable.colour5, R.drawable.colour6, R.drawable.colour7, R.drawable.colour8, R.drawable.colour9, R.drawable.colour10, R.drawable.colour11, R.drawable.colour12, R.drawable.colour13, R.drawable.colour14, R.drawable.colour15, }; }


app/java/com.(the project name)/ImageColour - code for colour gridview - a new file

package com.edkins.flood; import ... public class ImageColour extends BaseAdapter { private AppCompatActivity mContext; public ImageColour(AppCompatActivity c) {mContext = c;} public int getCount() {return MainActivity.colourNum;} public Object getItem(int position) {return null;} public long getItemId(int position) {return 0;} // create new ImageView for palette public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); } else { imageView = (ImageView) convertView; } // initialise the view element (to one of the colours) imageView.setImageResource(MainActivity.colour[position+10]); return imageView; } }


app/java/com.(the project name)/ImageTile - code for tile gridview - a new file

package com.edkins.flood; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; public class ImageTile extends BaseAdapter { private AppCompatActivity mContext; public ImageTile(AppCompatActivity c) {mContext = c;} public int getCount() {return MainActivity.floodSize;} public Object getItem(int position) {return null;} public long getItemId(int position) {return 0;} // create new ImageView for tile public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); GridView tileVw = (GridView) mContext.findViewById(R.id.tileView); int w = tileVw.getWidth() / MainActivity.floodWidth; imageView.setLayoutParams(new GridView.LayoutParams(w, w)); } else { imageView = (ImageView) convertView; } int sub = MainActivity.tile[position]; imageView.setImageResource(MainActivity.colour[sub]); return imageView; } }


Index to my other websites

© Jo Edkins 2016