저는 초보자이지만 자바와 C++로 경험했습니다. 이제는 Conway의 평행 게임을 구현하기 위해 akka 배우 모델을 사용하고 싶습니다. 내 생각은 50 * 50 격자를 만들고, 각 셀은 배우이고, 배우에게 메시지를 전달하여 업데이트합니다. 액터를 만드는 방법은 다음과 같습니다.스케이프 akka 배우 모델을 사용하여 인생 게임에서 이웃 배우를 호출합니다.
class World(row: Int, col: Int, step: Int) extends Actor {
val random = new Random() //generate the alive or dead cell for the game
val cellgrid = new World(row, col, step)
def receive = {
case Start => {
for(gridrow <- 0 until row) {
for(gridcol <- 0 until col) {
context.actorOf(Props(new Grid(random.nextBoolean, gridrow, gridcol, row, col, step)))
}
}
for (gridrow <- 0 until row) {
for (gridcol <- 0 until col) {
sender ! Compare()
}
}
}
case Done(gridrow, gridcol, alive) => {
for(gridrow <- 0 until row) {
for(gridcol <- 0 until col) {
if(alive) print("* ")
else print(" ")
}
print("\n")
}
sender ! Stop
}
case Stop => {context.stop(self); println("Stopped the actor system!")}
case _ => context.stop(self)
}
}
하지만 문제가 발생합니다. 그리드 클래스가 너무 많아서 이웃 배우를 호출하는 데 문제가 있습니다.
class Grid(var life: Boolean, gridrow: Int, gridcol: Int, row: Int, col: Int, step: Int) extends Actor {
val alive = life
var numNeighbors = 0
var currentStep = 0
val desiredSteps = step
val count = Array(0,0)
val countsuround = Array(0,0)
for (neighbourX <- gridrow - 1 to gridrow + 1) {
if (neighbourX >= 0 && neighbourX < col) {
for (neighbourY <- gridcol - 1 to gridcol + 1) {
if (neighbourY >= 0 && neighbourY < row && (neighbourX != row && neighbourY != col))
numNeighbors = numNeighbors + 1
}
}
}
def receive = {
case Compare() => {
for (neighbourX <- gridrow - 1 to gridrow + 1) {
if (neighbourX >= 0 && neighbourX < col) {
for (neighbourY <- gridcol - 1 to gridcol + 1) {
if (neighbourY >= 0 && neighbourY < row && (neighbourX != row && neighbourY != col))
sender ! Record(life, currentStep) //Here I need to pass messages to my neighbors
}
}
}
}
case Record(alive,step) => {
if(alive == true){
count(step%2) += 1
}
countsuround(step%2) += 1
self ! Check()
}
case Check() => {
if(countsuround(currentStep%2) == numNeighbors) {
if(count(currentStep%2) ==3 ||life == true && count(currentStep%2) == 2)
life = true
else
life = false
count(currentStep%2) =0; countsuround(currentStep%2) = count(currentStep%2)
currentStep += 1
if(desiredSteps <= currentStep + 1)
sender ! Stop
else {
sender ! Done(gridrow, gridcol, alive)
//context.stop(self)
}
}
}
}
}
그 말에, 내 이웃에게 메시지 기록을 보낼 필요가, 수신 기능의 비교 사례에서 봐 주시기 바랍니다,하지만 적절한를 찾을 수 없습니다 : 여기 그리드 클래스입니다 나는 이웃에 대한 어떤 인덱스도 가지고 있지 않다. (이웃 X, 이웃 Y). 레코드 (life, currentStep)). 제발 도와주세요. 몇 주 동안 여기 붙어 있습니다. 감사!!!
나는 코드가 작동하는지 아직 확실하지 않다, 그래서 당신은 뭔가 문제가 있다고 생각하면, 내가 아니라 병렬 방식으로,이 작업을 수행, 코드를 시도했습니다 나에게 – HONTAKYU