1. 問題
在一個1000*1000格子的棋盤上,有一只螞蟻(ant),螞蟻的爬行規(guī)則是:(1)如果螞蟻所在的棋盤是白色的,則螞蟻將所在格子設(shè)置為黑色,并向右邊爬行一個格子。(2)如果螞蟻所在的棋盤是黑色的,則螞蟻將所在格子設(shè)置為白色,并向左邊爬行一個格子。問:請顯示螞蟻爬行10000次后,棋盤的樣子。
2. 思考
首先,我們需要創(chuàng)建一個棋盤類(Board)和一個螞蟻類(Ant)。棋盤類包含一個二維數(shù)組表示棋盤的狀態(tài),以及一個方法用于顯示棋盤。螞蟻類包含螞蟻當(dāng)前的位置和爬行方法。
解析:
- 創(chuàng)建棋盤類(Board),包含一個二維數(shù)組表示棋盤狀態(tài),以及一個方法用于顯示棋盤。
- 創(chuàng)建螞蟻類(Ant),包含螞蟻當(dāng)前的位置.方向,和爬行方法 move。
- 在主函數(shù)中,創(chuàng)建一個1000*1000的棋盤實(shí)例和一個螞蟻實(shí)例。
- 讓螞蟻爬行10000次。
- 顯示爬行后的棋盤狀態(tài)。
3. 代碼
3.1 設(shè)計(jì) Board類 和 Ant 類, 代碼如下:
import matplotlib.pyplot as plt
import numpy as np
class Board:
def __init__(self, size):
self.size = size
# 創(chuàng)建初始棋盤,設(shè)置為全0的格子: 注意: 0 表示 白色,1表示 黑色
self.board = np.zeros((size, size))
def display(self):
# Create the figure and axes
fig, ax = plt.subplots()
# Display the array as an image using imshow
# cmap='gray' sets the colormap to grayscale
# imshow 似乎 0 表示黑的,1 表示白色,因此,我這里用函數(shù) np.logical_not()取反了一下
plt.imshow(np.logical_not(self.board), cmap='gray')
# Set axis labels and title (optional)
ax.set_xlabel("X-axis")
ax.set_ylabel("Y-axis")
ax.set_title("Footprint of Ant on 2D World")
# Display the plot
plt.show()
class Ant:
def __init__(self, board):
# 假定初始在 棋盤中央
self.x = board.size // 2
self.y = board.size // 2
# 假定初始方向朝上, 90度
self.direction = 90
def climb_one(self, board):
if self.direction == 0 : # right, 向右邊爬行一格
self.x = self.x + 1
elif self.direction == 270: # down, 向下爬行一格
self.y = self.y - 1
elif self.direction == 180: # left, 向左爬行一格
self.x = self.x - 1
elif self.direction == 90: # up, 向上爬行一格
self.y = self.y + 1
# 處理一下跑出邊界問題:
# 如果小于0, 則移動到最大值處, PS: 這樣設(shè)置是有部分道理的,因?yàn)樾∮? 時候,direction是向左 或 向上的,
# 移動到最大值時候,ant 方向向內(nèi)
# 如果大于最大值,則移動到0 處
if self.x == -1 :
self.x = board.size - 1
if self.y == -1 :
self.y = board.size - 1
if self.x == board.size - 1 :
self.x = 0
if self.y == board.size - 1 :
self.y = 0
def move(self, board):
if board.board[self.x][self.y] == 0: # 原來是白色0
# Step 1: 腳下格子設(shè)置為黑色1
board.board[self.x][self.y] = 1
# Step 2: 右轉(zhuǎn)
self.direction = (self.direction - 90) % 360
# Step 3:爬行一格
self.climb_one(board)
else: # 原來是黑色1
# Step 1: 腳下格子設(shè)置為白色0
board.board[self.x][self.y] = 0
# Step 2:左 轉(zhuǎn)
self.direction = (self.direction + 90) % 360
# Step 3:爬行一格
self.climb_one(board)
3.2 測試代碼
def run():
board = Board(250) # 棋盤大小設(shè)置
ant = Ant(board)
for _ in range(1000000): # 螞蟻爬行次數(shù)
ant.move(board)
print("moving ......")
board.display()
if __name__ == '__main__':
run()
4 結(jié)果展示
4.1 螞蟻初始方向頭朝上,棋盤 100* 100 , 爬行 15000次
4.2 螞蟻初始方向頭朝上,棋盤 100* 100 , 爬行 1000次
4.3 螞蟻初始方向頭朝上,棋盤 1000* 1000 , 爬行 50000次
4.4 螞蟻初始方向頭朝右,棋盤 250* 250 , 爬行 50000次
文章來源:http://www.zghlxwxcb.cn/news/detail-855142.html
4.5 螞蟻初始方向頭朝右,棋盤 250* 250 , 爬行 100W次
文章來源地址http://www.zghlxwxcb.cn/news/detail-855142.html
到了這里,關(guān)于蘭頓螞蟻:從無序到有序的偉大征程的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!