/** * This file is part of Owlet. * * Owlet is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Owlet is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Owlet. If not, see <http://www.gnu.org/licenses/>. */ package com.sibext.owlet.tasks; import java.util.ArrayList; import java.util.LinkedList; import java.util.Random; import android.content.Context; import android.view.Gravity; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.RelativeLayout; import com.sibext.owlet.R; import com.sibext.owlet.activity.ScreenOfTaskActivity; import com.sibext.owlet.player.MediaPlayerSingleton; import com.sibext.owlet.view.BaseTaskImageView; import com.sibext.owlet.view.TaskImageView; import com.sibext.owlet.view.magic_square.View1; import com.sibext.owlet.view.magic_square.View2; import com.sibext.owlet.view.magic_square.View3; import com.sibext.owlet.view.magic_square.View4; import com.sibext.owlet.view.renderer.Renderer; import com.sibext.owlet.view.resourses.ButterflyView; import com.sibext.owlet.view.resourses.FigureView; import com.sibext.owlet.view.resourses.FruitView; import com.sibext.owlet.view.resourses.MashroomsView; import com.sibext.owlet.view.resourses.RedView; import com.sibext.owlet.view.resourses.SeaWorldView; import com.sibext.owlet.view.resourses.StarView; public class MagicSquareTask extends Task { private final static int FAIL_COUNT_LIMIT = 1; private int[] templateArray; private LinkedList<Integer> indexesOfEmptyCells; @Override protected Class<?>[] getCollectionOfView() { switch (complexity) { case COMPLEXITY_LOW: Class<?>[] collectionOfView = { FigureView.class, SeaWorldView.class, ButterflyView.class, MashroomsView.class, FruitView.class, StarView.class, RedView.class }; return collectionOfView; case COMPLEXITY_MEDIUM: Class<?>[] collectionOfView1 = { View3.class, View4.class, com.sibext.owlet.view.resourses.ButterflyView.class, }; return collectionOfView1; case COMPLEXITY_HIGH: Class<?>[] collectionOfView2 = { View1.class, View2.class, }; return collectionOfView2; //для отладки по дефолту ставим complexity=3, чтобы проверить все наборы в таске default: Class<?>[] collectionOfView3 = { View1.class, View2.class, View3.class, View4.class, com.sibext.owlet.view.systematisation.View1.class, com.sibext.owlet.view.systematisation.View2.class, com.sibext.owlet.view.systematisation.View3.class, com.sibext.owlet.view.systematisation.PeoplesSetView.class, com.sibext.owlet.view.systematisation.View5.class, FigureView.class, SeaWorldView.class, ButterflyView.class, MashroomsView.class, FruitView.class, StarView.class, RedView.class }; return collectionOfView3; } } public MagicSquareTask(Context context, TaskParamsContainer container) { super(MAGICSUARE_TASK_TYPE, MAGICSUARE_TASK_LEGTH_DEFAULT, R.string.task_types_message_magicsquare, context, container); templateArray = templateMagicSquareTask(); settingOfParameters( container.getBoardParams()[ScreenOfTaskActivity.MARGIN_LEFT_INDEX] + 20, container.getBoardParams()[ScreenOfTaskActivity.MARGIN_TOP_INDEX] + heightBoard + 7); // rand = new Random(); int empty1 = rand.nextInt(9); indexesOfEmptyCells = new LinkedList<Integer>(); switch (complexity) { case Task.COMPLEXITY_MEDIUM:{ colorFlag = rand.nextBoolean(); int empty2 = 0; do{ empty2 = rand.nextInt(9); } while(empty1==empty2); indexesOfEmptyCells.add(empty1); indexesOfEmptyCells.add(empty2); break; } case Task.COMPLEXITY_HIGH:{ colorFlag = false; int empty2 = 0; do{ empty2 = rand.nextInt(9); } while(empty1==empty2); int empty3 = 0; do{ empty3 = rand.nextInt(9); } while(empty1==empty3||empty1==empty3); indexesOfEmptyCells.add(empty1); indexesOfEmptyCells.add(empty2); indexesOfEmptyCells.add(empty3); break; } default://Task.COMPLEXITY_LOW colorFlag = true; indexesOfEmptyCells.add(empty1); break; } colors = selectColors(length); } private void settingOfParameters(int marginLeftAnswer, int marginTopAnswer) { int bound_size = context.getResources().getDimensionPixelSize(R.dimen.task_board_margin_up_down); heightTaskImage = (int) ((heightBoard - bound_size*1.5) / 3) - 2*DISTANCE_BETWEEN_IMAGES; widthTaskImage = heightTaskImage; widthAnswerImage = widthTaskImage; heightAnswerImage = widthAnswerImage; marginLeftAnswerImage = marginLeftAnswer; marginTopTaskImage = (int)(40+(heightBoard - 80 - 3*heightTaskImage)/2); marginLeftTaskImage = (int)(20+(widthBoard - 40 - 3*widthTaskImage)/2); marginTopAnswerImage = marginTopAnswer; } public int getEveryFailCountLimit(){ return FAIL_COUNT_LIMIT; } public ViewGroup taskBuildView(final Context context, ViewGroup layout, final RelativeLayout root) { int figureCount = templateArray.length; emptyCells = new ArrayList<TaskImageView>(); //choose random group generateImageGroupId(); for (int i = 0; i < figureCount; i++) { if (indexesOfEmptyCells.contains(i)) { //draw glassy square final TaskImageView img = new TaskImageView(context); FrameLayout.LayoutParams params = calcEveryPointOfBeginningDrawing(i); img.setLayoutParams(params); img.setupBackground(context, R.drawable.glassy_square); img.setCorrectAnswer(templateArray[i]); layout.addView(img); location = new int[2]; img.post(new Runnable() { public void run() { img.getLocationOnScreen(location); img.setCoordinate(location[0], location[1]); emptyCells.add(img); setQuestionImageOnHead(emptyCells); } }); } else { //draw image square Renderer renderer = new Renderer(); renderer.setId(templateArray[i]); renderer.setColorFlag(colorFlag); renderer.setColor(colors[templateArray[i]]); TaskImageView img = (TaskImageView)taskImageViewFactory(context,getImageGroupId(),renderer); FrameLayout.LayoutParams params = calcEveryPointOfBeginningDrawing(i); img.setLayoutParams(params); layout.addView(img); } } for (int i = 0; i < 3; i++) { //draw answer image Renderer renderer = new Renderer(); renderer.setId(templateArray[i]); renderer.setColorFlag(colorFlag); renderer.setColor(colors[templateArray[i]]); BaseTaskImageView img = (BaseTaskImageView)taskImageViewFactory(context, getImageGroupId(), renderer); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams( widthAnswerImage, heightAnswerImage); params.leftMargin = i * (widthAnswerImage+DISTANCE_BETWEEN_IMAGES) + marginLeftAnswerImage; params.topMargin = marginTopAnswerImage; img.setLeftMargin(params.leftMargin); img.setTopMargin(params.topMargin); img.setLayoutParams(params); img.setVariantAnswer(templateArray[i]); root.addView(img); img.setOnTouchListener(getMovebleListener(emptyCells)); answers.add(img); } return layout; } private FrameLayout.LayoutParams calcEveryPointOfBeginningDrawing(int s) { FrameLayout.LayoutParams params; int w = widthTaskImage-DISTANCE_BETWEEN_IMAGES; int h = heightTaskImage-DISTANCE_BETWEEN_IMAGES; int lm = 0; int tm = 0; if ((s == 1) || (s == 4) || (s == 7)) { tm = heightTaskImage; } else if ((s == 2) || (s == 5) || (s == 8)) { tm = 2 * heightTaskImage; } if ((s == 3) || (s == 4) || (s == 5)) { lm = widthTaskImage; } else if ((s == 0) || (s == 1) || (s == 2)) { lm = 2 * widthTaskImage; } params = new FrameLayout.LayoutParams(w, h, Gravity.TOP); params.leftMargin = lm + marginLeftTaskImage; params.topMargin = tm + marginTopTaskImage; return params; } private int[] templateMagicSquareTask() { int[] randArray= new int[3]; int[] reiterRandArray= new int[7]; int[] arrayForSquare1= new int[9]; int[] arrayForSquare2= new int[9]; //create random array (example: {1, 2, 3}) (really!!! {0,1,2}) Random random = new Random(); int j = 1+Math.abs( random.nextInt() ) % 2; for (int i = 0; i < 3; i++) { randArray[i]=(i+j)%3; } //copy from {1, 2, 3} to {1, 2, 3, 1, 2, 3, 1} (intermediate array) for (int i=0; i<2; i++) { System.arraycopy(randArray, 0, reiterRandArray, 3*i, 3); } System.arraycopy(randArray, 0, reiterRandArray, 6, 1); Random random1 = new Random(); int a = Math.abs( random1.nextInt() ) % 1; if (a==0) { //copy from {1, 2, 3, 1, 2, 3, 1} to {1, 2, 3, 2, 3, 1, 3, 1, 2} for (int i=0; i<3; i++) { System.arraycopy(reiterRandArray, i, arrayForSquare1, 3*i, 3); } return arrayForSquare1; } else //copy from {1, 2, 3, 1, 2, 3, 1} to {1, 2, 3, 3, 1, 2, 2, 3, 1} for (int i=0; i<3; i++) { System.arraycopy(reiterRandArray, i*2, arrayForSquare2, 3*i, 3); } return arrayForSquare2; } @Override public void playTaskMessage(MediaPlayerSingleton sound) { sound.play(R.raw.task_magicsquare_message); } }