Final
This commit is contained in:
197
app/src/main/java/com/example/tictactoeapplut/Board.java
Normal file
197
app/src/main/java/com/example/tictactoeapplut/Board.java
Normal file
@@ -0,0 +1,197 @@
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user