Escolar Documentos
Profissional Documentos
Cultura Documentos
Truco
Truco
.section .data
textocptruco: .asciz "\nCP: Truco? <1> Aceita <2> Corre <3> Seis? "
textocpseis: .asciz "\nCP: Seis? <1> Aceita <2> Corre <3> Nove? "
textocpnove: .asciz "\nCP: Nove? <1> Aceita <2> Corre <3> Doze? "
textocpdoze: .asciz "\nCP: Doze? <1> Aceita <2> Corre? "
# registra a manilha
manilha: .int 0,0 # idcarta e poder da carta
tempo: .int 4
faixageral: .int 40
faixacartas: .int 10
faixanaipes: .int 4
faixapoderes: .int 14
resp: .int 0
.section .text
.globl _start
_start:
call iniciarand
call sorteiaquemcomeca
volta1:
call sorteiavira
call achamanilha
call sorteiacartas
call sorteiacartas
call jogamao
call tratafimmao
call checafimpartida # deve ser chamado antes de resetamao
call resetamao
call alternamaodequem
call mostrafinal
pushl $0
call exit
pushl $tempo
call time # o tempo atual será a semente de geração aleatória
pushl tempo
call srand
addl $8, %esp
ret
# sorteia a carta vira, para posteriormente verificar quais cartas sao manilhas
sorteiavira:
call sortidgcarta
ret
achamanilha:
ret
sorteiaquemcomeca:
call rand
movl $0, %edx
divl dois
movl %edx, quemjoga
movl %edx, maodequem
ret
sorteiacartas:
volta2:
pushl %ecx
call registracarta
call registranaipe
call registrapoder
incl ordemcarta
popl %ecx
loop volta2
ret
sortidgcarta:
call rand
movl $0, %edx
divl faixageral # %edx fica com o nro da carta de 0 a 39
movl %edx, idgcarta
ret
registracarta:
ret
registranaipe:
ret
registrapoder:
cartanormal:
ret
jogamao:
incl nrodamao
call mostracartas
volta3:
call cpjoga
jmp testafim
jgjoga2:
call jgjoga
testafim:
# acabou a mao
ret
cpjoga:
pushl $textocpjoga
call printf
addl $4, %esp
call retornaprob
cmpl $1, %eax
jne cpjogaquieto
# reage: truco, seis, nove ou doze
cpjogaquieto:
call cpjoga1carta
ret
cpchamatruco2:
call cpchamatruco
ret
cpchamatruco:
pushl $textocptruco
call printf
call getchar # retorna caracter lido em %eax
movl %eax, resp
call getchar # coleta enter
addl $4, %esp
jgchamaseis:
pushl $textojgseis
call printf
addl $4, %esp
call retornaprob
cmpl $3, %eax
je cpcorreseis
cmpl $2, %eax
je cpaceitaseis
cpchamanove:
pushl $textocpnove
call printf
call getchar # retorna caracter lido em %eax
movl %eax, resp
call getchar # coleta enter
addl $4, %esp
jgchamadoze:
pushl $textojgdoze
call printf
addl $4, %esp
call retornaprob
cmpl $3, %eax
je cpcorredoze
cpaceitadoze:
pushl $textocpaceitou
call printf
addl $4, %esp
cpcorredoze:
pushl $textocpcorreu
call printf
addl $4, %esp
movl $1, fimmao
movl $1, venceumao
movl pontosjg, %eax
addl $9, %eax
movl %eax, pontosjg
ret
jgaceitanove:
pushl $textojgaceitou
call printf
addl $4, %esp
jgcorrenove:
pushl $textojgcorreu
call printf
addl $4, %esp
cpcorreseis:
pushl $textocpcorreu
call printf
addl $4, %esp
cpaceitaseis:
pushl $textocpaceitou
call printf
addl $4, %esp
jgaceitatruco:
pushl $textojgaceitou
call printf
addl $4, %esp
jgcorretruco:
pushl $textojgcorreu
call printf
addl $4, %esp
cpanalisaseis:
cpchamaseis:
pushl $textocpseis
call printf
call getchar # retorna caracter lido em %eax
movl %eax, resp
call getchar # coleta enter
addl $4, %esp
jgchamanove:
call retornaprob
cmpl $3, %eax
je cpcorrenove
cmpl $2, %eax
je cpaceitanove
cpchamadoze:
pushl $textocpdoze
call printf
call getchar # retorna caracter lido em %eax
movl %eax, resp
call getchar # coleta enter
addl $4, %esp
jgcorredoze:
pushl $textojgcorreu
call printf
addl $4, %esp
cpanalisanove:
cpanalisadoze:
# fazer aqui
call mostracartas
call checalance
call alternaquemjoga
ret
cpaceitanove:
# fazer aqui
ret
cpcorrenove:
# fazer aqui
ret
jgcorreseis:
# fazer aqui
ret
jgaceitaseis:
# fazer aqui
ret
retornaprob:
call rand
movl $0, %edx
divl cem
probbaixa:
movl $3, %eax
jmp contprob
probalta:
movl $1, %eax
jmp contprob
probmedia:
movl $2, %eax
contprob:
pushl %eax
pushl $textoprob
call printf
addl $4, %esp
popl %eax
ret
cpjoga1carta:
call checalance
call alternaquemjoga
call mostracartas
ret
cpescolhecarta:
call rand
movl $0, %edx
divl tres # %edx esta com o ordem da carta (0, 1 ou 2)
checalance:
incl nrojogada
movl nrojogada, %eax
cmpl $2, %eax # duas jogadas fecha um lance -> anota situacao
jl fimchecalance
finalizalance:
movl $0, nrojogada
incl nrolance
movl nrolance, %eax
cmpl $3, %eax
jl contchecalance
movl $1, fimmao
contchecalance:
movl podercp, %eax
movl poderjg, %ebx
cmpl %ebx, %eax
jl jgvencelanceatual2
jg cpvencelanceatual2
call empatalanceatual
jmp fimchecalance
jgvencelanceatual2:
call jgvencelanceatual
jmp fimchecalance
cpvencelanceatual2:
call cpvencelanceatual
fimchecalance:
ret
empatalanceatual:
pushl $textolanceempatou
call printf
addl $4, %esp
checalance1:
empatoulance1:
movl nrolance, %eax
cmpl $2, %eax
je fimempatalanceatual # empatou 1o e 2o lances -> decide em proximo
checalance2:
# senao, acabou a mao e lance 2 só pode ter empatado tambem, senao
# já teria definido empatou todos os lances -> pontos pra ninguem
fimempatalanceatual:
ret
jgvencelanceatual:
pushl $textojgvenceulance
call printf
addl $4, %esp
jgchecalance1:
fimjgvencelanceatual:
ret
cpvencelanceatual:
pushl $textocpvenceulance
call printf
addl $4, %esp
cpchecalance1:
fimcpvencelanceatual:
ret
alternaquemjoga:
incl quemjoga
movl quemjoga, %eax
movl $0, %edx
divl dois
movl %edx, quemjoga
ret
alternamaodequem:
incl maodequem
movl maodequem, %eax
movl $0, %edx
divl dois
movl %edx, maodequem
movl %edx, quemjoga
ret
mostracartas:
pushl nrodamao
pushl $texto0
call printf
addl $8, %esp
call mostravira
pushl $texto2
call printf
addl $4, %esp
call mostrapontos
call empilhacartas
call empilhacartas
pushl $texto4
call printf
ret
popl %ebx
movl %ebx, retorno
movl $3, %ecx
volta4:
abrecarta:
proximo:
loop volta4
pushl retorno
ret
mostravira:
pushl $texto1
call printf
addl $12, %esp
ret
mostrapontos:
pushl pontosjg
pushl pontoscp
pushl $texto3
call printf
addl $12, %esp
ret
tratafimmao:
tratamaoempatou:
pushl $textomaoempatou
call printf
jmp contmao
tratacpvenceumao:
pushl $textocpvenceumao
call printf
jmp contmao
tratajgvenceumao:
pushl $textojgvenceumao
call printf
contmao:
checafimpartida:
tratacpvenceu:
movl $12, pontoscp
movl $0, venceupartida
movl $1, fimpartida
contpartida:
ret
resetamao:
# fazer aqui
# cartas sorteadas
# status das cartas do computador e jogador
# status dos lances
# nivel da mao
# variaveis de controle do lance
voltaresetamao:
movl $0, (%edi)
addl $4, %edi
loop voltaresetamao
ret
mostrafinal:
pushl $textofimpartida
call printf
movl venceupartida, %eax
cmpl $0, %eax
je cpvenceupartida
jgvenceupartida:
pushl pontosjg
pushl $textojgvenceupartida
call printf
cpvenceupartida:
pushl pontoscp
pushl $textocpvenceupartida
call printf
fimgeral: