詳解matlab之簡易2048制作


詳解matlab之簡易2048制作

一):制作之前

小游戲2048出來也算很久了,基本上大家都知道,通俗易懂,玩法也很簡單,前幾天興趣來了,通過matlab小做了一下,並做成了gui界面,總的來說基本功能是實現了,還是挺有意思的。

好吧,下面來說說具體實現過程。雖然不是專業做游戲的,但是想想,做一個游戲或者編一個程序,首先得有框架,或者大體實現思路,第一步該干啥,下一步,等等等等,最后實現了。這之中先不管具體到某一步能不能實現,總的架構得有。之后才是具體到某一步,分析合理性以及解決辦法。比如像這個游戲,你就得考慮一下幾點吧:

(1)關於初始化:

初始化簡單,生成最初的數字2吧,一般是生成2個2,那么生成的位置呢?肯定是隨機的,也就是16個位置隨機挑兩個位置放2。

(2)運行時出現2的位置問題

那么在每次執行一次上下左右以后,整個游戲方格中必須出現一個新的2吧,那么這個2出現在哪里?首先得是空余的位置,然后是在這些空余位置里隨機放吧。

(3)移動方向問題

自然這個問題是這個游戲的關鍵。這個游戲每次我們得在“上下左右”四個方向上選擇一次運行吧,選擇以后,就是關於相同數值的合並問題了,比如說某一次選擇的是上這個方向,那么對於4*4的矩陣上,每一列上的四個位置我們得看看有沒有數字吧?有幾個數字?然后這幾個數字能不能合並?合並完以后再把合並完的數字移動位置(依次移動到每一列的最上面排着),移動完以后,剩下的位置得清空為0。這樣對於每一列操作一次就把“上”對應的操作做完了,那么“下左右”同理這么實現就可以了。

(4)關於數字合並

合並數字就是當碰到相同數字的時候的相加起來作為一個新的數字,原來兩個數字就不見了。有問題的一點就是某次操作時某一列或者行上的數字有幾個,要是一個就不用合並了,直接移動到這一行或者列的最當頭就是了,如果多余一個數字,再看數字能不能合並?那么怎么合並,比如有一次往右邊移動,那就是四行數字往右邊走,假設某一行是[2 2 4 0],那么變成[0 0 4 4],如果是[0 2 2 2],那么怎么合?是第2和3合,還是第3和4合?如果是往右移動,那就是3和4位置的合,往左移動,就是2和3位置的合。理解了合的順序關系那就簡單了。

(5)關於游戲怎么結束

結束的方式似乎很簡單,當4*4的位置排滿數字,且上下左右都不能合並的時候就算結束了。

(6)其他還有什么,就看着需要辦吧

二):實現過程

(1)關於空位置補充一個2

這個好弄,在運行之間把當前的4*4矩陣輸入進來,檢測一下為0的位置,然后在這些位置中挑一個位置置為2,然后返回這個矩陣就ok了,如下:

function M = add_single_2(M) index = find(M == 0);%找為0的位置 num = randperm(length(index),1);%隨機挑一個位置 M(index(num)) = 2;
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

(2)關於移動后的操作

首先移動,我們的有個方法來檢測是往哪個方向移動,比如用檢測字符“w s a d”作為上下左右吧,每次檢測到一個一以后,再對於這個移動方法,分別對每列(也可能是每行)進行數據合並,移動等等。那么每次移動后,我們得索引那些有數值的點,然后才能進行合並操作。代碼如下:

function M = move(M,way) switch way %上去 case 'w' [x,y] = find(M~=0);%索引有數字的位置點 M = up(M,x,y,1);%輸入位置點和第1列數,合並 M = up(M,x,y,2);%輸入位置點和第2列數,合並 M = up(M,x,y,3);%輸入位置點和第3列數,合並 M = up(M,x,y,4);%輸入位置點和第4列數,合並 case 's' [x,y] = find(M~=0);%索引有數字的位置點 M = down(M,x,y,1);%輸入位置點和第1列數,合並 M = down(M,x,y,2);%輸入位置點和第2列數,合並 M = down(M,x,y,3);%輸入位置點和第3列數,合並 M = down(M,x,y,4);%輸入位置點和第4列數,合並 case 'a' [x,y] = find(M~=0);%索引有數字的位置點 M = left(M,x,y,1);%輸入位置點和第1行數,合並 M = left(M,x,y,2);%輸入位置點和第2行數,合並 M = left(M,x,y,3);%輸入位置點和第3行數,合並 M = left(M,x,y,4);%輸入位置點和第4行數,合並 case 'd' [x,y] = find(M~=0);%索引有數字的位置點 M = right(M,x,y,1);%輸入位置點和第1行數,合並 M = right(M,x,y,2);%輸入位置點和第2行數,合並 M = right(M,x,y,3);%輸入位置點和第3行數,合並 M = right(M,x,y,4);%輸入位置點和第4行數,合並 otherwise warning('輸入方向鍵錯誤,方向描述:上:w 下:s 左:a 右:d'); M = M; End
  • 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
  • 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

三):關於具體某個方向的操作

現在有了矩陣M,也知道了不為0的數據點的行x與列y,以及我們要對哪一行或者那一列進行操作,下面合並就簡單了,所需要考慮的問題就是那一行或者列到底有幾個數(無非0,1,2,3,4)?這幾個數能不能合並?誰更誰合並的問題。這里比較一般的方法,我們可以把所有的可能性都列出來,進行switch選擇不就可以了,具體如下:

3.1)上操作:

function M = up(M,x,y,num) index1 = find(y==num);%找第一列的位置 switch length(index1) case 1 M(1,num) = M(x(index1),y(index1)); M(2:end,num) = 0; case 2 temp1 = M(x(index1(1)),y(index1(1))); temp2 = M(x(index1(2)),y(index1(2))); if temp1==temp2 temp = temp1 + temp2; M(1,num) = temp; M(2:end,num) = 0; else M(1,num) = temp1; M(2,num) = temp2; M(3:end,num) = 0; end case 3 temp1 = M(x(index1(1)),y(index1(1))); temp2 = M(x(index1(2)),y(index1(2))); temp3 = M(x(index1(3)),y(index1(3))); if temp1==temp2 temp = temp1 + temp2; M(1,num) = temp; M(2,num) = temp3; M(3:end,num) = 0; else if temp2==temp3 temp = temp2 + temp3; M(1,num) = temp1; M(2,num) = temp; M(3:end,num) = 0; else M(1,num) = temp1; M(2,num) = temp2; M(3,num) = temp3; M(4:end,num) = 0; end end case 4 temp1 = M(x(index1(1)),y(index1(1))); temp2 = M(x(index1(2)),y(index1(2))); temp3 = M(x(index1(3)),y(index1(3))); temp4 = M(x(index1(4)),y(index1(4))); if temp1 == temp2 if temp3 == temp4 temp = temp1 + temp2; tempp = temp3 + temp4; M(1,num) = temp; M(2,num) = tempp; M(3:end,num) = 0; else temp = temp1 + temp2; M(1,num) = temp; M(2,num) = temp3; M(3,num) = temp4; M(4:end,num) = 0; end else if temp2 == temp3 temp = temp2 + temp3; M(1,num) = temp1; M(2,num) = temp; M(3,num) = temp4; M(4:end,num) = 0; else if temp3 == temp4 temp = temp3 + temp4; M(1,num) = temp1; M(2,num) = temp2; M(3,num) = temp; M(4:end,num) = 0; else M(1:end,num) = M(1:end,num); end end end end
  • 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
  • 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

3.2):下操作:

function M = down(M,x,y,num) index1 = find(y==num);%找第一列的位置 switch length(index1) case 1 M(4,num) = M(x(index1),y(index1)); M(3:-1:1,num) = 0; case 2 temp2 = M(x(index1(1)),y(index1(1))); temp1 = M(x(index1(2)),y(index1(2))); if temp1==temp2 temp = temp1 + temp2; M(4,num) = temp; M(3:-1:1,num) = 0; else M(4,num) = temp1; M(3,num) = temp2; M(2:-1:1,num) = 0; end case 3 temp3 = M(x(index1(1)),y(index1(1))); temp2 = M(x(index1(2)),y(index1(2))); temp1 = M(x(index1(3)),y(index1(3))); if temp1==temp2 temp = temp1 + temp2; M(4,num) = temp; M(3,num) = temp3; M(2:-1:1,num) = 0; else if temp2==temp3 temp = temp2 + temp3; M(4,num) = temp1; M(3,num) = temp; M(2:-1:1,num) = 0; else M(4,num) = temp1; M(3,num) = temp2; M(2,num) = temp3; M(1:-1:1,num) = 0; end end case 4 temp4 = M(x(index1(1)),y(index1(1))); temp3 = M(x(index1(2)),y(index1(2))); temp2 = M(x(index1(3)),y(index1(3))); temp1 = M(x(index1(4)),y(index1(4))); if temp1 == temp2 if temp3 == temp4 temp = temp1 + temp2; tempp = temp3 + temp4; M(4,num) = temp; M(3,num) = tempp; M(2:-1:1,num) = 0; else temp = temp1 + temp2; M(4,num) = temp; M(3,num) = temp3; M(2,num) = temp4; M(1:-1:1,num) = 0; end else if temp2 == temp3 temp = temp2 + temp3; M(4,num) = temp1; M(3,num) = temp; M(2,num) = temp4; M(1:-1:1,num) = 0; else if temp3 == temp4 temp = temp3 + temp4; M(4,num) = temp1; M(3,num) = temp2; M(2,num) = temp; M(1:-1:1,num) = 0; else M(1:end,num) = M(1:end,num); end end end end
  • 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
  • 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

3.3)左操作:

function M = left(M,x,y,num) index1 = find(x==num);%找第一列的位置 switch length(index1) case 1 M(num,1) = M(x(index1),y(index1)); M(num,2:end) = 0; case 2 temp1 = M(x(index1(1)),y(index1(1))); temp2 = M(x(index1(2)),y(index1(2))); if temp1==temp2 temp = temp1 + temp2; M(num,1) = temp; M(num,2:end) = 0; else M(num,1) = temp1; M(num,2) = temp2; M(num,3:end) = 0; end case 3 temp1 = M(x(index1(1)),y(index1(1))); temp2 = M(x(index1(2)),y(index1(2))); temp3 = M(x(index1(3)),y(index1(3))); if temp1==temp2 temp = temp1 + temp2; M(num,1) = temp; M(num,2) = temp3; M(num,3:end) = 0; else if temp2==temp3 temp = temp2 + temp3; M(num,1) = temp1; M(num,2) = temp; M(num,3:end) = 0; else M(num,1) = temp1; M(num,2) = temp2; M(num,3) = temp3; M(num,4:end) = 0; end end case 4 temp1 = M(x(index1(1)),y(index1(1))); temp2 = M(x(index1(2)),y(index1(2))); temp3 = M(x(index1(3)),y(index1(3))); temp4 = M(x(index1(4)),y(index1(4))); if temp1 == temp2 if temp3 == temp4 temp = temp1 + temp2; tempp = temp3 + temp4; M(num,1) = temp; M(num,2) = tempp; M(num,3:end) = 0; else temp = temp1 + temp2; M(num,1) = temp; M(num,2) = temp3; M(num,3) = temp4; M(num,4:end) = 0; end else if temp2 == temp3 temp = temp2 + temp3; M(num,1) = temp1; M(num,2) = temp; M(num,3) = temp4; M(num,4:end) = 0; else if temp3 == temp4 temp = temp3 + temp4; M(num,1) = temp1; M(num,2) = temp2; M(num,3) = temp; M(num,4:end) = 0; else M(num,1:end) = M(num,1:end); end end end end 
  • 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
  • 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

3.4)右操作:

