您的位置:首页 > 其它

安卓游戏开发之【扎金花游戏】(四)

2012-04-19 17:43 267 查看
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、图片资源的初始化;

/**
* 图像资源的初始化
*
* @param context
*/
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
;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: