好玩的2048编程小游戏,C语言写的代码分享给你了!

学习C语言/C++已经接近一个月了,在老师的带领下,我们已经学习了c语言数据的基本类型、变量的输入输出、进制转换、运算符和分支结构、循环结构、数组、指针、函数和字符串结构体等等,在老师带着我们作出了一个贪吃蛇的过程中让我深刻的体会到了字符界面做游戏的快感,原来c语言如此强大,利用所学的基础居然可以实现这样精巧的功能。然后老师又介绍了一个2048的游戏,说这个游戏的实现比较有挑战,本来就对c语言憧憬的我对2048这个游戏充满了好奇,然后自己下载了一个2048的游戏玩了一下就开始实现自己的代码了,挑战了一下自己。

下面我会把实现这个游戏的思路以及相应的解决办法进行了总结,并提供自己的代码和详细注释。

1.设计目标

(1)界面显示

   ////////////////

   /  2   2   2  8/

   /              /

   /      2       /

   /              /

  /////////////////

(2)游戏操作

r   --->      开始游戏

q   --->      结束游戏

2   ---->     下移

4   ---->     左移

6   ---->     右移

8   ---->     上移

任意键 ->        重新开始

(3)游戏规则

按r键开始游戏,然后进行游戏,可以输入任意方向键进行操作;进行相应的平移操作,当两个相同的数字"相撞"则将它们两个数字合成一个是它们和的数字,当两个数字不同"相撞"则不进行合成;当所有格子满了并且无法进行移动的时则判断为输,当数字有一个出现2048的字样则判断为赢。

2.创新点

(1)可以改变游戏的胜利值(2048可以修改为1024等等)

(2)任何时刻都可以按住r重新开始游戏

(3)代码用一维数组代替二维数组,减少了遍历数组的时间复杂度

(4)操作方向的时候不需要输入回车,使用户得到更舒适的体验

(5)界面的刷新流畅

(6)屏蔽其他按键

3.对未来的展望

(1)修改成为图形界面并增加一些动画特效

(2)优化代码

4.重难点剖析

(1)如何利用2 4 6 8进行方向控制?

答:可以利用switch...case语句,当输入字符为2时调用下移函数,当输入字符为4时则调用左移函数等

(2)如何不输入回车就可以输入字符?

答:可以通过getch(),输入字符并且不用输入回车即可达到效果

(3)为什么地图数组用一维数组代替二维数组

答:由于每一帧画面都会要遍历该数组,使用一维数组可以方便的用一个循环就可以遍历数组

(4)怎么判断输

答:当数组中全部都被占用,并且每个数字的上下左右都没有与它相同的数字即为输

(5)怎么判断赢

答:遍历数组出现2048即为赢

(6)移动时内部数据怎么变化

答:由于上下左右比较类似,我就以左移做详细介绍,其他的可以类推。

分析左移代码

void MoveLeft()

{

    int i = 0;

    int tempmap[GAMERANGE ] = {0};   

    memcpy(tempmap,g_map,GAMERANGE *sizeof(int)); //拷贝移动的之前的数组

    for (i; i < GAMERANGE ; ++i)  

    {

        if (g_map[i])

        {

            MoveMostLeft(i);    //移动单个元素0~15

            }

    }

    HandleState(tempmap,g_map,GAMERANGE );//处理游戏对应的状态,判断输赢并做处理

}

HandleState函数我就不多解释了, 主要是判断输赢并做处理的函数

下面主要看一下MoveMostLeft函数, 这个函数是将数组中的pos位置的元素移动

/*游戏地图单个坐标左移*/

void MoveMostLeft(int pos)

{

    int i = pos - 1;  //i为pos左边的元素

    while (i >= pos - pos % 4 && !g_map[i]) //i不出界 && i是空格

    {

         --i;

    }

     //此时的i指向的是刚刚出左边的界或者是pos左边的第一个数字

    if (i < 0) //说明pos左边全为0              //i<0 说明左边全部是空格

    {

        g_map[i+1] = g_map[pos];          //将pos位置的数字赋值给最左边的数字

       if (i+1 != pos) //排除i+1和pos位置一样,使得i+1的数值赋值为0

           {

            g_map[pos] = 0;

           }

    }

    else        //说明pos左边有非0数字, 左边坐标为i  i指向的是左边第一个数字

    {

        if (g_map[i] == g_map[pos])         //判断pos位置的数字和左边第一个数字是不是相等的,如果是相等的话,i的位置的数字乘2,pos位置的值赋值为空格

        {

            g_map [i] = g_map[i] << 1;//如果i和pos数字相同,则将位置i的数值乘以2 <<左移1则是乘以2

            g_map[pos] = 0;

        }

        else                   //如果pos位置的值不等于左边第一个数字的值则吧左边第一个数字的右边的一个空格修改为pos位置的值,然后修改pos位置的值为空格

        {

            g_map[i+1] = g_map[pos];

            if (i+1 != pos)

                        {

                g_map[pos] = 0;

                        }

                    }

    }

}

上面主要是左移部分的代码已经详细解释, 右移,上移,下移都类似

5.总结

在刚刚写代码的时候感觉方向不明确,不知道如何下手,便写了一个左移函数后来发现其他方向类似,其他方向的代码基本上都是复制的左移代码,然后400多行的代码就出来了, 写出来之后感觉自己很有成就感,通过自己所学的东西完成了一个小小的项目,也算是对前面所学知识的一个综合性的运用。自己对项目的编写有了一定的体会, 先将整个项目分成一些小模块,然后在分开写代码,最后将代码整合出来一个项目,整个游戏就是这样出来了,当然一个项目的完成还会碰到一些问题,还了解了一些常见问题的解决办法。

附加: 编译方法

gcc 2048.c -l curses     //使用了curses库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342