package edu.minggo.game.five;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;
import edu.minggo.chat.R;
/**
* ����
* @author minggo
* @created 2013-2-27����07:01:37
*/
public class Chessboard extends View implements IChessboard{
public FinishDownListener finishDownListener;
//��Ϸ״̬������
//�����ã��ɿ���
private static final int READY = 1;
//�ѿ���
private static final int RUNNING = 2;
//�ѽ���
private static final int PLAYER_TWO_LOST = 3;
private static final int PLAYER_ONE_LOST = 4;
//��ǰ״̬��Ĭ��Ϊ�ɿ���״̬
private int currentMode = READY;
//���ʶ���
private final Paint paint = new Paint();
//������ɫ
private static final int GREEN = 0;
private static final int NEW_GREEN = 1;
//��ɫ
private static final int RED = 2;
//��ɫ
private static final int NEW_RED = 3;
//���С
private static int pointSize = 30;
//������ʾ��Ӯ���ı��ؼ�
private TextView textView = null;
//��ͬ��ɫ��Bigmap����
private Bitmap[] pointArray = new Bitmap[4];
//��Ļ���½ǵ�����ֵ�����������ֵ
private static int maxX;
private static int maxY;
//��һ��ƫ�����ϽǴ�������Ϊ�����̾���
private static int yOffset;
private static int xOffset;
//�������
//��һ�����Ĭ��Ϊ�������
private IPlayer player1 = new HumanPlayer();
//�ڶ��������ѡ���˻�ս���Ƕ�սģʽ����ʼ��
private IPlayer player2;
//Ԥ�ȳ�ʼ�����ڶ����
//�������
private static final IPlayer computer = AiFactory.getInstance(2);
//�������
private static final IPlayer human = new HumanPlayer();
// ����δ�µĿհ�
private final List<Point> allFreePoints = new ArrayList<Point>();
public Chessboard(Context context, AttributeSet attrs) {
super(context, attrs);
setFocusable(true);
//��������ɫ�ĵ����ã�����������
Resources r = this.getContext().getResources();
fillPointArrays(GREEN,r.getDrawable(R.drawable.green_point));
fillPointArrays(NEW_GREEN,r.getDrawable(R.drawable.new_green_point));
fillPointArrays(RED,r.getDrawable(R.drawable.red_point));
fillPointArrays(NEW_RED,r.getDrawable(R.drawable.new_red_point));
//���û���ʱ�õ���ɫ
paint.setColor(Color.LTGRAY);
}
//��ʼ���ߺ����ߵ���Ŀ
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
//Ϊ����Ӧ��ͬ�ֻ������ļ���������w �� hд��������ѡ���ڴ����ļ���д��
maxX = (int) Math.floor(480 / pointSize);
maxY = (int) Math.floor(720 / pointSize);
//����X��Y������ֵ��Ŀ�����������
xOffset = ((480 - (pointSize * maxX)) / 2);
yOffset = ((720 - (pointSize * maxY)) / 2);
//���������ϵ�����
createLines();
//��ʼ�����������пհ�
createPoints();
}
//���������������
private void createLines(){
for (int i = 0; i <= maxX; i++) {//����
lines.add(new Line(xOffset+i*pointSize-pointSize/2, yOffset, xOffset+i*pointSize-pointSize/2, yOffset+maxY*pointSize));
}
for (int i = 0; i <= maxY; i++) {//����
lines.add(new Line(xOffset, yOffset+i*pointSize-pointSize/2, xOffset+maxX*pointSize, yOffset+i*pointSize-pointSize/2));
}
}
//������
private List<Line> lines = new ArrayList<Line>();
private void drawChssboardLines(Canvas canvas){
for (Line line : lines) {
canvas.drawLine(line.xStart, line.yStart, line.xStop, line.yStop, paint);
}
}
//����
class Line{
float xStart,yStart,xStop,yStop;
public Line(float xStart, float yStart, float xStop, float yStop) {
this.xStart = xStart;
this.yStart = yStart;
this.xStop = xStop;
this.yStop = yStop;
}
}
//����
private void drawPoint(Canvas canvas,Point p,int color){
canvas.drawBitmap(pointArray[color],p.x*pointSize+xOffset,p.y*pointSize+yOffset,paint);
}
//��������״̬
public void setMode(int newMode) {
currentMode = newMode;
if(currentMode==PLAYER_TWO_LOST){
//��ʾ���2����
textView.setText(R.string.player_two_lost);
currentMode = READY;
}else if(currentMode==RUNNING){
textView.setText(null);
}else if(currentMode==READY){
textView.setText(R.string.mode_ready);
}else if(currentMode==PLAYER_ONE_LOST){
//��ʾ���1����
textView.setText(R.string.player_one_lost);
currentMode = READY;
}
}
//������ʾ�ؼ�
public void setTextView(TextView textView) {
this.textView = textView;
}
public void moduleChoose(int i){
if (currentMode == READY) {
if(i==1){//���Ҽ����˻���ս
player2 = computer;
}else if(i==2){//���������--�˶�ս
player2 = human;
}
restart();
setMode(RUNNING);
}else if(currentMode==RUNNING &&i==-1){//���¿�ʼ
restart();
setMode(READY);
}else{
}
}
//���ݴ����������ҵ���Ӧ��
private Point newPoint(Float x, Float y){
Point p = new Point(0, 0);
for (int i = 0; i < maxX; i++) {
if ((i * pointSize + xOffset) <= x
&& x < ((i + 1) * pointSize + xOffset)) {
p.setX(i);
}
}
for (int i = 0; i < maxY; i++) {
if ((i * pointSize + yOffset) <= y
&& y < ((i + 1) * pointSize + yOffset)) {
p.setY(i);
}
}
return p;
}
//���¿�ʼ
private void restart() {
createPoints();
player1.setChessboard(this);
player2.setChessboard(this);
setPlayer1Run();
//ˢ��һ��
refressCanvas();
}
//�Ƿ��ѿ���
private boolean hasStart(){
return currentMode==RUNNING;
}
//�������¼�
@Override
public boolean onTouchEvent(MotionEvent event) {
//��û�п��֣������ǰ����¼���������ֻ�����ֺ�Ĵ��������¼�
if(!hasStart() || event.getAction()!=MotionEvent.ACTION_UP){
return true;
}
//�Ƿ����ڴ���һ����Ĺ�����
if(onProcessing()){
return true;
}
playerRun(event);
return true;
}
/**
* �������¼�
* @param event
*/
private synchronized void playerRun(MotionEvent event){
if(isPlayer1Run()){//��һ�������
player1Run(event);
}
else if(isPlayer2Run()){//�ڶ��������
finishDownListener.onFinishDown(null);
}
}
private void player1Run(MotionEvent event){
Point point = newPoint(event.getX(), event.getY());
if (finishDownListener!=null) {
finishDownListener.onFinishDown(event.getX()+","+event.getY());
}
if(allFreePoints.contains(point)){//�����Ƿ����
setOnProcessing();
player1.run(player2.getMyPoints(),point);
//playerOnePoints.add(point);
//ˢ��һ������
refressCanvas();
//�жϵ�һ������Ƿ��Ѿ�����
if(!player1.hasWin()){//�һ�û��Ӯ
if(player2==computer){//����ڶ�����ǵ���
//10�����Ÿ����2����
refreshHandler.computerRunAfter(10);
}else{
setPlayer2Run();
}
}else{
//������ʾ��Ϸ����
setMode(PLAYER_TWO_LOST);
}
}
}
private void player2Run(String location){
String[] locationXY = location.split(",");
Point point = newPoint(Float.parseFloat(locationXY[0]), Float.parseFloat(locationXY[1]));
System.out.println("3+++++"+Float.parseFloat(locationXY[0])+"----"+Float.parseFloat(locationXY[1]));
if(allFreePoints.contains(point)){//�����Ƿ����
System.out.println("������");
setOnProcessing();
player2.run(player1.getMyPoints(),point);
//playerTwoPoints.add(point);
//ˢ��һ������
refressCanvas();
//�ж����Ƿ�Ӯ��
if(!player2.hasWin()){//�һ�û��Ӯ
setPlayer1Run();
}else{
//������ʾ��Ϸ����
setMode(PLAYER_ONE_LOST);
}
}
}
private RefreshHandler refreshHandler = new RefreshHandler();
class RefreshHandler extends Handler {
//���������Ҫ��ָ����ʱ�̷�һ����Ϣ
public void computerRunAfter(long delayMillis) {
this.removeMessages(0);
//����Ϣ����handleMessage����
sendMessageDelayed(obtainMessage(0), delayMillis);
}
//�յ���Ϣ
@Override
public void handleMessage(Message msg) {
//������һ������
player2.run(player1.getMyPoints(),null);
//ˢ��һ��
refressCanvas();
if(!player2.hasWin()){
//����
setPlayer1Run();
}else{//�ڶ������Ӯ��
setMode(PLAYER_ONE_LOST);
}
}
};
//�Ƿ�������ijһ��������У����ǵ�������ʱ��Ҫ�ϳ��ļ���ʱ�䣬���ڼ�һ������������Ӧ�����¼�
private boolean onProcessing() {
return whoRun == -1;
}
//Ĭ�ϵ�һ���������
private int whoRun = 1;
private void setPlayer1Run(){
whoRun = 1;
}
private void setOnProcessing(){
whoRun = -1;
}
//�Ƿ��ֵ������������
private boolean isPlayer1Run(){
return whoRun==1;
}
//�Ƿ��ֵ������������
private boolean isPlayer2Run(){
return whoRun==2;
}
private void setPlayer2Run(){
whoRun = 2;
}
private void refressCanvas(){
//����onDraw����
Chessboard.this.invalidate();
}
private void drawPlayer1Point(Canvas canvas){
int size = player1.getMyPoints().size()-1;
if(size<0){
return ;
}
for (int i = 0; i < size; i++) {
drawPoint(canvas, player1.getMyPoints().get(i), GREEN);
}
//����µ�һ�����ɻ�ɫ
drawPoint(canvas, player1.getMyPoints().get(size), NEW_GREEN);
}
private void drawPlayer2Point(Canvas canvas){
if(player2==null){
return ;
}
int size = player2.getMyPoints().size()-1;
if(size<0){
return ;
}
for (int i = 0; i < size; i++) {
drawPoint(canvas, player2.getMyPoints().get(i), RED);
}
//����µ�һ�����ɻ�ɫ
drawPoint(canvas, player2.getMyPoints().get(size), NEW_RED);
}
//��ʼ����������ɫ�ĵ�
public void fillPointArrays(int color,Drawable drawable) {
Bitmap bitmap = Bitmap.createBitmap(pointSize, pointSize, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, pointSize, pointSize);
drawable.draw(canvas);
pointArray[color] = bitmap;
}
//doRun�����������ǿ��������ڴ����ݣ��˷�������������ͼ���ķ�ʽ���ֳ��������Ի�֮ǰ����һ��Ҫ������
@Override
protected void onDraw(Canvas canvas) {
drawChssboardLines(canvas);
//��������ڵĵ�
drawPlayer1Point(canvas);
//�������µ�����
drawPlayer2Point(canvas);
}
@Override
public List<Point> getFreePoints() {
return allFreePoints;
}
//��ʼ���հ㼯��
private void createPoints(){
allFreePoints.clear();
for (int i = 0; i < maxX; i++) {
for (int j = 0; j < maxY; j++) {
allFreePoints.add(new Point(i, j));
}
}
}
@Override
public int getMaxX() {
return maxX;
}
@Override
public int getMaxY() {
return maxY;
}
/**
* ��һ����ص�����
* @author minggo
* @created 2013-2-27����03:34:15
*/
public interface FinishDownListener{
public void onFinishDown(String location);
}
public void setFinishDownListener(FinishDownListener finishDownListener) {
this.finishDownListener = finishDownListener;
}
/**
* �����˻���ս
*/
public Handler myHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
System.out.println("111111++++++++++++++++++++++++++++");
if (isPlayer2Run()) {
System.out.println("2222++++++++++++++++++++++++++++");
player2Run(msg.obj.toString());
}
}
};
}