Matlab - Programa matlab: duda matrices

 
Vista:
Imágen de perfil de Hermes

Programa matlab: duda matrices

Publicado por Hermes (8 intervenciones) el 10/12/2013 16:08:50
Buenas,
estoy haciendo un programa sobre una especie de juego que basa en:
-Recibes un numero aleatorio (del 0-9)
-Escoges en que columna deseas depositarlo (de la 1-6, los numeros se depositan como si fueran fichas uno encima de otro).

El objetivo es que los numero depositados sumen 20, tanto en vertical o en horizontal; el programa convierte esos números que suman 20 en ceros.

Al terminar el juego se suman todos los números del tablero, el objetivo es conseguir la menor puntuación posible.

La pregunta es:
¿como le indico al programa que cuando sumen 20 se conviertan en ceros?

PROGRAMA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
function suma ()
opciones=2;
cont(6)=0;
while (opciones~=1)
    disp('0-Salir');
    disp('1-Jugar');
    opciones=input('Selecciona: ');
while ((opciones<0 || opciones>1) || rem(opciones,1)~=0)
    disp('0-Salir');
    disp('1-Jugar');
    opciones=input('ERROR. Selecciona 0 o 1: ');
end
clc;
 
  tabla0 = zeros (6,6);
  tabla = 0;
  fila=6;
 
for (jugada=1:36)
 
        numero=round(rand(1,1)*9)
        columna=input('¿En que columna quieres colocar este número? ');
 
        while (columna>6 || columna<1)
        columna=input('ERROR. Escoge una columna del 1 al 6: ');
        end
 
        v=tabla0+tabla;
        i=v(fila,columna);
        cont(columna)=cont(columna)+1;
        fila=7-cont(columna);
 
 
 
          while (cont(columna)>6 & columna==columna)
               disp('ERROR. Esta columna esta completa.');
               columna=input('Escoja otra columna: ');
               cont(columna)=cont(columna)+1;
               fila=7-cont(columna);
          end
 
        clc;
        v(fila,columna)=numero;
        tabla = tabla0 + v
        fprintf ('\n  |  a  |  b  |  c  |  d  |  e  |  f  |');
 
 
                  end
                 end
 
end
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Programa matlab: duda matrices

Publicado por ger (24 intervenciones) el 11/12/2013 11:43:14
Hola Hermes, lo miré medio rápido... se me ocurre algo así...

%Sponete que vos tenés el vector columna lleno de nros aleatorios, yo los
%pongo en reales, total vos ya los tenes bien. Uso 10 filas porque en el
%peor de los casos van a salir todos 1.

vector = zeros(1,10);
for i = 1:10
nro = rand(1,1);
vector(i) = nro;
end;
%suman todo el contenido del vector
sum = 0; %contador
for i = 1:10
sum = sum + vector(i);
end;
%te preguntas
if sum>=20
for i = 1:10
vector(i) = 0;
end;
end;

ajustalo a tus necesidades, por ahí te conviene meter estas líneas en una pequeña función y cada vez que el usuario coloca un número, invocar a esta función para que se fije si suman 20 o no?
Bueno, espero que te ayude algo...
Saludos.-
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Hermes

Programa matlab: duda matrices

Publicado por Hermes (8 intervenciones) el 11/12/2013 16:46:01
Gracias, al final he resuelto el problema creando un vector fila (x) y otro vector columna (y), y condicionado la suma de sus elementos.

Adjunto el programa por si le puede ayudar a alguien:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
function suma ()
clc;
opciones=2;
columna=6;
fila=6;
cont(columna)=0;
tabla = zeros (6,6);
partidas=0;
a=1;
b=2;
c=3;
d=4;
e=5;
f=6;
 
while (opciones)
    fprintf('\n 0-Salir');
    fprintf('\n 1-Jugar \n');
    opciones=input('Selecciona: ');
while (opciones<0 || opciones>1)
    clc;
    fprintf('\n 0-Salir');
    fprintf('\n 1-Jugar \n');
    opciones=input('ERROR. Selecciona 0 o 1: ');
end
 clc;
if (opciones==1)
for (rounds=1:36)
 
       numero = round(rand(1,1)*9);
       fprintf('\n %', tabla);
       fprintf('\n\n %i <<-- ', numero);
       columna=input('¿En que columna quieres colocar este número? ');
 
        while (columna>6 || columna<1)
        columna=input('ERROR. Escoge una columna (a, b, c, d, e, f):  ');
        end
 
 
 
 
 
 
          while (cont(columna)>5 & columna==columna  )
               disp('ERROR. Esta columna esta completa.');
               columna=input('Escoja otra columna: ');
          end
 
        fila=fila-cont(columna);
        cont(columna)=cont(columna)+1;
        tabla(fila,columna)=numero;
 
        y=tabla(:,columna)
        x=tabla(fila,:)
 
    if (sum(x)==20)
    tabla(fila,:)=0
    end
 
    if (sum(y)==20)
    tabla(:,columna)=0
    end
 
    if ((sum(x)+sum(y))==20)
    tabla(fila,:)=0
    tabla(:,columna)=0
    end
 
