Render.ru
Поддержать
Cibergod
ПОДПИСАТЬСЯ
  • ПРЕДЛОЖИТЬ ПРОЕКТ
  • ДОБАВИТЬ В КОНТАКТЫ
20Записей
9Следят
0Читает
127 KЗаходов
Cibergod

Проект игры ХО на Android

Урок

Проект игры ХО на Android

 
 

 

 


Видео урок по созданию игры ХО для Android устройств


1) Создаем пустой проект

2) Создаем формы (активности)

3) Экспортируем картинки в  проект

4) Описываем переключение между активностями

5) Описываем игровой процесс

6) Описываем завершение игры

Описание формы activity_main_menu.xml

<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=".MainMenu">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true">

        <Button
            android:layout_width="203dp"
            android:layout_height="wrap_content"
            android:text="@string/StartButton"
            android:id="@+id/button"
            android:layout_gravity="center"
            android:onClick="OnClick" />
    </FrameLayout>
</RelativeLayout>

MainMenu.java

package com.example.vladimir.xoproject;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
/**поктлючаем тим дпнных VieW*/
import  android.view.View;
public class MainMenu extends AppCompatActivity {
    SelectXO SXO= new SelectXO();

    public void OnClick(View view)
    {
        Intent i = new Intent(this, SXO.getClass());

        startActivity(i);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_menu);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main_menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Описание формы activity_select_xo.xml

- <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="com.example.vladimir.xoproject.SelectXO">
- <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentBottom="true" android:layout_alignParentEnd="true">
  <ImageButton android:layout_width="150dp" android:layout_height="150dp" android:id="@+id/imageButton" android:layout_gravity="center_horizontal|top" android:src="@drawable/krest" android:scaleType="fitXY" android:onClick="OnClick" /> 
  <ImageButton android:layout_width="150dp" android:layout_height="150dp" android:id="@+id/imageButton2" android:layout_gravity="center_horizontal|bottom" android:src="@drawable/nolik" android:scaleType="fitXY" android:onClick="OnClick" /> 
  </FrameLayout>
  <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_alignParentBottom="true" android:layout_alignParentStart="true" /> 
  </RelativeLayout>

SelectXO.java

package com.example.vladimir.xoproject;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

public class SelectXO extends AppCompatActivity {
    MainGame SMG = new MainGame();

    public void OnClick(View view)
    {

        switch (view.getId() )
        {
            case R.id.imageButton:
                SMG.Player=1;
                SMG.Comp =2;

                break;
            case R.id.imageButton2:
                SMG.Player=2;
                SMG.Comp =1;
                break;
        }
        Intent i = new Intent(this, SMG.getClass());
        startActivity(i);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_select_xo);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_select_xo, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Описание формы activity_main_game.xml

- <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="com.example.vladimir.xoproject.MainGame">
- <TableLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_alignParentStart="true">
- <TableRow android:layout_width="match_parent" android:layout_height="match_parent">
  <ImageButton android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/imageButton3" android:layout_column="0" android:src="@drawable/blank" android:scaleType="fitXY" android:onClick="OnClick" /> 
  <ImageButton android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/imageButton4" android:layout_column="1" android:src="@drawable/blank" android:scaleType="fitXY" android:onClick="OnClick" /> 
  <ImageButton android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/imageButton5" android:layout_column="2" android:src="@drawable/blank" android:scaleType="fitXY" android:onClick="OnClick" /> 
  </TableRow>
- <TableRow android:layout_width="match_parent" android:layout_height="match_parent">
  <ImageButton android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/imageButton6" android:layout_column="0" android:src="@drawable/blank" android:scaleType="fitXY" android:onClick="OnClick" /> 
  <ImageButton android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/imageButton7" android:layout_column="1" android:src="@drawable/blank" android:scaleType="fitXY" android:onClick="OnClick" /> 
  <ImageButton android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/imageButton8" android:layout_column="2" android:src="@drawable/blank" android:scaleType="fitXY" android:onClick="OnClick" /> 
  </TableRow>
- <TableRow android:layout_width="match_parent" android:layout_height="match_parent">
  <ImageButton android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/imageButton9" android:layout_column="0" android:src="@drawable/blank" android:scaleType="fitXY" android:onClick="OnClick" /> 
  <ImageButton android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/imageButton10" android:layout_column="1" android:src="@drawable/blank" android:scaleType="fitXY" android:onClick="OnClick" /> 
  <ImageButton android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/imageButton11" android:layout_column="2" android:src="@drawable/blank" android:scaleType="fitXY" android:onClick="OnClick" /> 
  </TableRow>
  </TableLayout>
  </RelativeLayout>

MainGame.java

package com.example.vladimir.xoproject;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageButton;
import android.view.View;
import java.util.Random;
import android.content.Intent;

public class MainGame extends AppCompatActivity {
    boolean PlayerStep = true;
    /**список кнопок */
    ImageButton[] Pole = new ImageButton[9];

