image thumbnail
from EnRaya 0.9 beta by Jorge Crespo
El clásico tres en raya sobre consola MatLab. The classic Tic-Tac-Toe on MatLab console

enraya.m
function [  ] = enraya( )
% Funcion tres en raya sobre consola MatLab



%Copyright (C) 2012  Jorge Crespo bajo licencia BSD
%Copyright (C) 2012  Jorge Crespo under license BSD





%Saludo y variables iniciales
fprintf '\n'
fprintf 'Bienvenido al 3 en raya sobre MatLab en consola, el original \n'
fprintf '\n'
jug=0;
Stop=0;
A=[0 0 0;0 0 0;0 0 0];
contador=0;
jugando=0;


%Se repite ste ciclo en cada jugada
while Stop==0

	%Seleccin del modo de juego
	if jugando==0
		modo=input ('Introduzca el modo de juego que desea; 1 para un jugador, 2 para dos jugadores y 3 para salir: ');
	end  

	%Si seleccionas salir, se sale del ciclo de arriba
	if modo==3
		Stop=1;
		jugando=3;
	end
	
	%Modo de un jugador
	if modo==1
    
		%Mensaje de inicio    
    		if jugando==0
			fprintf ('Ha seleccionado el modo de un jugadores. Usted es el jugador uno y la mquina el dos. El primer turno ser suyo \n', jug);
		end
		jugando=1;
    
		%Cambio de jugador en cada turno
		if jug==1
			jug=2;
		else;
      			jug=1;
		end
    
		%Introduccin de casilla del jugador 1 (Humano)
		if jug==1
			fprintf '\n'
			fprintf ('Turno del jugador %1.0f \n', jug);
			fila=input ('Introduzca la FILA donde colocar su ficha: ');
			columna=input ('Introduzca la COLUMNA donde colocar su ficha: ');
			fprintf '\n'
		end
    
		%Sistema de IA para seleccionar la casilla por la mquina
		%Hace una serie de pruebas y cuando una tiene xito no hace las siguientes
		if jug==2
			fprintf '\n'
			fprintf ('Turno de la mquina \n', jug);
			fprintf '\n'
			calcula_posicion=0;
			while calcula_posicion==0
				prueba=1;

				%En la prueba uno comprueba si la casilla central est ocupada, si no lo est, la selecciona
				if prueba==1
					if A(2,2)==0
						fila=2;
						columna=2;
						prueba=0;
						calcula_posicion=1;
					else
						prueba=2;
					end
				end
        
				%En la prueba dos primero comprueba si ocupando alguna casilla puede ganar y despus
				%Si el jugador uno puede ganar ocupando alguna otra
				if prueba==2
					fila=0;
					columna=0;
					if A(2,2)==jug
						if A(1,2)==jug
							filapr=3;
							columnapr=2;
							if A(filapr,columnapr)==0
								fila=3;
								columna=2;
							end
						end
						if A(3,2)==jug
							filapr=1;
							columnapr=2;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
						if A(2,1)==jug
							filapr=2;
							columnapr=3;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
						if A(2,3)==jug
							filapr=2;
							columnapr=1;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
						if A(1,1)==jug
							filapr=3;
							columnapr=3;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end    
						if A(3,3)==jug
							filapr=1;
							columnapr=1;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
						if A(3,1)==jug
							filapr=1;
							columnapr=3;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
						if A(1,3)==jug
							filapr=3;
							columnapr=1;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
					end
					if A(1,1)==jug
						if A(1,2)==jug
							filapr=1;
							columnapr=3;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
                  					end
						end
						if A(1,3)==jug
							filapr=1;
							columnapr=2;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
						if A(2,1)==jug
							filapr=3;
							columnapr=1;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
						if A(3,1)==jug
							filapr=2;
							columnapr=1;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
            
					end
					if A(3,3)==jug
						if A(3,2)==jug
							filapr=3;
							columnapr=1;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end       
						if A(3,1)==jug
							filapr=3;
							columnapr=2;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
						if A(2,3)==jug
							filapr=1;
							columnapr=3;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
						if A(1,3)==jug
							filapr=2;
							columnapr=3;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
					end
					if A(1,3)==jug
						if A(1,2)==jug
							filapr=1;
							columnapr=1;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
						if A(2,3)==jug
							filapr=3;
							columnapr=3;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
					end
					if A(3,1)==jug
						if A(2,1)==jug
							filapr=1;
							columnapr=1;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
						if A(3,2)==jug
							filapr=3;
							columnapr=3;
							if A(filapr,columnapr)==0
								fila=filapr;
								columna=columnapr;
							end
						end
					end
	
					%Si existe alguna combinacin para ganar, se selecciona esa casilla 
					if fila~=0
						prueba=0;
						calcula_posicion=1;
						jug=2;
					else
						if jug==2
							jug=1;
							prueba=2;
						else
							jug=2;
							prueba=3;
						end
					end
				end
        
				%Si no encuentra nada en la prueba 2, o si se encuentra algo y la casilla est ocupada, pasa a la prueba 3
				if fila ~=0
					if A(fila,columna)~=0
						prueba=3;
						calcula_posicion=0;
					end
				end

        
       
				%En la prueba 3 busca una casilla aleatoria, y si sta est ocupada vuelve a probar
        			if prueba==3
					if fila==0
						fila=2;
						columna=2;
					end
            
					while A(fila,columna)~=0
						fila = (fix(rand(1)*2.99))+1;
						columna = (fix(rand(1)*2.99))+1;
					end
        				calcula_posicion=1;    
					prueba=4;
				end
		
    			end
		end
    
    
		%Si la casilla seleccionada por la mquina o la persona est libre, la ocupa
		if A(fila,columna)==0
			A(fila,columna)=jug;
			contador=contador+1;
    
			%Dibuja la matriz en la consola
			for i=1:3
				fprintf ('%4.0f%4.0f%4.0f\n',A(i,1),A(i,2),A(i,3))
				fprintf '\n'
			end
    
			%Comprueba si el jugador que acaba de ocupar una casilla ha ganado
   			if A(2,2)==jug
				if A(1,2)==jug
					if A(3,2)==jug
						Stop=jug;
					end
				end
				if A(2,1)==jug
					if A(2,3)==jug
						Stop=jug;
					end
				end
				if A(1,1)==jug
					if A(3,3)==jug
						Stop=jug;
					end
				end
				if A(3,1)==jug
					if A(1,3)==jug
						Stop=jug;
					end
				end
			end
			if A(1,1)==jug
				if A(1,2)==jug
					if A(1,3)==jug
						Stop=jug;
					end
				end
				if A(2,1)==jug
					if A(3,1)==jug
						Stop=jug;
					end
				end
			end
			if A(3,3)==jug
				if A(3,2)==jug
					if A(3,1)==jug
						Stop=jug;
					end
				end
				if A(2,3)==jug
					if A(1,3)==jug
						Stop=jug;
					end
				end
			end
    	
    			%Si ste ha sido el noveno movimiento, acaba la partida
			if contador==9 & Stop==0
				Stop=3;
			end
		%Si la casilla estaba ocupada, te penaliza con una prdida de turno	
		else
			fprintf '\n'
			fprintf 'Esa casilla estaba ocupada, por listo pierdes el turno \n'
			fprintf '\n'
		end
	
		%Si ha ganado alguien o la partida ha acabado muestra un mensaje
		if Stop==1
			jugando=0;
			fprintf 'Gana el jugador 1 \n'
		end
		if Stop==2
			jugando=0;
			fprintf 'Gana el jugador 2 \n'
		end
		if Stop==3 
			jugando=0;
			fprintf 'Todo el mundo pierde \n'
		end
	%Acaba el cdigo para el modo de un jugador	
	end



	%Modo de dos jugadores
	if modo==2
		%Mensaje de inicio
		if jugando==0
			fprintf ('Ha seleccionado el modo de dos jugadores. El primer turno ser del jugador 1 \n', jug);
		end
    
		jugando=1;

		%Cambio de jugadores en cada ronda
		if jug==1
			jug=2;
		else;
			jug=1;
		end
		
		%Mensajes pidiendo la introduccin de la fila y columna, se muestran en cada ronda y cada vez para un jugador
		fprintf '\n'
		fprintf ('Turno del jugador %1.0f \n', jug);
		fila=input ('Introduzca la FILA donde colocar su ficha: ');
		columna=input ('Introduzca la COLUMNA donde colocar su ficha: ');
		fprintf '\n'
    
		%Comprueba si la casilla seleccionada est ocupada, y si no la selecciona
		if A(fila,columna)==0
			A(fila,columna)=jug;
			contador=contador+1;
    
			%Muestra la matriz en consola
			for i=1:3
				fprintf ('%4.0f%4.0f%4.0f\n',A(i,1),A(i,2),A(i,3))
				fprintf '\n'
			end
    
			%Comprueba si el jugador que acaba de ocupar una casilla ha ganado
   			if A(2,2)==jug
				if A(1,2)==jug
					if A(3,2)==jug
						Stop=jug;
					end
				end
				if A(2,1)==jug
					if A(2,3)==jug
						Stop=jug;
					end
				end
				if A(1,1)==jug
					if A(3,3)==jug
						Stop=jug;
					end
				end
				if A(3,1)==jug
					if A(1,3)==jug
						Stop=jug;
					end
				end
			end
			if A(1,1)==jug
				if A(1,2)==jug
					if A(1,3)==jug
						Stop=jug;
					end
				end
				if A(2,1)==jug
					if A(3,1)==jug
						Stop=jug;
					end
				end
			end
			if A(3,3)==jug
				if A(3,2)==jug
					if A(3,1)==jug
						Stop=jug;
					end
				end
				if A(2,3)==jug
					if A(1,3)==jug
						Stop=jug;
					end
				end
			end
    
			%Si ste ha sido el noveno movimiento, acaba la partida
			if contador==9 & Stop==0
				Stop=3;
			end

           	%Si la casilla estaba ocupada, te penaliza con una prdida de turno
		else
			fprintf '\n'
			fprintf 'Esa casilla estaba ocupada, por listo pierdes el turno \n'
			fprintf '\n'
		end



		%Si ha ganado alguien o la partida ha acabado muestra un mensaje
		if Stop==1
			jugando=0;
			fprintf 'Gana el jugador 1 \n'
		end
		if Stop==2
			jugando=0;
			fprintf 'Gana el jugador 2 \n'
		end
		if Stop==3 
			jugando=0;
			fprintf 'Todo el mundo pierde \n'
		end
	%Acaba el cdigo para el modo de un jugador	
	end





end
end


Contact us