GameView.java
遊戲界面的繪制類:繼承View類,實作OnTouchListener,Runnable接口,實作public GameView(Contextcontext){},protectedvoid onDraw(Canvas canvas){},public void run(){},public boolean onTouch(Viewv,MotionEvent event){}
1、設定遊戲線程的開關;
private Thread currentThread;
// 開啟遊戲的線程
public void startThread()
{
currentThread = new Thread(this);
currentThread.start();
}
// 停止遊戲的線程
public void stopThread()
{
currentThread = null;
}
//線程開始的運作方法
public void run()
{
while (currentThread != null)
{
//執行遊戲的狀态
this.logic();
this.postInvalidate();
try
{
Thread.sleep(80);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
2、圖檔資源的初始化;
public GameView(Context context)
{
super(context);
// 設定監聽方法
setOnTouchListener(this);
cardBitmap = new Bitmap[52];
// 導入背景,繼續,結束等圖檔
try
{
InputStream isBack =getContext().getAssets()
.open("background.png");
InputStream isNext =getContext().getAssets().open("next.png");
InputStream isOver =getContext().getAssets().open("over.png");
back = BitmapFactory.decodeStream(isBack);
next = BitmapFactory.decodeStream(isNext);
over = BitmapFactory.decodeStream(isOver);
// 導入52張牌的圖檔
for (int i = 2; i <= 14; i++)
{
cardBitmap[i - 2] = BitmapFactory.decodeStream(getContext()
.getAssets().open("cards/h" + i + ".png"));
cardBitmap[i - 2 + 13] = BitmapFactory
.decodeStream(getContext().getAssets().open(
"cards/d" + i + ".png"));
cardBitmap[i - 2 + 26] = BitmapFactory
.decodeStream(getContext().getAssets().open(
"cards/s" + i + ".png"));
cardBitmap[i - 2 + 39] = BitmapFactory
.decodeStream(getContext().getAssets().open(
"cards/c" + i + ".png"));
}
} catch (IOException e)
{
e.printStackTrace();
}
// 初始化52張牌
ZhaJinHua.init();
// 洗牌
ZhaJinHua.xiPai();
// 設定玩家和電腦人
person = new Person[]
{ new Person(), new PersonWithAI() };
// 給玩家和電腦人發牌
ZhaJinHua.faPai(person);
// 對玩家和電腦人的牌排序
for (Person p : person)
{
ZhaJinHua.sort(p.myCards);
}
}
3、圖檔和文字的繪制;
// 建立Paint的執行個體
Paint paint;
// 設定遊戲的狀态
public int gamestate;
protected void onDraw(Canvascanvas) {
super.onDraw(canvas);
// 繪制背景,繼續,結算等圖檔
canvas.drawBitmap(back, 0, 0, paint);
canvas.drawBitmap(next, 600, 300, paint);
canvas.drawBitmap(over, 600, 400, paint);
// 繪制52張牌
ZhaJinHua.drawSelf(canvas, paint, cardBitmap, 0, 0);
// 繪制玩家和電腦人的牌
for (int i = 0; i < person.length; i++) {
Person p = person[i];
p.drawSelf(canvas, paint, cardBitmap, 0, 150 * (i + 1));
}
// 設定遊戲的狀态
String str = "";
switch (gamestate) {
case 0:
str = "洗牌中,遊戲即将開始!";
break;
case 1:
str = "玩家操作!";
break;
case 2:
str = "電腦操作!";
break;
case 3:
str = "遊戲結束,下一輪即将開始!";
break;
default:
break;
}
canvas.drawText(str, 200, 400, paint);
}
4、初始化遊戲的狀态:遊戲的初始化,自己下注的狀态,電腦下注的狀态,遊戲結算狀态。
public void logic()
{
// 0:遊戲初始化 1:玩家下注2:電腦下注 3:遊戲結算
switch (gamestate)
{
case 0:
ZhaJinHua.faPai(person);
for (Person p : person)
{
ZhaJinHua.sort(p.myCards);
}
gamestate = 1;
break;
case 1:
break;
case 2:
PersonWithAI pai = (PersonWithAI) person[1];
if (pai.isContinue(person[0]))
{
pai.score--;
pai.wager++;
gamestate = 1;
} else
{
gamestate = 3;
}
break;
case 3:
// 比較兩副牌的大小
int i = ZhaJinHua.biJiao(person[0].myCards, person[1].myCards);
// 玩家勝利,加上自己押注和電腦押注的分值
if (i == 1)
{
person[0].score += person[0].wager + person[0].wager;
}
// 電腦勝利,則加上自己和電腦押注的分值
if (i == -1)
{
person[1].score += person[0].wager + person[0].wager;
}
// 打平手,各自加上各自押注的分值
if (i == 0)
{
person[0].score += person[0].wager;
person[1].score += person[1].wager;
}
// 完成分值計算,把押注清零
person[0].wager = 0;
person[1].wager = 0;
// 重新發牌
gamestate = 0;
break;
default:
break;
}
}
5、設定螢幕觸摸事件;
public boolean onTouch(View v, MotionEvent event)
{
// 如果沒有按下,則傳回
if (event.getAction() != event.ACTION_DOWN)
{
return true;
}
// 如果不是玩家操作,則傳回
if (gamestate != 1)
{
return true;
}
// 擷取點選的x,y坐标
float x = event.getX();
float y = event.getY();
if (x > 600 && x < 750 &&y > 300 && y < 370)
{
person[0].score--;
person[0].wager++;
gamestate = 2;
}
if (x > 600 && x < 750 &&y > 400 && y < 470)
{
// 遊戲結束
gamestate = 3;
}
return true;
}