clc;
[f c]=size (tabla);
for (fila=1:f)
  fprintf ('\n  |', fila);
  for (columna= 1:c)
 
     if (tabla(fila,columna) == 0)
        fprintf ('    |');
      elseif (tabla(fila,columna)>0)
        fprintf (' %2i |', tabla(fila,columna));
      else
        fprintf ('  * |');
      end
  end
end
  fprintf('\n  -------------------------------');
  fprintf ('\n  |  a |  b |  c |  d |  e |  f |');
 
end
clc;
puntuacion = sum(sum(tabla));
fprintf(' Fin de la partida. Puntuación = %i \n\n', puntuacion );
end
 
partidas=partidas+1;
puntuacion(partidas)=puntuacion;
 
 
 
 
if(opciones==0)
plot(1:partidas, puntuacion(partidas),'-.k', 'linewidth',1)
xlabel('Partida');
ylabel('Puntiación');
 
fprintf('\n -------------------------');
fprintf('\n | Partidas jugadas = %i', partidas);
fprintf('\n -------------------------');
fprintf('\n |Puntuación máxima = %i', puntmax);
fprintf('\n -------------------------');
fprintf('\n |Puntuación mínima = %i', puntmin);
fprintf('\n -------------------------');
fprintf('\n | Puntuación media = %i', puntmed);
fprintf('\n -------------------------');
end
end
end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Hermes

Programa matlab: duda matrices

Publicado por Hermes (8 intervenciones) el 12/12/2013 15:10:54
Desde luego que me ha ayudado, gracias.
he creado una función suma que hace lo propuesto, el problema es que cuando suman 20 no me substituye esos valores en la matriz:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
function Juegosuma20 ()
clc;
opciones=3;
fila=6;
partidas=0;
puntuacion=0;
a=1;
b=2;
c=3;
d=4;
e=5;
f=6;
 
while (opciones>1)
 
    fprintf('\n 1-Salir');
    fprintf('\n 2-Jugar \n');
    opciones=dame('Seleccione opción: ',2,1);
 
if (opciones==2)
cont=[0 0 0 0 0 0];
tabla=zeros(6,6)-ones(6,6);
for (rounds=1:36)
 
       numero = round(rand(1,1)*9);
       fprintf('\n %', tabla);
       fprintf('\n\n %i <== ', numero);
       columna=dame('¿En que columna quieres colocar este número? ', 6, 1);
 
 
        while (cont(columna)>5 & columna==columna)
               disp('ERROR. Esta columna esta completa.');
               columna=dame('Escoja otra columna: ',6 ,1);
        end
 
        fila=fila-cont(columna);
        cont(columna)=cont(columna)+1;
        tabla(fila,columna)=numero;
clc;
x=tabla(fila,:);
y=tabla(:,columna);
suma20(x)
suma20(y)
 
[f c]=size (tabla);
for (fila=1:f)
  fprintf ('\n  |', fila);
  for (columna= 1:c)
 
     if (tabla(fila,columna) == -1)
        fprintf ('    |');
      elseif (tabla(fila,columna)>=0)
        fprintf (' %2i |', tabla(fila,columna));
 
      end
  end
end
  fprintf('\n  -------------------------------');
  fprintf ('\n  |  a |  b |  c |  d |  e |  f |');
 
end
clc;
partidas=partidas+1;
puntuacion=sum(sum(tabla));
mempuntuacion(partidas)=puntuacion;
 
fprintf(' Fin de la partida. Puntuación = %i \n\n', puntuacion );
 
 
end
 
end
 
if(opciones==1 && puntuacion>0)
puntmax=max(mempuntuacion(partidas));
puntmin=min(mempuntuacion(partidas));
puntmed=mean(mempuntuacion(partidas));
 
fprintf('\n --------------------');
fprintf('\n |Partidas jugadas  |==> %i ', partidas);
fprintf('\n --------------------');
fprintf('\n |Puntuación máxima |==> %i ', puntmax);
fprintf('\n --------------------');
fprintf('\n |Puntuación mínima |==> %i ', puntmin);
fprintf('\n --------------------');
fprintf('\n |Puntuación media  |==> %i ', puntmed);
fprintf('\n -------------------- \n');
 
plot(1:length(mempuntuacion), mempuntuacion,'-.k')
xlabel('Partida');
ylabel('Puntiación');
title('Estadística')
end
 
end
 
function valor = dame(txt, max, min)
 
      valor=input(txt);
      erroneo=false;
      if (isempty(valor))
          erroneo=true;
      elseif(valor<0 || valor>max || valor<min)
          erroneo=true;
      elseif (valor/floor(valor)~=1)
          erroneo=true;
      end
      while  (erroneo)
        disp('¡ERROR! La opción introducida no es valida.');
        valor=input(txt);
        erroneo=false;
        if (isempty(valor))
          erroneo=true;
        elseif(valor<0 || valor>max ||valor<min)
          erroneo=true;
      elseif (valor/floor(valor)~=1)
          erroneo=true;
        end
      end
end
 
function suma20 (vector)
sum = 0; %contador
negativos=find(vector<0)%convierte los -1 en 0
vector(negativos)=0
for (i=1:6)
sum = sum + vector(i)%suma i veces los i elementos del vector
end
if (sum==20)
for (i = 1:6) %le da el valor 0 a todos los elementos del vector
vector(i) = 0
end
end
end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Hermes

Programa matlab: duda matrices

Publicado por Hermes (8 intervenciones) el 12/12/2013 15:11:48
copio el programa entero, que se copio un trozo solo:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
function Juegosuma20 ()
clc;
opciones=3;
fila=6;
partidas=0;
puntuacion=0;
a=1;
b=2;
c=3;
d=4;
e=5;
f=6;
 
while (opciones>1)
 
    fprintf('\n 1-Salir');
    fprintf('\n 2-Jugar \n');
    opciones=dame('Seleccione opción: ',2,1);
 
if (opciones==2)
cont=[0 0 0 0 0 0];
tabla=zeros(6,6)-ones(6,6);
for (rounds=1:36)
 
       numero = round(rand(1,1)*9);
       fprintf('\n %', tabla);
       fprintf('\n\n %i <== ', numero);
       columna=dame('¿En que columna quieres colocar este número? ', 6, 1);
 
 
        while (cont(columna)>5 & columna==columna)
               disp('ERROR. Esta columna esta completa.');
               columna=dame('Escoja otra columna: ',6 ,1);
        end
 
        fila=fila-cont(columna);
        cont(columna)=cont(columna)+1;
        tabla(fila,columna)=numero;
clc;
x=tabla(fila,:);
y=tabla(:,columna);
suma20(x)
suma20(y)
 
[f c]=size (tabla);
for (fila=1:f)
  fprintf ('\n  |', fila);
  for (columna= 1:c)
 
     if (tabla(fila,columna) == -1)
        fprintf ('    |');
      elseif (tabla(fila,columna)>=0)
        fprintf (' %2i |', tabla(fila,columna));
 
      end
  end
end
  fprintf('\n  -------------------------------');
  fprintf ('\n  |  a |  b |  c |  d |  e |  f |');
 
end
clc;
partidas=partidas+1;
puntuacion=sum(sum(tabla));
mempuntuacion(partidas)=puntuacion;
 
fprintf(' Fin de la partida. Puntuación = %i \n\n', puntuacion );
 
 
end
 
end
 
if(opciones==1 && puntuacion>0)
puntmax=max(mempuntuacion(partidas));
puntmin=min(mempuntuacion(partidas));
puntmed=mean(mempuntuacion(partidas));
 
fprintf('\n --------------------');
fprintf('\n |Partidas jugadas  |==> %i ', partidas);
fprintf('\n --------------------');
fprintf('\n |Puntuación máxima |==> %i ', puntmax);
fprintf('\n --------------------');
fprintf('\n |Puntuación mínima |==> %i ', puntmin);
fprintf('\n --------------------');
fprintf('\n |Puntuación media  |==> %i ', puntmed);
fprintf('\n -------------------- \n');
 
plot(1:length(mempuntuacion), mempuntuacion,'-.k')
xlabel('Partida');
ylabel('Puntiación');
title('Estadística')
end
 
end
 
function valor = dame(txt, max, min)
 
      valor=input(txt);
      erroneo=false;
      if (isempty(valor))
          erroneo=true;
      elseif(valor<0 || valor>max || valor<min)
          erroneo=true;
      elseif (valor/floor(valor)~=1)
          erroneo=true;
      end
      while  (erroneo)
        disp('¡ERROR! La opción introducida no es valida.');
        valor=input(txt);
        erroneo=false;
        if (isempty(valor))
          erroneo=true;
        elseif(valor<0 || valor>max ||valor<min)
          erroneo=true;
      elseif (valor/floor(valor)~=1)
          erroneo=true;
        end
      end
end
 
function suma20 (vector)
sum = 0; %contador
negativos=find(vector<0)%convierte los -1 en 0
vector(negativos)=0
for (i=1:6)
sum = sum + vector(i)%suma i veces los i elementos del vector
end
if (sum==20)
for (i = 1:6) %le da el valor 0 a todos los elementos del vector
vector(i) = 0
end
end
end
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar