📄 gamecanvas.java
字号:
}
/** 线程的运作部分 */
public void run() {
try {
switch(gameState) {
case ROUND_START: //回合开始时
//进行回合开始显示
repaint();
Thread.sleep(1500);
//新增指令
addCommand(quitCmd);
addCommand(pauseCmd);
//将状态设为回合中,直接转移到回合中
gameState = FIGHTING;
case FIGHTING: //回合中
while(! isStopped) {
repaint();
//移动玩家
player.doMove();
//移动对手
enemy.doMove();
//变更对手的状态
doChangeEnemy();
//等待间隔
Thread.sleep(DRAW_INTERVAL);
}
if(gameState == ROUND_END) {
//结束回合时
//因为显示的关系,所以暂时将状态设为回合中
gameState = FIGHTING;
//删除指令
removeCommand(pauseCmd);
removeCommand(resumeCmd);
removeCommand(quitCmd);
//进行重新描绘而待命一下子
repaint();
Thread.sleep(1000);
//将游戏循环结束
doGameStop();
//将状态设回为回合结束
gameState = ROUND_END;
//检查玩家与对手的生命点数
int playerLife = player.getLifePoint();
int enemyLife = enemy.getLifePoint();
if(playerLife > enemyLife) {
//玩家的胜利
result = WIN;
enemy.setCurrentState(Boxer.KNOCK_DOWN);
repaint();
if(round == MAX_ROUND) {
//最后回合时
//进行全回合过关处理
Thread.sleep(1500);
gameState = ALL_ROUND_CLEAR;
repaint();
Thread.sleep(5000);
doTitle();
}else {
//还有回合时
//将剩馀的生命点数附加到下一回合的生命点数中
//开始下一回合
Thread.sleep(2000);
doRoundInit();
player.setLifePoint(player.getLifePoint() +playerLife);
round++;
gameState = ROUND_START;
doThreadStart();
}
}else {
//玩家的失败
//进行失败显示,在待命一定时间后回到标题画面
result = LOSE;
player.setCurrentState(Boxer.KNOCK_DOWN);
repaint();
Thread.sleep(5000);
doTitle();
}
}
break;
}
}catch(Exception e) {}
}
/** 变更对手状态的方法 */
private void doChangeEnemy() {
if( enemy.getCurrentState() == Boxer.PANCH_UP ||
enemy.getCurrentState() == Boxer.PANCH_DOWN)
{
//挥出拳击时为return
return;
}
//为了不连续出拳而加重一回负荷处理
if(isEnemyPanch) {
isEnemyPanch = false;
return;
}
//检查玩家的状态
switch(player.getCurrentState()) {
case Boxer.PANCH_UP: //玩家挥出上拳击
switch(enemy.getCurrentState()) {
case Boxer.GUARD_UP://对手为上段防御
//以乱数决定下一个动作
switch(random.nextInt() % 4) {
case 0:
case 3:
//保持原状
break;
case 1:
//以上段拳击进行反击
enemy.setCurrentState(Boxer.PANCH_UP);
doLifepointCheck4Player();
break;
case 2:
//后退
enemy.setCurrentState(Boxer.BACK_STEP);
break;
}
break;
case Boxer.GUARD_DOWN://对手为下段防御
//以乱数决定下一个动作
switch(random.nextInt() % 5) {
case 0:
//以上段拳击来反击
enemy.setCurrentState(Boxer.PANCH_UP);
doLifepointCheck4Player();
break;
case 1:
//以下段拳击来反击
enemy.setCurrentState(Boxer.PANCH_DOWN);
doLifepointCheck4Player();
break;
case 2:
case 4:
//上段防御
enemy.setCurrentState(Boxer.GUARD_UP);
break;
case 3:
//后退
enemy.setCurrentState(Boxer.BACK_STEP);
break;
}
break;
}
break;
case Boxer.PANCH_DOWN: //玩家为下段拳击
switch(enemy.getCurrentState()) {
case Boxer.GUARD_UP://对手为上拳击
//以乱数决定下一个动作
switch(random.nextInt() % 5) {
case 0:
//以上段拳击来反击
enemy.setCurrentState(Boxer.PANCH_UP);
doLifepointCheck4Player();
break;
case 1:
//以下段拳击来反击
enemy.setCurrentState(Boxer.PANCH_DOWN);
doLifepointCheck4Player();
break;
case 2:
case 4:
//下段防御
enemy.setCurrentState(Boxer.GUARD_DOWN);
break;
case 3:
//后退
enemy.setCurrentState(Boxer.BACK_STEP);
break;
}
break;
case Boxer.GUARD_DOWN://对手为下段防御
//以乱数决定下一个动作
switch(random.nextInt() % 4) {
case 0:
case 3:
//保持原状
break;
case 1:
//以下段拳击来反击
enemy.setCurrentState(Boxer.PANCH_DOWN);
doLifepointCheck4Player();
break;
case 2:
//后退
enemy.setCurrentState(Boxer.BACK_STEP);
break;
}
break;
}
break;
case Boxer.GUARD_UP: //玩家为上段防御
switch(enemy.getCurrentState()) {
case Boxer.GUARD_UP://对手为上段防御
//以乱数决定下一个动作
switch(random.nextInt() % 4) {
case 0:
//保持原状
break;
case 1:
case 3:
//下拳击
enemy.setCurrentState(Boxer.PANCH_DOWN);
doLifepointCheck4Player();
break;
case 2:
//后退
enemy.setCurrentState(Boxer.BACK_STEP);
break;
}
break;
case Boxer.GUARD_DOWN://对手为下段防御
//以乱数决定下一个动作
switch(random.nextInt() % 4) {
case 0:
//保持原状
break;
case 1:
case 3:
//下段拳击
enemy.setCurrentState(Boxer.PANCH_DOWN);
doLifepointCheck4Player();
break;
case 2:
//后退
enemy.setCurrentState(Boxer.BACK_STEP);
break;
}
break;
case Boxer.BACK_STEP://对手为后退
//以乱数决定下一个动作
switch(random.nextInt() % 3) {
case 0:
case 1:
//保持原状
break;
case 2:
//下段拳击
enemy.setCurrentState(Boxer.PANCH_DOWN);
doLifepointCheck4Player();
break;
}
break;
}
break;
case Boxer.GUARD_DOWN: //玩家为下段防御
switch(enemy.getCurrentState()) {
case Boxer.GUARD_UP://对手为上段防御
//以乱数决定下一个动作
switch(random.nextInt() % 4) {
case 0:
//保持原状
break;
case 1:
case 3:
//上段拳击
enemy.setCurrentState(Boxer.PANCH_UP);
doLifepointCheck4Player();
break;
case 2:
//后退
enemy.setCurrentState(Boxer.BACK_STEP);
break;
}
break;
case Boxer.GUARD_DOWN://对手为下段防御
//以乱数决定下一个动作
switch(random.nextInt() % 4) {
case 0:
//保持原状
break;
case 1:
case 3:
//上拳击
enemy.setCurrentState(Boxer.PANCH_UP);
doLifepointCheck4Player();
break;
case 2:
//后退
enemy.setCurrentState(Boxer.BACK_STEP);
break;
}
break;
case Boxer.BACK_STEP://对手为后退
//以乱数决定下一个动作
switch(random.nextInt() % 3) {
case 0:
case 1:
//保持原状
break;
case 2:
//上段拳击
enemy.setCurrentState(Boxer.PANCH_UP);
doLifepointCheck4Player();
break;
}
break;
}
break;
case Boxer.BACK_STEP://玩家为后退
//以乱数决定下一个动作
switch(random.nextInt() % 5) {
case 0:
//上段拳击
enemy.setCurrentState(Boxer.PANCH_UP);
doLifepointCheck4Player();
break;
case 1:
//下段拳击
enemy.setCurrentState(Boxer.PANCH_DOWN);
doLifepointCheck4Player();
break;
case 2:
//上段防御
enemy.setCurrentState(Boxer.GUARD_UP);
break;
case 3:
//下段防御
enemy.setCurrentState(Boxer.GUARD_DOWN);
break;
case 4:
//保持原状
break;
}
break;
}
}
/**
* 当玩家挥出拳击时,根据对手的状态
* 来进行处理的方法
*/
private void doLifepointCheck4Enemy() {
//检查玩家的状态
switch(player.getCurrentState()) {
case Boxer.PANCH_UP: //玩家为上段拳击时
switch(enemy.getCurrentState()) {
case Boxer.PANCH_UP:
case Boxer.PANCH_DOWN:
case Boxer.GUARD_DOWN:
//对手为上段拳击、下段拳击、下段防御时
//将对手的生命点数减去最低损害值
int tmpLifePoint = enemy.getLifePoint() -DAMAGES[0];
if(tmpLifePoint <= 0) {
//当生命点数为0时
//进行回合过关处理
enemy.setLifePoint(0);
doRoundClear();
}else {
//还有剩馀生命点数时
enemy.setLifePoint(tmpLifePoint);
}
break;
}
break;
case Boxer.PANCH_DOWN: //玩家为下拳击时
switch(enemy.getCurrentState()) {
case Boxer.PANCH_DOWN:
case Boxer.PANCH_UP:
case Boxer.GUARD_UP:
//对手为上段拳击、下段拳击、下段防御时
//将对手的生命点数减去最低损害值
int tmpLifePoint = enemy.getLifePoint() -DAMAGES[0];
if(tmpLifePoint <= 0) {
//当生命点数为0时
//进行回合过关处理
enemy.setLifePoint(0);
doRoundClear();
}else {
//还有剩馀生命点数时
enemy.setLifePoint(tmpLifePoint);
}
break;
}
break;
}
}
/**
* 当对手挥出拳击时,根据玩家的状态
* 来进行处理的方法
*/
private void doLifepointCheck4Player() {
//检查对手的状态
switch(enemy.getCurrentState()) {
case Boxer.PANCH_UP: //对手为上段拳击时
//将拳击中标志设为true
isEnemyPanch = true;
switch(player.getCurrentState()) {
case Boxer.PANCH_UP:
case Boxer.PANCH_DOWN:
case Boxer.GUARD_DOWN:
//玩家为上段拳击、下段拳击、下段防御时
//将玩家的生命点数减去最低损害值
int tmpLifePoint = player.getLifePoint() -DAMAGES[round -1];
if(tmpLifePoint <= 0) {
//当生命点数为0以下时
//进行回合过关处理
player.setLifePoint(0);
doRoundClear();
}else {
//当生命点数有剩馀时
player.setLifePoint(tmpLifePoint);
}
break;
}
break;
case Boxer.PANCH_DOWN: //对手为下段拳击时
//将拳击中标志设为true
isEnemyPanch = true;
switch(player.getCurrentState()) {
case Boxer.PANCH_DOWN:
case Boxer.PANCH_UP:
case Boxer.GUARD_UP:
//玩家为上段拳击、下段拳击、下段防御时
//将玩家的生命点数减去最低损害值
int tmpLifePoint = player.getLifePoint() -DAMAGES[round -1];
if(tmpLifePoint <= 0) {
//当生命点数为0以下时
//进行回合过关处理
player.setLifePoint(0);
doRoundClear();
}else {
//当生命点数有剩馀时
player.setLifePoint(tmpLifePoint);
}
break;
}
break;
}
}
/** 进行过关处理的方法 */
private void doRoundClear() {
doGameStop();
gameState = ROUND_END;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -