Android Open Source - Toe Game Activity






From Project

Back to project page Toe.

License

The source code is released under:

GNU General Public License

If you think the Android project Toe listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 * @author John Piser developer@earthblood.com
 */*from   ww w  . jav a 2s . co  m*/
 * Copyright (C) 2014 EARTHBLOOD, LLC
 *
 * This program 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.
 *
 * This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
 */
package com.earthblood.tictactoe.activity;

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v7.widget.GridLayout;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.earthblood.tictactoe.R;
import com.earthblood.tictactoe.contentprovider.GameContentProvider;
import com.earthblood.tictactoe.engine.ToeGame;
import com.earthblood.tictactoe.helper.GameDatabaseHelper;
import com.earthblood.tictactoe.helper.HapticFeedbackHelper;
import com.earthblood.tictactoe.helper.HtmlHelper;
import com.earthblood.tictactoe.strategy.ToeStrategy;
import com.earthblood.tictactoe.strategy.ToeStrategyExplicit;
import com.earthblood.tictactoe.util.GameBox;
import com.earthblood.tictactoe.util.GameSymbol;
import com.earthblood.tictactoe.util.GameWinPattern;
import com.google.inject.Inject;

import org.apache.commons.lang3.ArrayUtils;

import roboguice.activity.RoboFragmentActivity;
import roboguice.inject.ContentView;
import roboguice.inject.InjectView;

@ContentView(R.layout.activity_game)
public class GameActivity extends RoboFragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    @InjectView(R.id.game_grid_layout)             GridLayout gridLayout;
    @InjectView(R.id.message_turn_indicator_value) TextView messageTurnIndicatorValue;
    @InjectView(R.id.message_turn_indicator)       TextView getMessageTurnIndicator;
    @InjectView(R.id.new_game_button)              Button newGameButton;

    @Inject ToeGame toeGame;
    @Inject HapticFeedbackHelper hapticFeedbackHelper;
    @Inject HtmlHelper htmlHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setupTitle();
        initializeButtonFeedback();
        getSupportLoaderManager().initLoader(0, null, this);
    }

    private void setupTitle() {
        String gameType = toeGame.isOnePlayerGame()? toeGame.getSkill().toString() : getString(R.string.two_player);
        setTitle(htmlHelper.fromHtml(toeGame.titleHack(getString(R.string.app_name_short), gameType)));
    }

    private void initializeButtonFeedback(){
        for (GameBox gameBox : GameBox.values()) {
            Button button = (Button)gridLayout.findViewById(gameBox.layoutBoxId());
            hapticFeedbackHelper.addFeedbackToButton(button, HapticFeedbackHelper.VIBE_PATTERN_SHORT,HapticFeedbackHelper.VIBE_PATTERN_NO_REPEAT);
        }
        hapticFeedbackHelper.addFeedbackToButton(newGameButton, HapticFeedbackHelper.VIBE_PATTERN_SHORT, HapticFeedbackHelper.VIBE_PATTERN_NO_REPEAT);
    }

    private void highlightWinningPattern(GameWinPattern gameWinPattern) {
        for (int boxPosition : gameWinPattern.getBoxIds()) {
            Button button = (Button)gridLayout.findViewById(GameBox.byBoxPosition(boxPosition).layoutBoxId());
            button.setBackgroundResource(toeGame.getNumOfPlayers() == 1 ? R.drawable.custom_btn_seagull : R.drawable.custom_btn_orange);
        }
    }

    private void disableAllBoxes(){
        for (GameBox gameBox : GameBox.values()) {
            Button b = (Button)gridLayout.findViewById(gameBox.layoutBoxId());
            b.setEnabled(false);
        }
    }

    private void enableOpenBoxes(int[] selectedXBoxIds, int[] selectedOBoxIds) {
        int[] selectedBoxes = ArrayUtils.addAll(selectedXBoxIds, selectedOBoxIds);
        for (GameBox gameBox : GameBox.values()) {
            if(! ArrayUtils.contains(selectedBoxes, gameBox.boxPosition())){
                Button b = (Button)gridLayout.findViewById(gameBox.layoutBoxId());
                b.setEnabled(true);
            }
        }
    }

    private void startTurn(final int[] selectedXBoxIds, final int[] selectedOBoxIds) {
        if(toeGame.isAndroidTurn()){
            disableAllBoxes();

            //** SIMULATE AI
            Toast.makeText(this, R.string.computer_thinking, Toast.LENGTH_SHORT).show();
            final Runnable r = new Runnable() {
                public void run() {
                    toeGame.generateAndroidTurn(getContentResolver(), selectedXBoxIds, selectedOBoxIds);
                    hapticFeedbackHelper.vibrate(HapticFeedbackHelper.VIBE_PATTERN_SHORT, HapticFeedbackHelper.VIBE_PATTERN_NO_REPEAT);
                    enableOpenBoxes(selectedXBoxIds, selectedOBoxIds);
                }
            };
            gridLayout.postDelayed(r, 2000);
        }
    }

    private void endTurn(int[] selectedXBoxIds, int[] selectedOBoxIds, int totalBoxesSelected) {

        GameSymbol winningSymbol = GameSymbol.X;
        boolean allBoxesFilled = totalBoxesSelected == GameBox.values().length;
        GameWinPattern gameWinPattern = GameWinPattern.checkForWin(selectedXBoxIds);
        if(gameWinPattern == null){
            gameWinPattern = GameWinPattern.checkForWin(selectedOBoxIds);
            winningSymbol = GameSymbol.O;
        }
        refreshUI(allBoxesFilled, gameWinPattern, winningSymbol, selectedXBoxIds, selectedOBoxIds);
    }

    protected void refreshUI(boolean gameOverNoWinner, GameWinPattern gameWinPattern, GameSymbol winningSymbol, int[] selectedXBoxIds, int[] selectedOBoxIds) {

        if(gameWinPattern != null){
            //We Have a Winner
            hapticFeedbackHelper.vibrate(hapticFeedbackHelper.getWinningPattern(toeGame.symbolIsAndroid(winningSymbol)), HapticFeedbackHelper.VIBE_PATTERN_NO_REPEAT);
            disableAllBoxes();
            highlightWinningPattern(gameWinPattern);
            getMessageTurnIndicator.setText(getString(R.string.game_message_over));
            messageTurnIndicatorValue.setText(getString(R.string.game_message_wins, winningSymbol.getValue()));
        }
        else if(gameOverNoWinner){
            getMessageTurnIndicator.setText(getString(R.string.game_message_over));
            messageTurnIndicatorValue.setText(getString(R.string.game_message_draw));
        }
        else{
            //Next Turn
            getMessageTurnIndicator.setText(getString(R.string.message_turn_indicator));
            messageTurnIndicatorValue.setText(toeGame.getTurn().getValue());
            startTurn(selectedXBoxIds, selectedOBoxIds);
        }
    }

    /**
     * UI Interactions
     */
    public void chooseBox(View view){
        String boxIdString = getResources().getResourceEntryName(view.getId());
        int boxId = Integer.parseInt(boxIdString.substring(boxIdString.length() - 1));

        ToeStrategy strategy = new ToeStrategyExplicit(boxId, toeGame.getTurn());
        toeGame.chooseBox(getContentResolver(), strategy);
    }
    public void newGame(View view){
        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }

    /**
     * LoaderManager Callbacks
     */
    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        String[] projection = {GameDatabaseHelper.COLUMN_ID, GameDatabaseHelper.COLUMN_GAME_BOX_ID, GameDatabaseHelper.COLUMN_GAME_SYMBOL_ID};
        CursorLoader cursorLoader = new CursorLoader(this, GameContentProvider.CONTENT_URI, projection, null, null, GameDatabaseHelper.COLUMN_GAME_BOX_ID + GameDatabaseHelper.SORT_DIRECTION);
        return cursorLoader;

    }
    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

        int[] XIds = new int[9];
        int countX = 0;
        int[] OIds = new int[9];
        int countO = 0;

        data.moveToFirst();

        while (data.isAfterLast() == false) {

            int boxId = data.getInt(1);
            int gameSymbolId = data.getInt(2);

            if(GameSymbol.X.getId() == gameSymbolId){
                XIds[countX++] = boxId;
            }
            else{
                OIds[countO++] = boxId;
            }
            Button button = (Button) gridLayout.findViewById(GameBox.byLayoutId(boxId).layoutBoxId());
            button.setText(GameSymbol.byId(gameSymbolId).getValue());
            button.setEnabled(false);
            data.moveToNext();
        }
        if(toeGame.inProgress()){
            endTurn(XIds, OIds, data.getCount());
        }
    }
    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
    }
}