function M = right(M,x,y,num) index1 = find(x==num);%找第一列的位置 switch length(index1) case 1 M(num,4) = M(x(index1),y(index1)); M(num,3:-1:1) = 0; case 2 temp2 = M(x(index1(1)),y(index1(1))); temp1 = M(x(index1(2)),y(index1(2))); if temp1==temp2 temp = temp1 + temp2; M(num,4) = temp; M(num,3:-1:1) = 0; else M(num,4) = temp1; M(num,3) = temp2; M(num,2:-1:1) = 0; end case 3 temp3 = M(x(index1(1)),y(index1(1))); temp2 = M(x(index1(2)),y(index1(2))); temp1 = M(x(index1(3)),y(index1(3))); if temp1==temp2 temp = temp1 + temp2; M(num,4) = temp; M(num,3) = temp3; M(num,2:-1:1) = 0; else if temp2==temp3 temp = temp2 + temp3; M(num,4) = temp1; M(num,3) = temp; M(num,2:-1:1) = 0; else M(num,4) = temp1; M(num,3) = temp2; M(num,2) = temp3; M(num,1:-1:1) = 0; end end case 4 temp4 = M(x(index1(1)),y(index1(1))); temp3 = M(x(index1(2)),y(index1(2))); temp2 = M(x(index1(3)),y(index1(3))); temp1 = M(x(index1(4)),y(index1(4))); if temp1 == temp2 if temp3 == temp4 temp = temp1 + temp2; tempp = temp3 + temp4; M(num,4) = temp; M(num,3) = tempp; M(num,2:-1:1) = 0; else temp = temp1 + temp2; M(num,4) = temp; M(num,3) = temp3; M(num,2) = temp4; M(num,1:-1:1) = 0; end else if temp2 == temp3 temp = temp2 + temp3; M(num,4) = temp1; M(num,3) = temp; M(num,2) = temp4; M(num,1:-1:1) = 0; else if temp3 == temp4 temp = temp3 + temp4; M(num,4) = temp1; M(num,3) = temp2; M(num,2) = temp; M(num,1:-1:1) = 0; else M(num,1:end) = M(num,1:end); end end end end
  • 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
  • 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

四):命令窗口模擬顯示

為了測試這種方式的好壞,我們先在命令窗口模擬現實一下,而后再轉到GUI上。編寫主函數如下(這個里面並不包含結束條件):

clc
clear
% 初始化M矩陣 M = zeros(4,4); num = randperm(16,2); M(num) = 2; M while nnz(M)~=16 % M中不為0的個數 way = input('輸入選擇方向:','s'); M1 = move(M,way); if sum(sum(abs(M-M1))) ~= 0 %如果前后有變化,才添加2 M1 = add_single_2(M1); end M = M1; M end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

這樣運行主函數(前幾步):

M = 0 0 2 0 0 2 0 0 0 0 0 0 0 0 0 0 輸入選擇方向:a M = 2 0 0 0 2 2 0 0 0 0 0 0 0 0 0 0 輸入選擇方向:w M = 4 2 0 2 0 0 0 0 0 0 0 0 0 0 0 0 輸入選擇方向:a M = 4 4 0 0 0 2 0 0 0 0 0 0 0 0 0 0 輸入選擇方向:d M = 0 0 0 8 0 0 0 2 0 0 0 0 0 2 0 0 輸入選擇方向:
  • 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
  • 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

總的來看還是可以,運行正確。

五):關於matlab的GUI實現

為了使得游戲更具有可玩性,考慮做出GUI界面,這樣更貼近與游戲。
Matlab制作GUI還是比較容易,它自帶一個GUI生產器,關於界面的布局什么的都可以自己產生,不需要程序來實現,需要的僅僅是當你按下某個按鈕以后所觸發的事件函數。
Matlab打開GUI的方式,直接新建一個圖形用戶見面就可以打開了。具體使用就不說了,像很多各種控件,輸入框等等都可以隨便使用,拖入到一個新建的GUI下就可以。做個簡單的畫面如下所示:
這里寫圖片描述

左邊那個框都是各類可用的控件。
之后就是編寫事件觸發函數,而這些函數都是可以用到我們前面編寫的那些函數的。
這里需要幾個呢?無非“開始”,“上下左右”這五個觸發函數,剩下的是顯示區域,只需要在運行時set一下對應的某個框中的值就可以了,當然每個控件都有一些其他的屬性的,比如字體大小,控件名稱等等,這些都需要調調才好用。
編輯函數,點上面的那個函數編輯就可以,直接進入這個GUI對應的函數代碼了。這里只給出部分觸發函數的代碼如下:
比如“開始”控件回調函數:

function start_Callback(hObject, eventdata, handles)
% 初始化M矩陣  
global M
global step_num
step_num = 0;
M = zeros(4,4);
num = randperm(16,2);
M(num) = 2;

