二维网格空间中绕障碍物的机器人
预先给定机器人的目标任务,刺激响应Agent通过感知简单二维世界中的信息,作出简单的动作决策。
挺简单的,就是老师给的PPT里的规则竟然是错的,折磨了我好久,ORZ...这里贴下修改后的规则,应该是对的
代码写得比较烂,算是学习的一个记录吧。。。
1 package net.MyTest; 2 3 import javax.swing.*; 4 import javax.swing.border.BevelBorder; 5 import javax.swing.border.SoftBevelBorder; 6 import javax.swing.plaf.basic.BasicInternalFrameTitlePane.MoveAction; 7 import javax.swing.text.StyledEditorKit.ForegroundAction; 8 9 import java.awt.*; 10 import java.awt.event.*; 11 import java.io.BufferedReader; 12 import java.io.FileReader; 13 import java.util.Random; 14 import java.util.Set; 15 16 class MyDrawPanel extends JPanel { 17 18 public char[][] mazePaint = new char[100][100]; 19 public int m,n; 20 21 Image robotA = new ImageIcon("robotA.jpg").getImage(); 22 23 public void paintComponent(Graphics g) { 24 for(int i=0;i<m;i++) 25 for(int j=0;j<n;j++){ 26 if(mazePaint[i][j] == '0'){ 27 g.setColor(Color.white);//通路涂成白色 28 g.fillRect(j*26,i*26,26,26); 29 } 30 else if(mazePaint[i][j] == '1'){ 31 g.setColor(Color.black);//障碍涂成黑色 32 g.fillRect(j*26,i*26,26,26); 33 } 34 else if(mazePaint[i][j] == '#'){//机器人上张小图片 35 g.drawImage(robotA,j*26,i*26,26,26,this); 36 } 37 38 } 39 } 40 41 } 42 43 public class ShowWindow { 44 45 public static int ra1,ra2; 46 public static char[][] mazeChar = new char[100][100]; 47 public static boolean[][] mazebool = new boolean[100][100]; 48 49 public static void MoveRobot(char robotIndex){//JAVA没有引用传递,555 50 if(robotIndex == 'a'){ 51 if ( mazebool[ra1+1][ra2+1] && !mazebool[ra1+1][ra2]){ 52 mazeChar[ra1][ra2] = '0'; 53 mazeChar[ra1+1][ra2] = '#';//South 54 ra1++; 55 } 56 else if (mazebool[ra1+1][ra2] && !mazebool[ra1][ra2-1]){ 57 mazeChar[ra1][ra2] = '0'; 58 mazeChar[ra1][ra2-1] = '#';//West 59 ra2--; 60 } 61 else if (mazebool[ra1+1][ra2-1] && !mazebool[ra1][ra2-1]) { 62 mazeChar[ra1][ra2] = '0'; 63 mazeChar[ra1][ra2-1] = '#';//West 64 ra2--; 65 } 66 else if (mazebool[ra1][ra2-1] && !mazebool[ra1-1][ra2]) { 67 mazeChar[ra1][ra2] = '0'; 68 mazeChar[ra1-1][ra2] = '#';//North 69 ra1--; 70 } 71 else if (mazebool[ra1-1][ra2-1] && !mazebool[ra1-1][ra2]) { 72 mazeChar[ra1][ra2] = '0'; 73 mazeChar[ra1-1][ra2] = '#';//North 74 ra1--; 75 } 76 else if (mazebool[ra1-1][ra2] && !mazebool[ra1][ra2+1]) { 77 mazeChar[ra1][ra2] = '0'; 78 mazeChar[ra1][ra2+1] = '#';//East 79 ra2++; 80 } 81 else if (mazebool[ra1-1][ra2+1] && !mazebool[ra1][ra2+1]) { 82 mazeChar[ra1][ra2] = '0'; 83 mazeChar[ra1][ra2+1] = '#';//East 84 ra2++; 85 } 86 else if (mazebool[ra1][ra2+1] && !mazebool[ra1+1][ra2]) { 87 mazeChar[ra1][ra2] = '0'; 88 mazeChar[ra1+1][ra2] = '#';//South 89 ra1++; 90 } 91 else { 92 mazeChar[ra1][ra2] = '0'; 93 mazeChar[ra1-1][ra2] = '#';//North 94 ra1--; 95 } 96 } 97 98 } 99 100 public static void main (String[] args) { 101 102 try { 103 104 BufferedReader br = new BufferedReader(new FileReader("maze.txt")); 105 int m = Integer.parseInt(br.readLine().trim()); 106 int n = Integer.parseInt(br.readLine().trim()); 107 int k = 0; 108 109 while (k < m) { 110 mazeChar[k] = br.readLine().trim().toCharArray();//get the maze 111 k++; 112 } 113 //char array to boolean array 114 for(int i = 0; i < m; i++) 115 for(int j = 0;j< n;j++) 116 mazebool[i][j] = mazeChar[i][j] == '0'? false : true ; 117 118 ra1 = Integer.parseInt(br.readLine().trim());//robot a 119 ra2 = Integer.parseInt(br.readLine().trim()); 120 121 mazeChar[ra1][ra2] = '#'; 122 br.close(); 123 124 JFrame frame = new JFrame(); 125 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 126 127 MyDrawPanel drawPanel = new MyDrawPanel(); 128 drawPanel.m = m; 129 drawPanel.n = n; 130 131 frame.getContentPane().add(BorderLayout.CENTER, drawPanel); 132 133 134 frame.setSize(420,420); 135 frame.setVisible(true); 136 137 while(true) { 138 MoveRobot('a'); 139 140 for(int i=0;i<m;i++) 141 for(int j=0;j<n;j++) 142 drawPanel.mazePaint[i][j] = mazeChar[i][j]; 143 144 drawPanel.repaint(); 145 Thread.sleep(300); 146 } 147 148 } catch (Exception e) { 149 } 150 151 } 152 153 }
读入TXT文件时,会先读入地图的横纵大小,再读地图,1为障碍物,0为可走的路,外围有一圈围墙为1,
然后读入的是机器人A的坐标。
TXT示例:
13
16
1111111111111000
1000000000001000
1000000000001000
1000000000001000
1000000000001111
1001111110000001
1001100110000001
1001100110000001
1000000000001111
1000000000001000
1000001110001000
1000001010001000
1111111011111000
8
6
读完地图就放到二维数组里,然后每次机器人运动就修改二维数组里的标记,每次刷新二维数组都要重新绘图,
运行后看到的就是机器人绕着中间那个障碍转,转,转。。。