Java Source Code List

com.earthblood.tictactoe.activity.GameActivity.java
com.earthblood.tictactoe.activity.MainActivity.java
com.earthblood.tictactoe.application.Toe.java
com.earthblood.tictactoe.contentprovider.GameContentProvider.java
com.earthblood.tictactoe.engine.ToeGame.java
com.earthblood.tictactoe.guice.ToeRoboModule.java
com.earthblood.tictactoe.helper.CoinTossHelper.java
com.earthblood.tictactoe.helper.GameDatabaseHelper.java
com.earthblood.tictactoe.helper.HapticFeedbackHelper.java
com.earthblood.tictactoe.helper.HtmlHelper.java
com.earthblood.tictactoe.helper.PreferenceHelperImpl.java
com.earthblood.tictactoe.helper.PreferenceHelper.java
com.earthblood.tictactoe.strategy.StrategyItemPatternDetector.java
com.earthblood.tictactoe.strategy.StrategyItemPickMiddleBox.java
com.earthblood.tictactoe.strategy.StrategyItemPickRandomBox.java
com.earthblood.tictactoe.strategy.StrategyItem.java
com.earthblood.tictactoe.strategy.ToeStrategyBase.java
com.earthblood.tictactoe.strategy.ToeStrategyEasy.java
com.earthblood.tictactoe.strategy.ToeStrategyExplicit.java
com.earthblood.tictactoe.strategy.ToeStrategyHard.java
com.earthblood.tictactoe.strategy.ToeStrategyNormal.java
com.earthblood.tictactoe.strategy.ToeStrategyVeryHard.java
com.earthblood.tictactoe.strategy.ToeStrategy.java
com.earthblood.tictactoe.util.GameBox.java
com.earthblood.tictactoe.util.GamePreference.java
com.earthblood.tictactoe.util.GameStatus.java
com.earthblood.tictactoe.util.GameSymbol.java
com.earthblood.tictactoe.util.GameWinPattern.java
com.earthblood.tictactoe.util.Skill.java