index = find(M~=0);
M1 = cell(1,16);
for i = 1:length(index)
    M1{index(i)} = M(index(i));
end set(handles.up,'enable','on'); set(handles.down,'enable','on'); set(handles.left,'enable','on'); set(handles.right,'enable','on'); set(handles.w1,'String',num2str(M1{1})); set(handles.w2,'String',num2str(M1{2})); set(handles.w3,'String',num2str(M1{3})); set(handles.w4,'String',num2str(M1{4})); set(handles.w5,'String',num2str(M1{5})); set(handles.w6,'String',num2str(M1{6})); set(handles.w7,'String',num2str(M1{7})); set(handles.w8,'String',num2str(M1{8})); set(handles.w9,'String',num2str(M1{9})); set(handles.w10,'String',num2str(M1{10})); set(handles.w11,'String',num2str(M1{11})); set(handles.w12,'String',num2str(M1{12})); set(handles.w13,'String',num2str(M1{13})); set(handles.w14,'String',num2str(M1{14})); set(handles.w15,'String',num2str(M1{15})); set(handles.w16,'String',num2str(M1{16})); set(handles.step,'String',num2str(step_num));
  • 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
  • 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

再比如“上”按鈕回調函數:

function up_Callback(hObject, eventdata, handles)
global M
global step_num
if nnz(M)~=17 % M中不為0的個數
    temp = 1;
    MM1 = move(M,'w');
    if sum(sum(abs(M-MM1))) ~= 0   %如果前后有變化,才添加2
        MM1 = add_single_2(MM1);
        step_num = step_num+1;
        temp = 0;
    end M = MM1; index = find(M~=0); M1 = cell(1,16); for i = 1:length(index) M1{index(i)} = M(index(i)); end set(handles.w1,'String',num2str(M1{1})); set(handles.w2,'String',num2str(M1{2})); set(handles.w3,'String',num2str(M1{3})); set(handles.w4,'String',num2str(M1{4})); set(handles.w5,'String',num2str(M1{5})); set(handles.w6,'String',num2str(M1{6})); set(handles.w7,'String',num2str(M1{7})); set(handles.w8,'String',num2str(M1{8})); set(handles.w9,'String',num2str(M1{9})); set(handles.w10,'String',num2str(M1{10})); set(handles.w11,'String',num2str(M1{11})); set(handles.w12,'String',num2str(M1{12})); set(handles.w13,'String',num2str(M1{13})); set(handles.w14,'String',num2str(M1{14})); set(handles.w15,'String',num2str(M1{15})); set(handles.w16,'String',num2str(M1{16})); set(handles.step,'String',num2str(step_num)); end if nnz(M)==16 && temp M1 = cell(1,16); for i = 1:16 M1{i} = 'over'; end set(handles.w1,'String',(M1{1})); set(handles.w2,'String',(M1{2})); set(handles.w3,'String',(M1{3})); set(handles.w4,'String',(M1{4})); set(handles.w5,'String',(M1{5})); set(handles.w6,'String',(M1{6})); set(handles.w7,'String',(M1{7})); set(handles.w8,'String',(M1{8})); set(handles.w9,'String',(M1{9})); set(handles.w10,'String',(M1{10})); set(handles.w11,'String',(M1{11})); set(handles.w12,'String',(M1{12})); set(handles.w13,'String',(M1{13})); set(handles.w14,'String',(M1{14})); set(handles.w15,'String',(M1{15})); set(handles.w16,'String',(M1{16})); set(handles.up,'enable','off'); set(handles.down,'enable','off'); set(handles.left,'enable','off'); set(handles.right,'enable','off'); end
  • 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
  • 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

完整代碼就不貼了,太多,后面有下載地址,可以下載着去試試。

設計完成后就可以點擊運行開玩了,如下:
這里寫圖片描述
這里寫圖片描述

當然了,你還可以加需求多其他的控件什么的,並且玩的過程中會發現,網絡上的游戲,合並的過程慢悠悠的,我們這個飛快,也就是說缺少個動畫過程,當然是簡陋,不過還是可以玩的。

完整代碼下載地址:(http://download.csdn.net/detail/on2way/8686483)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM