這段時間google上有個小游戲挺火的,我也很喜歡,業余時間做個C語言版的。
老規矩先上干貨: http://files.cnblogs.com/GhostZCH/2048.rar (.c & .exe)
最近在忙畢業設計, 寫的不是很好,可能還有不少bug,待優化的地方也不少。還望各位大俠多多指正,不吝賜教。
方向鍵控制,r鍵重啟,esc退出。
界面截圖如下:
以向上移動為例說明移動命令的處理:
首先現有一個將格子的數字移動一步的函數:
1
//
********************************************
2 // Method : MoveOneStep
3 // Description : 嘗試從(i1,j1)移動到(i2,j2),返回移動結果,更新uData
4 // ********************************************
5 BOOL MoveOneStep( int i1, int j1, int i2, int j2, UINT32* uData)
6 {
7 UINT32 uNextData = GetByPosition( i2, j2 );
8
9 if( 0 == uNextData )
10 {
11 SetAddMatByPosition( i2, j2, GetAddMatByPosition( i1, j1 ) );
12 SetAddMatByPosition( i1, j1, FALSE );
13
14 SetByPosition( i1, j1, 0 );
15 SetByPosition( i2, j2, (*uData) );
16
17 return TRUE;
18 }
19
20 if ( FALSE == GetAddMatByPosition( i1, j1 ) &&
21 FALSE == GetAddMatByPosition( i2, j2 ) &&
22 (*uData) == uNextData )
23 {
24 (*uData) *= 2;
25
26 SetByPosition( i1, j1, 0 );
27 SetByPosition( i2, j2, (*uData) );
28
29 SetAddMatByPosition( i2, j2, TRUE );
30
31 return TRUE;
32 }
33
34 return FALSE;
35 }
2 // Method : MoveOneStep
3 // Description : 嘗試從(i1,j1)移動到(i2,j2),返回移動結果,更新uData
4 // ********************************************
5 BOOL MoveOneStep( int i1, int j1, int i2, int j2, UINT32* uData)
6 {
7 UINT32 uNextData = GetByPosition( i2, j2 );
8
9 if( 0 == uNextData )
10 {
11 SetAddMatByPosition( i2, j2, GetAddMatByPosition( i1, j1 ) );
12 SetAddMatByPosition( i1, j1, FALSE );
13
14 SetByPosition( i1, j1, 0 );
15 SetByPosition( i2, j2, (*uData) );
16
17 return TRUE;
18 }
19
20 if ( FALSE == GetAddMatByPosition( i1, j1 ) &&
21 FALSE == GetAddMatByPosition( i2, j2 ) &&
22 (*uData) == uNextData )
23 {
24 (*uData) *= 2;
25
26 SetByPosition( i1, j1, 0 );
27 SetByPosition( i2, j2, (*uData) );
28
29 SetAddMatByPosition( i2, j2, TRUE );
30
31 return TRUE;
32 }
33
34 return FALSE;
35 }
然后在這個函數中調用上面的函數,每次移動一塊到不能移動為止
2
//
********************************************
3 // Method : MoveOneUp
4 // Description : 向上移動一塊
5 // ********************************************
6 BOOL MoveOneUp( int i, int j)
7 {
8 BOOL bHasMoved = FALSE;
9 UINT32 uData = GetByPosition( i, j );
10
11 if ( 0 == uData )
12 {
13 return FALSE;
14 }
15
16 while ( i > 0 )
17 {
18 if( FALSE == MoveOneStep( i, j, i- 1, j, &uData) )
19 {
20 break; // 此次沒有移動結束循環
21 }
22 else
23 {
24 bHasMoved = TRUE; // 此次移動更新狀態
25 i--;
26 }
27 }
28
29 return bHasMoved;
30 }
3 // Method : MoveOneUp
4 // Description : 向上移動一塊
5 // ********************************************
6 BOOL MoveOneUp( int i, int j)
7 {
8 BOOL bHasMoved = FALSE;
9 UINT32 uData = GetByPosition( i, j );
10
11 if ( 0 == uData )
12 {
13 return FALSE;
14 }
15
16 while ( i > 0 )
17 {
18 if( FALSE == MoveOneStep( i, j, i- 1, j, &uData) )
19 {
20 break; // 此次沒有移動結束循環
21 }
22 else
23 {
24 bHasMoved = TRUE; // 此次移動更新狀態
25 i--;
26 }
27 }
28
29 return bHasMoved;
30 }
這個函數的被一個接受用戶輸入的函數調用,當按方向鍵時執行,調用上面的函數,逐塊移動:
1
//
********************************************
3 // Description : ↑
4 // ********************************************
5 void cmdUp()
6 {
7 int i,j;
8 BOOL bHasMoved = FALSE;
9
10 if ( FALSE == BeforeMove() )
11 {
12 return ;
13 }
14
15 for ( i = 0; i < SIZE ; i ++)
16 {
17 for ( j = 0; j < SIZE ; j ++)
18 {
19 bHasMoved = (TRUE == MoveOneUp(i,j) ? TRUE : bHasMoved);
20 }
21 }
22
23 if ( TRUE == bHasMoved)
24 {
25 AfterMove();
26 }
27 }
28
2 // Method : cmdUp
3 // Description : ↑
4 // ********************************************
5 void cmdUp()
6 {
7 int i,j;
8 BOOL bHasMoved = FALSE;
9
10 if ( FALSE == BeforeMove() )
11 {
12 return ;
13 }
14
15 for ( i = 0; i < SIZE ; i ++)
16 {
17 for ( j = 0; j < SIZE ; j ++)
18 {
19 bHasMoved = (TRUE == MoveOneUp(i,j) ? TRUE : bHasMoved);
20 }
21 }
22
23 if ( TRUE == bHasMoved)
24 {
25 AfterMove();
26 }
27 }
28
好了,就寫這么多,很簡單的小玩意,練練手
--------END------------