198 lines
6.1 KiB
Java
198 lines
6.1 KiB
Java
package com.example.tictactoeapplut;
|
|
|
|
import android.annotation.SuppressLint;
|
|
import android.content.Context;
|
|
import android.content.res.TypedArray;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Paint;
|
|
import android.util.AttributeSet;
|
|
import android.view.MotionEvent;
|
|
import android.view.View;
|
|
import android.widget.Button;
|
|
import android.widget.TextView;
|
|
|
|
import androidx.annotation.Nullable;
|
|
|
|
public class Board extends View {
|
|
|
|
private final int boardColor;
|
|
private final int XColor;
|
|
private final int OColor;
|
|
private final int winColor;
|
|
private int cellSize = getWidth()/3;
|
|
private final Paint paint = new Paint();
|
|
private final Move game;
|
|
private boolean winLine = false;
|
|
|
|
public Board(Context context, @Nullable AttributeSet attrs) {
|
|
super(context, attrs);
|
|
game = new Move(context);
|
|
|
|
TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.Board,0,0);
|
|
|
|
try {
|
|
boardColor = a.getInteger(R.styleable.Board_boardColor, 0);
|
|
XColor = a.getInteger(R.styleable.Board_XColor, 0);
|
|
OColor = a.getInteger(R.styleable.Board_OColor, 0);
|
|
winColor = a.getInteger(R.styleable.Board_winColor, 0);
|
|
|
|
} finally {
|
|
a.recycle();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void onMeasure(int width, int height) {
|
|
super.onMeasure(width, height);
|
|
|
|
int size = Math.min(getMeasuredWidth(), getMeasuredHeight());
|
|
cellSize = size/3;
|
|
|
|
setMeasuredDimension(size, size);
|
|
}
|
|
|
|
@Override
|
|
protected void onDraw(Canvas canvas) {
|
|
paint.setStyle(Paint.Style.STROKE);
|
|
paint.setAntiAlias(true);
|
|
|
|
drawBoard(canvas);
|
|
drawMove(canvas);
|
|
|
|
if (winLine) {
|
|
paint.setColor(winColor);
|
|
drawWinLine(canvas);
|
|
|
|
}
|
|
}
|
|
|
|
@SuppressLint("ClickableViewAccessibility")
|
|
@Override
|
|
public boolean onTouchEvent(MotionEvent event) {
|
|
float x = event.getX();
|
|
float y = event.getY();
|
|
|
|
int action = event.getAction();
|
|
if (action == MotionEvent.ACTION_DOWN) {
|
|
int row = (int) Math.ceil(y/cellSize);
|
|
int column = (int) Math.ceil(x/cellSize);
|
|
if (!winLine) {
|
|
if (game.updateBoard(row, column)) {
|
|
invalidate();
|
|
if (game.winCheck()) {
|
|
winLine = true;
|
|
invalidate();
|
|
}
|
|
if (game.getPlayer() % 2 == 0) {
|
|
game.setPlayer(game.getPlayer() - 1);
|
|
} else {
|
|
game.setPlayer(game.getPlayer() + 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
invalidate();
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private void drawBoard(Canvas canvas) {
|
|
paint.setColor(boardColor);
|
|
paint.setStrokeWidth(16);
|
|
for (int x=1; x<3; x++) {
|
|
canvas.drawLine(cellSize*x, 0, cellSize*x, canvas.getWidth(), paint);
|
|
}
|
|
|
|
for (int y=1; y<3; y++) {
|
|
canvas.drawLine(0, cellSize*y, canvas.getWidth(), cellSize*y, paint);
|
|
}
|
|
paint.setStrokeWidth(32);
|
|
canvas.drawLine(0,0,cellSize*3,0,paint);
|
|
paint.setStrokeWidth(32);
|
|
canvas.drawLine(0,cellSize*3,cellSize*3,cellSize*3,paint);
|
|
paint.setStrokeWidth(16);
|
|
canvas.drawLine(0,0,0,cellSize*3,paint);
|
|
paint.setStrokeWidth(16);
|
|
canvas.drawLine(cellSize*3,0,cellSize*3,cellSize*3,paint);
|
|
}
|
|
|
|
private void drawMove(Canvas canvas) {
|
|
for (int r=0; r<3; r++) {
|
|
for (int c=0; c<3; c++) {
|
|
if (game.getBoard()[r][c]!=0) {
|
|
if (game.getBoard()[r][c]==1) {
|
|
drawX(canvas, r, c);
|
|
} else {
|
|
drawO(canvas, r, c);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private void drawX(Canvas canvas, int row, int column) {
|
|
paint.setColor(XColor);
|
|
canvas.drawLine((float)((column+1)*cellSize - cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)(column*cellSize+cellSize*0.1), (float)((row+1)*cellSize-cellSize*0.1), paint);
|
|
canvas.drawLine((float)(column*cellSize+cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)((column+1)*cellSize-cellSize*0.1), (float)((row+1)*cellSize-cellSize*0.1), paint);
|
|
|
|
}
|
|
|
|
private void drawO(Canvas canvas, int row, int column) {
|
|
paint.setColor(OColor);
|
|
canvas.drawOval((float)(column*cellSize+cellSize*0.1), (float)(row*cellSize+cellSize*0.1), (float)(column*cellSize+cellSize-cellSize*0.1), (float)(row*cellSize+cellSize-cellSize*0.1), paint);
|
|
}
|
|
|
|
private void drawHorizontal(Canvas canvas, int row, int column) {
|
|
canvas.drawLine(column, row*cellSize + cellSize/2, cellSize*3, row*cellSize+cellSize/2,paint);
|
|
}
|
|
|
|
private void drawVertical(Canvas canvas, int row, int column) {
|
|
canvas.drawLine(column*cellSize+cellSize/2, row, column*cellSize+cellSize/2, cellSize*3,paint);
|
|
}
|
|
|
|
private void drawSlopeUp(Canvas canvas) {
|
|
canvas.drawLine(0, cellSize*3, cellSize*3, 0 ,paint);
|
|
}
|
|
|
|
private void drawSlopeDown(Canvas canvas) {
|
|
canvas.drawLine(0, 0, cellSize*3, cellSize*3 ,paint);
|
|
}
|
|
|
|
private void drawWinLine(Canvas canvas) {
|
|
int row = game.getWinType()[0];
|
|
int column = game.getWinType()[1];
|
|
|
|
switch (game.getWinType()[2]) {
|
|
case 1:
|
|
drawHorizontal(canvas, row, column);
|
|
break;
|
|
case 2:
|
|
drawVertical(canvas, row, column);
|
|
break;
|
|
case 3:
|
|
drawSlopeDown(canvas);
|
|
break;
|
|
case 4:
|
|
drawSlopeUp(canvas);
|
|
break;
|
|
}
|
|
}
|
|
|
|
public void setUp(Button again, Button home, TextView display, String[] names) {
|
|
game.setAgain(again);
|
|
game.setHome(home);
|
|
game.setTurn(display);
|
|
if (!names[0].equals("") && !names[1].equals("")){
|
|
game.setNames(names);
|
|
}
|
|
}
|
|
|
|
public void resetGame() {
|
|
game.resetBoard();
|
|
winLine = false;
|
|
}
|
|
}
|