惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
L
LangChain Blog
WordPress大学
WordPress大学
MyScale Blog
MyScale Blog
The Cloudflare Blog
J
Java Code Geeks
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
Microsoft Azure Blog
Microsoft Azure Blog
Y
Y Combinator Blog
有赞技术团队
有赞技术团队
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
Martin Fowler
Martin Fowler
小众软件
小众软件
量子位
月光博客
月光博客
P
Proofpoint News Feed
IT之家
IT之家
腾讯CDC
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
雷峰网
雷峰网
V
Visual Studio Blog

博客园 - Ghost_zhao

knowlegecube 不停服更新二进制文件 linux 热替换so文件 博客更换至 www.zhaoch.top linux ptheard 生产者消费者 一个简单的makefile,一次性编译本文件夹下所有的cpp文件 c++ 最短路两种算法 C++语言十进制数,CDecimal(未完成) C语言面向对象的简便方法 C图书借还示例 Javascript 备忘 MFC小备忘 C++学习备忘(二) C++坦克大战 C++ 走迷宫 MFC 扫雷 C++学习备忘(一) 用MFC作的俄罗斯方块 C#手动回收内存的简单方法
C语言2048
Ghost_zhao · 2014-03-30 · via 博客园 - Ghost_zhao

这段时间google上有个小游戏挺火的,我也很喜欢,业余时间做个C语言版的。

老规矩先上干货: https://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     if0 == 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 }

 这个函数的被一个接受用户输入的函数调用,当按方向键时执行,调用上面的函数,逐块移动:

 1 //********************************************

 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------------