    /*выбор игрока и компьютера будет записан в данные поля класса */
    static  int Player=0, Comp=0;

    /**игровое поле в цифровом виде*/
    int[] IntPole = {0,0,0,0,0,0,0,0,0};
    //функция отображения результата игры
    void ShowResultGame(int State)
    {
        //создаем класс результата игры
        ResultGame MyResultGame= new ResultGame();
        // передаем статус игры
        MyResultGame.StateGame=State;
        //Создаем класс окна
        Intent i = new Intent(this, MyResultGame.getClass());
        //отображаем результат на экране
        startActivity(i);

    }

    void ChangeImage(int IndexButton, int IndexImg)
    {
        //если поле пустое то меняем картинку
        if (IntPole[IndexButton]==0)
        {
            //в зависимости от номера картинки меняем ее на кнопке на указанную
            switch (IndexImg)
            {
                case 1:
                    Pole[IndexButton].setImageResource(R.drawable.krest);
                    break;
                case 2:
                    Pole[IndexButton].setImageResource(R.drawable.nolik);
                    break;

            }
            //сохраняем ход в массиве
            IntPole[IndexButton]=IndexImg;
        }

    }

    //функция проверки выиграша
    boolean WhoWin()
    {
        //список вариантов выигрышных комбинаций
        int[][] WinVariant =
                {      {    //1 вариант
                        1,1,1,  //Х Х Х
                        0,0,0,  //_ _ _
                        0,0,0   //_ _ _
                }, {    //2 вариант
                        0,0,0,  //_ _ _
                        1,1,1,  //Х Х Х
                        0,0,0   //_ _ _
                }, {    //3 вариант
                        0,0,0,  //_ _ _
                        0,0,0,  //_ _ _
                        1,1,1   //Х Х Х
                }, {    //4 вариант
                        1,0,0,  //Х _ _
                        1,0,0,  //Х _ _
                        1,0,0   //Х _ _
                }, {    //5 вариант
                        0,1,0,  //_ Х _
                        0,1,0,  //_ Х _
                        0,1,0   //_ Х _
                }, {    //6 вариант
                        0,0,1,  //_ _ Х
                        0,0,1,  //_ _ Х
                        0,0,1   //_ _ Х
                }, {    //7 вариант
                        1,0,0,  //Х _ _
                        0,1,0,  //_ Х _
                        0,0,1   //_ _ Х
                }, {    //8 вариант
                        0,0,1,   //_ _ Х
                        0,1,0,   //_ Х _
                        1,0,0    //Х _ _
                }
                };
        //Обьявляем поле игрока для проверки
        int[] TestMapPlayer = new int[9];
        //Обьявляем поле ПК для проверки
        int[] TestMapComp = new int[9];

        //перебираем поле и собираем отдельно значения игрока и ПК
        for(int I=0; I<9; I++)
        {
            //если значение совпало с номером игрока то записываем его поле
            if(IntPole[I]==Player) TestMapPlayer[I] = 1;

            //если значение совпало с номером игрока то записываем его в поле
            if(IntPole[I]==Comp) TestMapComp[I] = 1;

        }

        //выбираем вариант для сравнения
        for(int V = 0; V<8; V++)
        {
            //количество совпадений у ПК и игрока
            int  WinStateComp=0, WinStateUser=0;
            //Перебираем значения из варианта
            for(int Z=0; Z<9; Z++)
            {
                if(WinVariant[V][Z]==1)
                {
                    //если в поле игрока тоже 1 то увеличиваем значение совпадений
                    if(TestMapPlayer[Z]==1) WinStateUser++;
                    //если в поле компьютера 1 то увеличиваем значение совпадений
                    if(TestMapComp[Z]==1) WinStateComp++;

                }
            }
            //проверяем не выиграл ли кто то
            if(WinStateUser==3)
            {
                //выиграл Игрок
                ShowResultGame(1);
                return true;
            }
            if(WinStateComp ==3)
            {
                //выиграл ПК
                ShowResultGame(2);
                return true;
            }
        }
        return false;
    }
    //функция провекри возможности хода
    boolean canStep()
    {
        //перебираем все ячейки
        for(int I=0; I<9; I++ )
            //если есть еще ходы то ходим
            if(IntPole[I]==0)
                return  true;

        //иначе будем возвращать ложь
        return  false;
    }

    void StepPC()
    {
        //проверяем не выиграл ни кто то
        WhoWin();
        //создаем генератор случайных чисел
        Random R = new Random();
        //получаем случайное число
        int Index = R.nextInt(9);
        //пока не сделаем ход ходим
        while ((!PlayerStep)&&(canStep()))
        {
            //если поле пустое то ходим
            if(IntPole[Index]==0)
            {
                ChangeImage(Index,Comp);
                PlayerStep=true;
            }else
            {
                //находим другую клетку случайным образом
                Index = R.nextInt(9);
            }
        }
        //если есть еще ходы пробуем ходить
        if((canStep()==false)&& (WhoWin()))
        //если ходы закончились то значит ничья
            ShowResultGame(0);

    }
    //функция обработки нажатия на кноаку
    public void OnClick(View view)
    {
        if(PlayerStep==true){
            int IndexButton=0;
            switch ( view.getId())
            {
                case  R.id.imageButton3: IndexButton=0; break;
                case  R.id.imageButton4: IndexButton=1; break;
                case  R.id.imageButton5: IndexButton=2; break;
                case  R.id.imageButton6: IndexButton=3; break;
                case  R.id.imageButton7: IndexButton=4; break;
                case  R.id.imageButton8: IndexButton=5; break;
                case  R.id.imageButton9: IndexButton=6; break;
                case  R.id.imageButton10: IndexButton=7; break;
                case  R.id.imageButton11: IndexButton=8; break;
            }
            //записывем ход и отображаем его на поле
            ChangeImage(IndexButton,Player);
            PlayerStep =false;
            StepPC();

        }else
        {
            StepPC();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_game);

        /**получаем 9 кнопок и загоняем их все в 1 массив */
        Pole[0] = (ImageButton)findViewById(R.id.imageButton3);
        Pole[1] = (ImageButton)findViewById(R.id.imageButton4);
        Pole[2] = (ImageButton)findViewById(R.id.imageButton5);
        Pole[3] = (ImageButton)findViewById(R.id.imageButton6);
        Pole[4] = (ImageButton)findViewById(R.id.imageButton7);
        Pole[5] = (ImageButton)findViewById(R.id.imageButton8);
        Pole[6] = (ImageButton)findViewById(R.id.imageButton9);
        Pole[7] = (ImageButton)findViewById(R.id.imageButton10);
        Pole[8] = (ImageButton)findViewById(R.id.imageButton11);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main_game, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Описание формы activity_result_game.xml

<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="com.example.vladimir.xoproject.ResultGame">
- <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_alignParentTop="true">
  <TextView android:layout_width="158dp" android:layout_height="49dp" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Ничья" android:id="@+id/GameResult" android:layout_gravity="center" android:textAlignment="center" /> 
  <Button android:layout_width="243dp" android:layout_height="wrap_content" android:text="В главное меню" android:id="@+id/button2" android:layout_gravity="center_horizontal|bottom" /> 
  </FrameLayout>
  </RelativeLayout>

ResultGame.java

package com.example.vladimir.xoproject;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class ResultGame extends AppCompatActivity {

    static int  StateGame=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result_game);

        TextView A = (TextView)findViewById(R.id.GameResult);

        switch (StateGame)
        {
            case 0: A.setText("Ничья");break;
            case 1: A.setText("Вы выиграли");break;
            case 2: A.setText("Вы проиграли");break;
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_result_game, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}


0
Комментарии:0
по поступлению