人工智能实验1——二维网格空间中绕障碍物的机器人

 

二维网格空间中绕障碍物的机器人

预先给定机器人的目标任务,刺激响应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

读完地图就放到二维数组里,然后每次机器人运动就修改二维数组里的标记,每次刷新二维数组都要重新绘图,

运行后看到的就是机器人绕着中间那个障碍转,转,转。。。

posted @ 2013-01-23 22:35  sillypudding  阅读(1041)  评论(0编辑  收藏  举报