IT ØVING 11
Posted: 24/11-2011 23:11
Ny uke, ny øving. Har selvfølgelig nok øvinger så dette er bare for moroskyld.
http://itgk.idi.ntnu.no/oving/oving11-matlab.pdf
Kunne noen se raskt over det jeg har gjort? Litt usikker på om jeg gjør ting på en unødvendig komplisert måte. For eksempel g).
Er det mulig å løse denne oppgaven for en NXN matrise? Prøvde meg litt på det, men et par avoppgavene var virkelig vanskelig
---------------------
Oppgave 3 - Spillprogrammering
I denne oppgaven skal du programmere funksjoner til "15-spillet". Spillet består av et brett med 4x4 ruter med 15 brikker med tallene 1 til 15. En rute er tom, og den kan brukes til å bytte om på brikkene innbyrdes for å endre på rekkefølgen. Spillet starter ved at brikkene står i tilfeldig rekkefølge. Målet med spillet er å få brikkene i riktig rekkefølge fra 1 til 15 med den siste ruten lik null.
Spillebrettet skal i koden representeres som en 4x4- tabell.
a) (5 %) Skriv funksjonen number_in_list som tar inn et tall, number, og en liste (endimensjonal tabell) med tall, list. Hvis tallet number finnes i listen skal funksjonen returnere true, ellers false.
b) (5 %) Skriv funksjonen random_list som tar inn et tall, number, og returnerer en liste (endimensjonal tabell) med tallene fra og med 1 til og med tallet number i tilfeldig rekkefølge.
c) (5 %) Skriv funksjonen new_level som tar inn en liste (endimensjonal tabell), list, bestående av 15 tall i tilfeldig rekkefølge.
Funksjonen skal returnere en 4x4-tabell der tallene i listen
er satt inn fortløpende, radvis, fra rad 1, kolonne 1, til rad 4, kolonne 3. Elementet med indeks 4,4 skal ha verdien 0.
Litt merkelig å breake? Fant ikke noen enklere måte... Dobble for løkker og, ish!
d)
e) (5 %) Skriv funksjonen find_empty som tar inn et spillebrett, level, og
returnerer posisjonen (rad, kolonne) til den tomme ruten (med verdi 0).
Kode på en linje, OH YEAH. Men folk på verdsveven sier at find er treg og ikke burde brukes. Finnes det noe bedre måte å gjøre det ovenfor på? Jada dobble for løkker...
Dispen på slutten er vel strengt talt unødvendig, jaja.
f) (10 %) Skriv funksjonen move_tile som tar inn et spillebrett, level, og en tekststreng, direction, som angir retning der ''l'' er venstre (left), ''r'' er høyre (right), ''d'' er ned (down), og ''u'' er opp (up).
Funksjonen skal returnere et spillebrett der ruten med tallet 0 har byttet plass med tallet som befinner seg i naboruten i angitt retning hvis et slikt bytte er mulig. Hvis byttet ikke er mulig skal funksjonen returnere et uendret spillebrett.
Merk at funksjonen skal være generell og fungere uansett hvor ruten med tallet 0 er plassert i tabellen. Bruk funksjonen find_empty fra
oppgave d) i løsningen av denne oppgaven.
TUNGVINDT, (dog den fungerer)
g) (5 %) Skriv funksjonen correct_place som tar inn et spillebrett, level, og returnerer antall tall som
er riktig plassert på spillebrettet.
Jeg liker koder som bare er på en linje, dog denne ble tungvindt selv om den bare er en linje. Noe bedre? ^^
h) (5 %) Skriv funksjonen level_to_text som tar inn et spillebrett, level, og skriver ut spillebrettet
Her her min
Denne var vanskelig å generalisere for større versjoner. For eksempel 5*5 eller 6*6
i) (10 %) Lag koden for å utføre følgende i et Matlab-skript:
1 Lag et spillebrett med tallene 1 til 15 i tilfeldig rekkefølge. Vi ønsker at spillebrettet skal ha
minst 10 tall på riktig sted, så skriptet må lage nye brett helt til et slikt spillebrett er funnet.
2 Skriv ut spillebrettet med minst 10 riktig plasserte tall på skjermen ved hjelp av funksjonen
level_to_text.
Problemet er at denne koden her, vil kjøre uendelig lenge. Er omtrent umulig å finne en matrise med 5 riktige plasser. Skrev derfor koden under. Som er bedre, men kan den forbedres. Kan denne oppgaven bli løst på en bedre mer effektiv måte?
---------------------------------------
http://itgk.idi.ntnu.no/oving/oving11-matlab.pdf
Kunne noen se raskt over det jeg har gjort? Litt usikker på om jeg gjør ting på en unødvendig komplisert måte. For eksempel g).
Er det mulig å løse denne oppgaven for en NXN matrise? Prøvde meg litt på det, men et par avoppgavene var virkelig vanskelig
---------------------
Oppgave 3 - Spillprogrammering
I denne oppgaven skal du programmere funksjoner til "15-spillet". Spillet består av et brett med 4x4 ruter med 15 brikker med tallene 1 til 15. En rute er tom, og den kan brukes til å bytte om på brikkene innbyrdes for å endre på rekkefølgen. Spillet starter ved at brikkene står i tilfeldig rekkefølge. Målet med spillet er å få brikkene i riktig rekkefølge fra 1 til 15 med den siste ruten lik null.
Spillebrettet skal i koden representeres som en 4x4- tabell.
a) (5 %) Skriv funksjonen number_in_list som tar inn et tall, number, og en liste (endimensjonal tabell) med tall, list. Hvis tallet number finnes i listen skal funksjonen returnere true, ellers false.
Code: Select all
function UT = number_in_list( number , liste )
UT = any(number==liste);
end
b) (5 %) Skriv funksjonen random_list som tar inn et tall, number, og returnerer en liste (endimensjonal tabell) med tallene fra og med 1 til og med tallet number i tilfeldig rekkefølge.
Code: Select all
function UT = random_list( number )
liste = zeros(1,number)
a = 1;
while a - 1 < number
b = randi(number,1);
if number_in_list(b,liste)==0
liste(a)=b;
a = a + 1;
end
end
UT = liste;
end
c) (5 %) Skriv funksjonen new_level som tar inn en liste (endimensjonal tabell), list, bestående av 15 tall i tilfeldig rekkefølge.
Funksjonen skal returnere en 4x4-tabell der tallene i listen
er satt inn fortløpende, radvis, fra rad 1, kolonne 1, til rad 4, kolonne 3. Elementet med indeks 4,4 skal ha verdien 0.
Code: Select all
function UT = new_level( liste )
if numel(liste) ~= 15
return
end
matrise = zeros(4,4);
a = 0;
for y = 1:4
for x = 1:4
a = a + 1;
matrise(y,x)=liste(a);
if a==15
break
end
end
end
d)
e) (5 %) Skriv funksjonen find_empty som tar inn et spillebrett, level, og
returnerer posisjonen (rad, kolonne) til den tomme ruten (med verdi 0).
Code: Select all
function [a , b] = find_empty( liste )
[a,b] = find(liste==0);
end
Code: Select all
function [a , b] = find_empty2( liste )
for y=1:4
for x=1:4
if liste(y,x)==0
a = y;
b = x;
return
end
end
end
a = disp('ERROR');
b = disp('ERROR');
end
f) (10 %) Skriv funksjonen move_tile som tar inn et spillebrett, level, og en tekststreng, direction, som angir retning der ''l'' er venstre (left), ''r'' er høyre (right), ''d'' er ned (down), og ''u'' er opp (up).
Funksjonen skal returnere et spillebrett der ruten med tallet 0 har byttet plass med tallet som befinner seg i naboruten i angitt retning hvis et slikt bytte er mulig. Hvis byttet ikke er mulig skal funksjonen returnere et uendret spillebrett.
Merk at funksjonen skal være generell og fungere uansett hvor ruten med tallet 0 er plassert i tabellen. Bruk funksjonen find_empty fra
oppgave d) i løsningen av denne oppgaven.
Code: Select all
function UT = move_tile(b,matrise)
[y ,x] = find_empty(matrise);
matrise2 = matrise;
switch(b)
case 'u'
if y == 1
UT = matrise;
return
end
a = y - 1;
matrise2(a,x)=matrise(y,x);
matrise2(y,x)=matrise(a,x);
UT = matrise2;
return
case 'd'
if y == 4
UT = matrise;
return
end
a = y + 1;
matrise2(a,x)=matrise(y,x);
matrise2(y,x)=matrise(a,x);
UT = matrise2;
return
case 'l'
if x == 1
UT = matrise;
return
end
a = x - 1;
matrise2(y,a)=matrise(y,x);
matrise2(y,x)=matrise(y,a);
UT = matrise2;
return
case 'r'
if x == 4
UT = matrise;
return
end
a = x + 1;
matrise2(y,a)=matrise(y,x);
matrise2(y,x)=matrise(y,a);
UT = matrise2;
return
otherwise
return
end
end
g) (5 %) Skriv funksjonen correct_place som tar inn et spillebrett, level, og returnerer antall tall som
er riktig plassert på spillebrettet.
Code: Select all
function UT = Correct_place( matrise )
UT = sum(sum( new_level(sort(random_list(length(matrise(:))-1))) == matrise ));
end
h) (5 %) Skriv funksjonen level_to_text som tar inn et spillebrett, level, og skriver ut spillebrettet
Code: Select all
+----+----+----+----+
| 14 | 9 | 7 | 8 |
+----+----+----+----+
| 1 | 10 | 5 | 4 |
+----+----+----+----+
| 2 | 11 | 13 | 3 |
+----+----+----+----+
| 12 | 15 | 6 | 0 |
+----+----+----+----+
Code: Select all
function level_to_text( matrise )
fprintf('+ ---- + ---- + ---- + ---- +\n')
for i = 1:4
fprintf('| %2d | %2d | %2d | %2d |\n',matrise(i,1),matrise(i,2),matrise(i,3),matrise(i,4))
fprintf('+ ---- + ---- + ---- + ---- +\n')
end
end
i) (10 %) Lag koden for å utføre følgende i et Matlab-skript:
1 Lag et spillebrett med tallene 1 til 15 i tilfeldig rekkefølge. Vi ønsker at spillebrettet skal ha
minst 10 tall på riktig sted, så skriptet må lage nye brett helt til et slikt spillebrett er funnet.
2 Skriv ut spillebrettet med minst 10 riktig plasserte tall på skjermen ved hjelp av funksjonen
level_to_text.
Code: Select all
a = 0;
p = 0;
while a<10
k = new_level(random_list(15));
a = Correct_place( k )
end
level_to_text(h)
Code: Select all
a = 0;
p = 0;
i = 0;
while a<10 & p<100000
k = new_level(random_list(15));
a = Correct_place( k );
p = p + 1;
if a>i
h = k;
end
i = a;
end
level_to_text(h)