这段时间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------------