游戏输赢
最后要说的是判断游戏的输赢。我的思路是,每次在玩家着棋(按下5)时,判断棋局的输赢,然后用一个 Alert 显示哪一方赢了以及当前的比分,返回后开始新的一局。判断的逻辑是,在当前所下的棋子的0/180度、90/270度、45/225度、135/315度四个方向上分别往两头按照由近至远的顺序判断各5个棋子是否是当前下棋方的棋子,如果是则累加到一个变量上,如果在到达5之前出现“否”的情况,则中止在这一方向或这一角度的判断,变量归1(应为当前棋子肯定是当前下棋方下完的棋子)并进行下一个方向或角度。在判断是否是当前方时,用当前 isPlayer1 变量和棋子对象的 isPlayer1 变量进行比交。源代码如下:
int player1win,player2win;
protected synchronized void keyPressed(int keyCode) {
...
else if (action == Canvas.FIRE) {
if(chesses[selectedY][selectedX]==null){
chesses[selectedY][selectedX]=new Chesses(this.isPlayer1);
if(checkWin()){
String winner;
if(isPlayer1){
winner="白方胜利";
player1win++;
}
else{
winner="红方胜利";
player2win++;
}
try{
Thread.sleep(3000);
}catch(Exception e){
}
Alert winAlert=new Alert("",
winner+"\n白方 "+player1win+" : "+player2win+" 红方",
null,AlertType.INFO);
winAlert.setTimeout(Alert.FOREVER);
Display.getDisplay(gobang).setCurrent(winAlert,this);
init();
repaint();
}
this.isPlayer1=!this.isPlayer1;//切换下棋方
}
}
repaint();
}
private boolean checkWin(){
int num=1;
if(num<5){
num=1;
for(int i=1;i<=4;i++){
if(isPlayer1(selectedX-i,selectedY)){
num++;
}
else break;
}
for(int i=1;i<=4;i++){
if(isPlayer1(selectedX+i,selectedY)){
num++;
}
else break;
}
}
if(num<5){
num=1;
for(int i=1;i<=4;i++){
if(isPlayer1(selectedX,selectedY-i)){
num++;
}
else break;
}
for(int i=1;i<=4;i++){
if(isPlayer1(selectedX,selectedY+i))
num++;
else break;
}
}
if(num<5){
num=1;
for(int i=1;i<=4;i++){
if(isPlayer1(selectedX-i,selectedY-i))
num++;
else break;
}
for(int i=1;i<=4;i++){
if(isPlayer1(selectedX+i,selectedY+i))
num++;
else break;
}
}
if(num<5){
num=1;
for(int i=1;i<=4;i++){
if(isPlayer1(selectedX+i,selectedY-i))
num++;
else break;
}
for(int i=1;i<=4;i++){
if(isPlayer1(selectedX-i,selectedY+i))
num++;
else break;
}
}
if(num>=5)
return true;
else
return false;
}
private boolean isPlayer1(int y,int x){
if(x<=15 && x>=0 && y<=15 && y>=0 && chesses[x][y]!=null){
if(chesses[x][y].isPlayer1==this.isPlayer1)
return true;
else
return false;
}
else return false;
}
|
介绍
这是我学习j2me入门后的第一个作品,当然这也是一个极其简单的作品(没有电脑AI,只能是两个人对战),现在我把当时的设计思路写成这篇文档,希望对想入门j2me的朋友在j2me的流程,按键响应,绘图等方面有所帮助,同时也希望大家指出错误和改进程序。
注意
代码列出解释的形式仿照《J2ME Game Programming》一书,按照程序功能思路给出相关代码,一个文件的代码会根据功能在不同的小节给出,文章结束了,代码也就完整了。这不同于通常书中的代码以文件为单位一次全部给出,我认为这样更有助于让大家了解一个程序从设计到最后完成的思路。
设计
数据结构:由于五子棋是一个二维棋类游戏,所有首先想到的是定义一个Chesses类来表示棋子,Chesses有一个boolean型的变量isPlayer1来区分该棋子是哪玩家下的,然后用一个Chess类型的二维数组来包含棋盘上的所有棋子。考虑到移动设备的资源有限,尽可能减少系统资源占用,我考虑不在数组建立后直接生成数组的每一个对象,而是把每一个棋子对象(Chesses)放在游戏的进行中生成,也就是说在游戏进行时,玩家每下一