Проект игры ХО на 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);
}
}