rem シムアント new '********** global variable ********** global AntSu, MapX, MapY, FoodSu AntSu = 20 FoodSu =80 MapX = 40 MapY = 40 global Map[MapY * MapX] global AntXY[AntSu + 1], AntD[AntSu + 1], AntFood[AntSu + 1] global ProcMode global mx, my, cw mx = 10 my = 10 cw = 9 global io, b1, b2 '********** initialize ********** sub init{ dim i, j, n, m 'clear map n = 0 m = MapY * MapX while(n < m){ Map[n] = 0 n = n + 1 } 'set ant n = 0 while(n < AntSu){ m = rnd(MapY * MapX) if(Map[m] == 0){ Map[m] = 2 AntXY[n] = m AntD[n] = rnd(4) AntFood[n] = 0 n = n + 1 } } 'set food n = 0 while(n < FoodSu){ m = rnd(MapY * MapX) if(Map[m] == 0){ Map[m] = 1 n = n + 1 } } ProcMode = 1 } '********** cell print ********** sub cell(x, y){ x = x * cw + mx y = y * cw + my io.pos(x, y) io.rect(cw - 2, cw - 2) } '********** celldisp ********** sub celldisp(n){ dim x, y if(Map[n] == 0){ io.color = 0xd0d0d0 } if(Map[n] == 1){ io.color = 0x00ffff } if(Map[n] == 2){ io.color = 0x000000 } cell(mod(n, MapX), int(n / MapX)) } '********** all cell print ********** sub disp{ dim n, m io.Visible = 0 n = 0 m = MapY * MapX while(n < m){ celldisp(n) n = n + 1 } io.Visible = 1 } '********** click cell set ********** sub set_cell(x, y){ if(Map[y * MapX + x] == 0){ Map[y * MapX + x] = 1 io.color = 0x0ffff cell(x, y) return } if(Map[y * MapX + x] == 1){ Map[y * MapX + x] = 0 io.color = 0xd0d0d0 cell(x, y) return } } '********** reset ********** sub reset{ init disp } '********** mouse click ********** sub click(x, y, k){ dim x1, y1, w ' CELL x1 = 0 while(x1 < MapX){ w = x1 * cw + mx if((x >= w) * (x <= w + cw - 2)) break x1 = x1 + 1 } y1 = 0 while(y1 < MapY){ w = y1 * cw + my if((y >= w) * (y <= w + cw - 2 )) break y1 = y1 + 1 } if((x1 < MapX) * (y1 < MapY)){ set_cell(x1, y1) return } } '********** button 1 click ********** sub bclick1{ if(ProcMode == 0){ b1.Caption = "STOP" ProcMode = 1 } else{ b1.Caption = "START" ProcMode = 0 } } '********** button 2 click ********** sub bclick2{ b1.Caption = "STOP" reset } '********** getfront ********** sub getfront(n){ dim a, b a = AntD[n] if(a == 0){ b = AntXY[n] + 1 if(b > MapY * MapX - 1){ b = 0 } } if(a == 1){ b = AntXY[n] + MapX if(b > MapY * MapX - 1){ b = b - MapY * MapX + 1 } } if(a == 2){ b = AntXY[n] - 1 if(b < 0){ b = MapY * MapX - 1} } if(a == 3){ b = AntXY[n] - MapX if(b < 0){ b = MapY * MapX + b - 1} } return(b) } '********** ant calculate ********** sub ant(n){ dim a ' 前をみる a = getfront(n) ' エサがあるか? if(Map[a] == 1){ ' エサをもっているか? if(AntFood[n] == 1){ ' エサを置く if(Map[AntXY[n]] != 1){ Map[AntXY[n]] = 1 AntFood[n] = 0 celldisp(AntXY[n]) } } else{ ' エサを取る Map[a] = 0 AntFood[n] = 1 celldisp(a) } ' 方向転換 AntD[n] = rnd(4) } ' 別のアントがいる? if(Map[a] == 2){ ' 方向転換 AntD[n] = rnd(4) } ' 何もない? if(Map[a] == 0){ ' 進む if(Map[AntXY[n]] == 2){ Map[AntXY[n]] = 0 celldisp(AntXY[n]) } Map[a] = 2 AntXY[n] = a celldisp(a) celldisp(AntXY[n]) } } '********** string print ********** sub spr(x, y, w, a$, fc, bc){ io.color = bc io.pos(x, y) io.rect(w, 20) io.color = fc io.pos(x + 12, y + 3) io.text = a$ } '********** main ********** sub main{ dim n io = Create Image io.Width = mx + cw * MapX + mx + 60 + mx io.Height = my + cw * MapY + my io.OnMouseDown = click b1 = Create Button b1.Caption = "STOP" b1.Top = my + 0 b1.Left = mx + cw * MapX + mx b1.Width = 60 b1.Height = 20 b1.OnClick = bclick1 b2 = Create Button b2.Caption = "RESET" b2.Top = my + 30 b2.Left = mx + cw * MapX + mx b2.Width = 60 b2.Height = 20 b2.OnClick = bclick2 DispProgram(0) MainForm.ClientWidth = io.Width MainForm.ClientHeight = io.Height MainTextBox.Visible = 0 init disp while(1){ if(ProcMode == 1){ n = rnd(AntSu) ant(n) } } } '********** program start ********** main