codegame AI坦克大战第一届杯赛 AI代码存档

共享一下自己的AI代码(其实是有BUG的。。。

var lastPosition = null
var fmap = null
var result = null
var flag = 1
var fgo = 0
var forest0 = [12,3]
var forest1 = [12,3]
var head = {
  pre : null,
  dir : null,
  x : 0,
  y : 0,
  next : null
}
var handle = head;
var last = head;

function onIdle(me, enemy, game) {

  /*要是上次的寻路得的指令是前进但位置没变 往前开一炮*/
  if(lastPosition !== null)
  {
    if(lastPosition[0] == me.tank.position[0]
        && lastPosition[1] == me.tank.position[1]
        && fgo == 1){
      fgo = 0
      me.fire()
      print(‘蒙一发看看?‘)
      return
    }
  }

  /*进入常规开火判断*/
  var ffire = shouldfire(me,enemy,game.map)
  if(ffire !== false){
    if(ffire == "fire"){
      if(me.bullet == null){
        me.fire()
        print(‘来一发!‘)
      }
      return
    }else{
      turnto(me, ffire)
      return
    }
  }

  /*一个很简单的炮弹回避。。。躲开 往前走两格 有bug的。。。*/
  if(enemy.bullet !== null){
    if(me.tank.position[0] == enemy.bullet.position[0]){
      if(me.tank.direction == ‘left‘ || me.tank.direction == ‘right‘){
        me.go()
      }else{
        if(game.map[me.tank.position[0]+1][me.tank.position[1]] !== ‘x‘){
          turnto(me,‘right‘)
        me.go()
            turnto(me,‘down‘)
          me.go(2)
          if(me.bullet == null)me.fire()
        }else{
          turnto(me,‘left‘)
        me.go()
            turnto(me,‘up‘)
          me.go(2)
          if(me.bullet == null)me.fire()
        }
      }
      lastPosition = me.tank.position.slice()

      print("我闪!")
      return;
    }
    if(me.tank.position[1] == enemy.bullet.position[1]){
      if(me.tank.direction == ‘up‘ || me.tank.direction == ‘down‘){
        me.go()
      }else{
        if(game.map[me.tank.position[0]][me.tank.position[1]+1] !== ‘x‘){
          turnto(me,‘down‘)
        me.go()
            turnto(me,‘left‘)
          me.go(2)
          if(me.bullet == null)me.fire()
        }else{
            turnto(me,‘up‘)
        me.go()
            turnto(me,‘right‘)
          me.go(2)
          if(me.bullet == null)me.fire()
        }
      }
      print("我闪!")
      lastPosition = me.tank.position.slice()
      return;
    }
  }

  /*初始化标志地图 用于记录寻路禁区还有寻路用*/
  init(me, game.map, enemy, game)
  //print(enemy.tank)

  /*如果没有星星又看不见对面 就将寻路目标定为草丛*/
  if(game.star === null && enemy.tank === null){
    if (lastPosition !== null &&
      lastPosition[0] === me.tank.position[0] &&
      lastPosition[1] === me.tank.position[1]) {
      //var turn = [‘left‘, ‘right‘][new Date().getTime() % 2]
      //me.turn(turn)
      //me.go()
        //if(me.bullet == null)me.fire()
  }else{
      if(me.bullet == null)me.fire()
    }

    if(flag == 1)game.star = forest0
    if(flag == 0)game.star = forest1
    if(me.tank.position[0] == forest0[0] && me.tank.position[1] == forest0[1]){
      flag = 0
    }
    if(me.tank.position[0] == forest1[0] && me.tank.position[1] == forest1[1]){
      flag = 1
    }
    //game.star = [1,12]
  }
  /*要是能看见对面 看不见星星就躲着对面走*/
  if(game.star === null){
    game.star = [0,0]
    game.star[0] = enemy.tank.position[0]+1
    game.star[1] = 5
    if(game.map[game.star[0]][game.star[1]] == ‘x‘){
      game.star = forest1
    }
  }

  /*寻路*/
  bfs(game.map, game.star)
  getresult()

  if(result.length < 2)return

  /*恢复寻路破坏的禁区标记*/
  init(me, game.map, enemy, game)
  /*转弯还是前进*/
  if(result[result.length - 2][2] == me.tank.direction){
  if(fmap[result[result.length - 2][0]][result[result.length - 2][1]] !== ‘x‘){   //不能往禁区前进
        fgo = 1
      me.go();
        print(‘前进!!!‘)
    }
    else return
  }else{
    turnto(me, result[result.length - 2][2])
  }
  lastPosition = me.tank.position.slice()
  //while(1){}
 // me.go()
  //print(‘bug?‘)
}

/*初始化禁区标记 禁区:炮弹前 敌方四周*/

function init(me,map,enemy,game){
  head.x  = me.tank.position[0];
  head.y  = me.tank.position[1];
  head.dir  = me.tank.direction;
  head.next = null;
  handle  = head;
  last    = head;
  fmap = new Array(map.length)
  for(i = 0; i < map.length; i++){
    fmap[i] = new Array(map[i].length)
    //print(fmap)
    for(j = 0; j < map[i].length; j++){
      fmap[i][j] = ‘a‘;
    }
    //print(fmap)
  }
  for(i = 0; i < map.length/2; i++){
    for(j = 0; j < map[i].length/2; j++){
      if(map[i][j] == ‘o‘){
        forest0[0] = i
        forest0[1] = j
        break;
      }
    }
    if(j < map[i].length/2)break;
    //print(fmap)
  }

  for(i = map.length - 1; i > map.length/2; i--){
    for(j = map[i].length - 1; j > map[i].length/2; j--){
      if(map[i][j] == ‘o‘){
        forest1[0] = i
        forest1[1] = j
        break;
      }
    }
    if(j > map[i].length/2)break;
    //print(fmap)
  }

  if(enemy.bullet !== null){
    if(enemy.bullet.direction == ‘up‘){
      for(i = 0; i < 400 ;i++){
        if(enemy.bullet.position[1]-i < 0)break;
        fmap[enemy.bullet.position[0]][enemy.bullet.position[1]-i] = ‘x‘
      }
    }
    if(enemy.bullet.direction == ‘down‘){
      for(i = 0; i < 400 ;i++){
        if(enemy.bullet.position[1]+i >= map[0].length)break;
        fmap[enemy.bullet.position[0]][enemy.bullet.position[1]+i] = ‘x‘
      }
    }
    if(enemy.bullet.direction == ‘left‘){
      for(i = 0; i < 400 ;i++){
        if(enemy.bullet.position[0]-i < 0)break;
        fmap[enemy.bullet.position[0]-i][enemy.bullet.position[1]] = ‘x‘
      }
    }
    if(enemy.bullet.direction == ‘right‘){
      for(i = 0; i < 400 ;i++){
        if(enemy.bullet.position[0]+i >= map.length)break;
        fmap[enemy.bullet.position[0]+i][enemy.bullet.position[1]] = ‘x‘
      }
    }
    if(game.star!=null)
      if(fmap[game.star[0]][game.star[1]] == ‘x‘)game.star = null
  }
  if(enemy.tank != null){
    fmap[enemy.tank.position[0]+1][enemy.tank.position[1]] = ‘x‘
    fmap[enemy.tank.position[0]-1][enemy.tank.position[1]] = ‘x‘
    fmap[enemy.tank.position[0]][enemy.tank.position[1]+1] = ‘x‘
    fmap[enemy.tank.position[0]][enemy.tank.position[1]-1] = ‘x‘
  }
}

function bfs(map, star){
  //print(star)
  count = 0
  if(map[star[0]][star[1]] == ‘x‘)return
  if(fmap[star[0]][star[1]] == ‘x‘)return
  //print(star)
  while(handle != null){
    //print(count++)
    //up ex
    //print(handle.x+"\t"+handle.y)
    if(fmap[handle.x][handle.y] ==‘x‘){
      handle = handle.next
      continue
    }
    if(map[handle.x][handle.y-1] !== ‘x‘ && fmap[handle.x][handle.y-1] !== ‘x‘){
      last.next = {
        pre : handle,
        dir : "up",
        x : handle.x,
        y : handle.y - 1,
        next : null
      }
      last = last.next;
    }

    //down ex
    if(map[handle.x][handle.y+1] !== ‘x‘ && fmap[handle.x][handle.y+1] !== ‘x‘){
      last.next = {
        pre : handle,
        dir : "down",
        x : handle.x,
        y : handle.y + 1,
        next : null
      }
      last = last.next;
    }

    //left ex
    if(map[handle.x-1][handle.y] !== ‘x‘ && fmap[handle.x-1][handle.y] !== ‘x‘){
      last.next = {
        pre : handle,
        dir : "left",
        x : handle.x-1,
        y : handle.y,
        next : null
      }
      last = last.next;
    }

    //right ex
    if(map[handle.x+1][handle.y] !== ‘x‘ && fmap[handle.x+1][handle.y] !== ‘x‘){
      last.next = {
        pre : handle,
        dir : "right",
        x : handle.x+1,
        y : handle.y,
        next : null
      }
      last = last.next;
    }

    fmap[handle.x][handle.y] = ‘x‘;
    if(star[0] == handle.x && star[1] == handle.y)break;
    handle = handle.next;
    //print(handle)
  }
}

function getresult(){
  delete result;
  result = new Array()
  //result.clear();
  while(handle !== null){
    //print(handle.x+"\t"+handle.y)
    result.push([handle.x,handle.y,handle.dir])
    handle = handle.pre
  }
}

/*将转弯的相对方向封装成绝对方向*/
function turnto(me,trg){
  fgo = 0
  if(me.tank.direction == "up"){
    if(trg == "down"){
      me.turn("left")
    }
    if(trg == "right"){
      me.turn("right")
    }
    if(trg == "left"){
      me.turn("left")
    }
  }

  if(me.tank.direction == "right"){
    if(trg == "down"){
      me.turn("right")
    }
    if(trg == "up"){
      me.turn("left")
    }
    if(trg == "left"){
      me.turn("left")
    }
  }

  if(me.tank.direction == "down"){
    if(trg == "left"){
      me.turn("right")
    }
    if(trg == "right"){
      me.turn("left")
    }
    if(trg == "up"){
      me.turn("left")
    }
  }

  if(me.tank.direction == "left"){
    if(trg == "up"){
      me.turn("right")
    }
    if(trg == "down"){
      me.turn("left")
    }
    if(trg == "right"){
      me.turn("left")
    }
  }
}

/*常规开火判断 正对侧对就转过去打  背对就闪*/
function shouldfire(me, enemy, map){
  if(enemy.tank == null)return false;
  if(me.bullet !== null)return false;
  if(enemy.tank.position[0] === me.tank.position[0]){
    if((enemy.tank.position[1] - me.tank.position[1]) < 0 && canfire(map, me, enemy, "up")){
      if(me.tank.direction == "up"){
        return "fire"
      }else if(me.tank.direction == "down"){
        if(map[me.tank.position[0]+1][me.tank.position[1]] !== ‘x‘){
          turnto(me,‘right‘)
        }else{
            turnto(me,‘left‘)
        }
        me.go()
        turnto(me,‘up‘);
      }else{
        return "up"
      }
    }else if((enemy.tank.position[1] - me.tank.position[1]) > 0 && canfire(map, me, enemy, "down")){
      if(me.tank.direction == "down"){
        return "fire"
      }else if(me.tank.direction == "up"){
         if(map[me.tank.position[0]+1][me.tank.position[1]] !== ‘x‘){
          turnto(me,‘right‘)
        }else{
            turnto(me,‘left‘)
        }
        me.go()
        turnto(me,‘down‘);
      }else{
        return "down"
      }
    }
  }

  if(enemy.tank.position[1] === me.tank.position[1]){
    if((enemy.tank.position[0] - me.tank.position[0]) < 0 && canfire(map, me, enemy, "left")){
      if(me.tank.direction == "left"){
        return "fire"
      }else if(me.tank.direction == "right"){
        if(map[me.tank.position[0]][me.tank.position[1]+1] !== ‘x‘){
          turnto(me,‘down‘)
        }else{
            turnto(me,‘up‘)
        }
        me.go()
        turnto(me,‘left‘);
      }else{
        return "left"
      }
    }else if((enemy.tank.position[0] - me.tank.position[0]) > 0 && canfire(map, me, enemy, "right")){
      if(me.tank.direction == "right"){
        return "fire"
      }else if(me.tank.direction == "left"){
        if(map[me.tank.position[0]][me.tank.position[1]+1] !== ‘x‘){
          turnto(me,‘down‘)
        }else{
            turnto(me,‘up‘)
        }
        me.go()
        turnto(me,‘right‘);
      }else{
        return "right"
      }
    }
  }
  return false
}
/*要是开火路径上有墙就不打了*/
function canfire(map,me,enemy,dir){
  if(dir == "up"){
    for(i = me.tank.position[1]; i > enemy.tank.position[1]; i--){
      if(map[me.tank.position[0]][i] == ‘x‘)return false;
    }
    return true
  }

  if(dir == "down"){
    for(i = me.tank.position[1]; i < enemy.tank.position[1]; i++){
      if(map[me.tank.position[0]][i] == ‘x‘)return false;
      //print(me.tank.position[0]+"\t"+i+"\t"+map[me.tank.position[0]][i])
      //print(map)
    }
    return true
  }

  if(dir == "left"){
    for(i = me.tank.position[0]; i > enemy.tank.position[0]; i--){
      if(map[i][me.tank.position[1]] == ‘x‘)return false;
    }
    return true
  }

  if(dir == "right"){
    for(i = me.tank.position[0]; i < enemy.tank.position[0]; i++){
      if(map[i][me.tank.position[1]] == ‘x‘)return false;
    }
    return true
  }

  return false
}
时间: 2024-10-09 18:08:00

codegame AI坦克大战第一届杯赛 AI代码存档的相关文章

小白学习Unity 3D做经典游戏坦克大战日常

老师 | Trigger 学习者 |小白 出品 | Siki 学院 Hello,小伙伴们.接下来小白跟Trigger老师做一款2D游戏坦克大战.从素材.代码到场景和UI的游戏开发.小白把日常遇到的问题做一个记录贴,让各位小伙伴充分了解Untiy 3D基本游戏开发和一些小白容易疏忽的问题.Unity 3D有着非常便利的管理和编码功能.现在非常热门的MOBA游戏王者荣耀,也是用Unity 3D 开发的呢!用其他编程语言例如: java / kotlin 和 Object-C / swift 原生游戏

【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统

对于AI,我的初始想法很简单,首先他要能动,并且是在地图里面动, 懂得撞墙后转弯,然后懂得射击,其他的没有了,基于这个想法,我首先创建了一个MyTank类,用于管理玩家的坦克的活动,然后创建AITank类,AITank类继承MyTank类,这样的话,在AITank类上,只需要增加AI就可以了,具体的状态机实现,就放到MyTank类上即可. 首先来分析一下MyTank这个类,就从有限状态机开始吧. 一辆坦克的状态有下面几个: protected enum State { Idle, LeftWal

(java项目)坦克大战 2.0

这个版本,只能算是一个雏形,把最基本的东西给完成了,不过,后面可添加的也不多.有一点,还是想去实现,那就是敌方坦克自己寻找对手!也就是游戏AI. emmm, 什么时候可以了解一下这个AI.顺便学学python. 这个帖子只是为了贴上代码,对后续的代码作为优化和添加游戏AI做准备的. 1. 各类接口 package Event; /* *具有攻击力的接口 */ public interface Attackable { /* * 校验具有攻击力的实物, 和, 具有被攻击的实物,是否能撞在一起 *

【跟我一起学Unity3D】做一个2D的90坦克大战之地图编辑器

从10月20号到现在,Unity3D也学了10天了,对于Unity3D也有了一个大致的了解,有必要做一个小游戏来检测一下自己的学习成果了.经过两天的努力,终于总算是做出来了一个可以玩的坦克大战了.首先讲讲我的设计目标: 1.地图编辑器 2.道具系统 3.简单AI系统 4.计分器 其中,最重要的就是地图编辑器了,其次到AI系统,其他几个都挺简单的. ---------------------------------------------------------------------------

加强版坦克大战(java版)

转载自:http://blog.csdn.net/lihongxun945/article/details/6275581 这个坦克大战参考了初学java时看的马士兵的一个教程和小霸王上的坦克大战,并且加入了很多在魔兽中的英雄属性(移动速度,攻击速度,攻击力,生命上限等),还加入了一个小巧的地图编辑器. 废话不多说,先上图: 游戏界面: 地图编辑器: 详细说明: 1,除了坦克的图片外,其他图片全部为自己手绘,可能有点丑,特别是那个基地——! 2,游戏主界面,右边为属性窗口,在主界面按F4打开地图

电信学院第一届新生程序设计竞赛题解及std

首先非常感谢各位同学的参加,还有出题验题同学的辛勤付出 昨天想偷懒就是不想再把我C++11的想法改没了,大家看不懂的可以百度一下哦,懒得再写gcc了,毕竟代码是通的 题目类型一览 A Kannyi的数字密码 (模拟&&复杂的循环||手算)B Kannyi爱干净(注意变量初始化||set)C Kannyi的正方体和圆柱体(输入输出签到,PI已提示)D kannyi的独木桥(max和min)E Kannyi的简单检查 (循环签到 注意'-')F Kannyi的倒计时(a+b签到)G kanny

Egret学习-坦克大战开发

学习了几天Egret,基本的语法和用法了解的差不多了,现在开始写一个坦克大战练习下,实践是最好的学习方式 首先确定下开发内容,概要设计 1.加载一个TiledMap,作为游戏地图 2.坦克分为两个阵营,玩家和敌方 3.有砖块和石头作为障碍物,坦克不能穿过 4.通过鼠标控制玩家坦克移动,坦克移动到鼠标点击的位置,简单的寻路,先左右移,后上下移动,遇到障碍物则停止 5.鼠标点击坦克,坦克发射子弹, 1)子弹遇到敌方,敌方坦克消失,子弹消失, 2)子弹遇到砖块,砖块消失,子弹消失 3)子弹遇到石头,石

Java__线程---基础知识全面实战---坦克大战系列为例

今天想将自己去年自己编写的坦克大战的代码与大家分享一下,主要面向学习过java但对java运用并不是很熟悉的同学,该编程代码基本上涉及了java基础知识的各个方面,大家可以通过练习该程序对自己的java进行一下实战. 每个程序版本代码中,都附有相关注释,看完注释大家就可以对本程序设计有个很明显的思路.真的很有趣,想对java重新温习的同学完全不必再对厚厚的java基础书籍进行阅读了,在跟着本次代码练习并分析后,大家一定会对java各方面基础知识 尤其是线程的知识有更深一步的了解!!! 本次坦克大

坦克大战系列(8.0版)

人生在勤,不索何获.--张衡 本讲内容:坦克大战8.0版(面向对象的思想) 一.解决:防止敌人坦克重叠运动 1.定义一个Vector容器,装所有敌人的坦克(为了得到所有坦克坐标) 2.定义一个方法getEts()可以得到敌人的坦克(为了得到所有坦克坐标) 3.在我的我的面板的构造方法调用getEts() 4.定义一个判断是否碰到了别的敌人的坦克的方法isTouchOtherEnemy() 5.在设置敌人坦克随机走动那调用isTouchOtherEnemy() 二.解决:我方坦克死亡(即隐身)后,