Prolog游戏给出错误答案,只有一个答案

时间:2019-05-29 05:34:21

标签: prolog

我正在Prolog中制作“游戏”,从数组的初始位置开始,游戏必须返回所有可能的路径,其中整个数组为-1,当前位置设置为0。必须写入所有可能的路径在.txt文件中路由

通过崇高的编辑方式,使用SWI-Prolog进行编译。

初始函数在矩阵中接收初始位置X,Y

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation 'androidx.core:core-ktx:1.0.2'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.recyclerview:recyclerview:1.1.0-alpha05'
    implementation 'androidx.cardview:cardview:1.0.0'
    implementation 'com.android.support:design:28.1.0'

    implementation "android.arch.lifecycle:extensions:2.2.0-alpha01"
    implementation "android.arch.persistence.room:runtime:2.1.0-beta01"
    implementation "android.arch.paging:runtime:2.1.0-beta01"

    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'

    implementation 'io.sentry:sentry-android:1.7.16'
    implementation 'org.slf4j:slf4j-nop:1.7.25'
}

打印矩阵

inicia(X,Y,Matriz,Caminho) :- jogar(Matriz,X,Y,Caminho), escreveArq(Caminho). 

写在文件上

imprimeMatriz([]).
imprimeMatriz([H|T]) :- imprimeLista(H),nl, imprimeMatriz(T).
imprimeLista([]).
imprimeLista([H|T]) :- write(H),  write(", "), imprimeLista(T).

恢复元素X Y

escreveArq([]).
escreveArq(Rota) :- open('caminho.txt', write, ID), writeq(ID,Rota), write(ID,'\n'), close(ID).

搜索邻居元素

recuperaElemento(X, Y, Elemento,Matriz) :- achaElemento(X,0,Matriz,ListaX), achaElemento(Y,0,ListaX,Elemento).
achaElemento(_,_,[],_) :- false.
achaElemento(Elemento,Aux,[H|_],H) :- Elemento == Aux.
achaElemento(Elemento,Aux,[_|HT],R) :- Aux1 is Aux + 1, achaElemento(Elemento,Aux1,HT,R).

检查游戏结束

elementoSuperior(X,Y,Elemento,Matriz) :- N is X-1, recuperaElemento(N,Y,Elemento, Matriz).
elementoSuperior(_,_,-5,_).
elementoInferior(X,Y,Elemento,Matriz) :- N is X+1, recuperaElemento(N,Y,Elemento,Matriz).
elementoInferior(_,_,-5,_).
elementoDireita(X,Y,Elemento,Matriz) :- N is Y+1, recuperaElemento(X,N,Elemento,Matriz).
elementoDireita(_,_,-5,_).
elementoEsquerda(X,Y,Elemento,Matriz) :- N is Y-1, recuperaElemento(X,N,Elemento,Matriz).
elementoEsquerda(_,_,-5,_).
fimDeJogo(Matriz) :- verificaFim(Matriz,R), R == 1.
    verificaFim([],X) :- X is 0.
    verificaFim([H|T],X) :- verificaFimColuna(H,X1), verificaFim(T,X2), X is X1 + X2.
    verificaFimColuna([],X) :- X is 0, !.
    verificaFimColuna([H|T],R) :- H == -1, verificaFimColuna(T, R).
    verificaFimColuna([H|T],X) :- H == 0, verificaFimColuna(T, R), X is R+1.

玩游戏 随着数组的增加添加S 添加,当它向左移动时 向右添加D 当它出现故障时添加我

impossivelJogar(Matriz, X,Y) :- elementosVizinhos(X,Y,Resp,Matriz), verifica(Resp).
    verifica([]).
    verifica([H|T]) :- H < 0, verifica(T).

减少矩阵中的X值

jogar(Matriz, _,_,_) :- fimDeJogo(Matriz).
jogar(Matriz, X,Y,["S"|Rota]) :- elementoSuperior(X,Y,Z,Matriz),Z > -1,decrementa(X,Y,Matriz,NMAtriz),
                                                                                        NX is X-1,jogar(NMAtriz, NX, Y,Rota).
jogar(Matriz, X,Y,["I"|Rota]) :- elementoInferior(X,Y,Z,Matriz),Z > -1,decrementa(X,Y,Matriz,NMAtriz),
                                                                                        NX is X+1,jogar(NMAtriz, NX, Y,Rota).
jogar(Matriz, X,Y,["E"|Rota]) :- elementoEsquerda(X,Y,Z,Matriz),Z > -1,decrementa(X,Y,Matriz,NMAtriz),
                                                                                        NY is Y-1,jogar(NMAtriz, X, NY,Rota).
jogar(Matriz, X,Y,["D"|Rota]) :- elementoDireita(X,Y,Z,Matriz) ,Z > -1,decrementa(X,Y,Matriz,NMAtriz),
                                                                                        NY is Y+1,jogar(NMAtriz, X, NY,Rota).

对于某些矩阵,例如[[1,1,1],[1,1,1],[1,1,1]会生成错误的路径,并且仅显示路径。

我相信导致错误提示的错误在以下代码段中:

decrementa(X,Y,Matriz, MatrizAtualizada) :- reduzX(X,Y,0,0,Matriz,MatrizAtualizada).
    reduzX(_,_,    _,    _,    [],         []) .
    reduzX(X,Y,    X, AuxY, [H|T], [LAlt|Mat]) :- NX is X+1,reduzY(X,Y, AuxY,  AuxY, H, LAlt), reduzX(X,Y,NX, AuxY, T, Mat).
    reduzX(X,Y, AuxX, AuxY, [H|T], [   H|Mat]) :- NAuxX is AuxX+1, reduzX(X,Y,NAuxX, AuxY, T,  Mat).
        reduzY(_,_, _,    _,    [],       []) .
        reduzY(_,Y, _,    Y, [H|T], [NH|MAT]) :- NH is H-1, NY is Y+1,   reduzY(_,Y, _, NY, T, MAT).
        reduzY(_,Y, _, AuxY, [H|T], [ H|MAT]) :-           NY is AuxY+1, reduzY(_,Y, _, NY, T, MAT).

当游戏没有结束并且无法玩时,程序应返回并尝试另一条路径,而是检查下一个选项并“强制”一条路径。如何无法继续并返回尝试新的路径以查看不再有可能的选择?

0 个答案:

没有答案
相关问题