首页 > 编程语言 >常见项目——C语言实现2048小游戏(附源码和可执行文件)

常见项目——C语言实现2048小游戏(附源码和可执行文件)

时间:2023-05-28 22:12:51浏览次数:52  
标签:19 gotoxy C语言 2048 int 源码 board printf

1. 实现效果展示

1.1 界面图片

说明:进入下面各页面后均可通过按键“q”来退出。

1)菜单页

2)开始游戏页

3)游戏规则页

4)按键说明页

5)退出游戏页

1.2 视频展现

戳此处查看视频演示

1.3 游戏源码及可执行文件(exe)下载

支持作者,请关注公众号“优秀物联人”回复“2048小游戏”获取下载地址(包含.c源码和.exe可执行文件)

2. 介绍一些功能的实现方法

2.1 游戏中所使用的头文件

#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <math.h>
#include <time.h>

2.2 光标定位

/* 获取屏幕光标位置 */
void gotoxy(int x, int y)
{
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

通过该函数,即可实现对cmd控制台的打印位置控制,以便后续对页面进行精确绘制。

2.3 设置文字颜色

int color(int c)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

c是颜色的代号,数值不同,颜色不同。同时,cmd窗口部分颜色代号是带有背景颜色填充的,所以可以实现对不同数值背景色块不一样。

2.4 标题2048的绘制

标题2048绘制代码就用到了上面的光标定位,代码如下:

void number()
{
    color(11);
    gotoxy(19, 2);
    printf("■ ■ ■ ■    ■ ■ ■ ■         ■      ■ ■ ■ ■");
    gotoxy(19, 3);
    printf("         ■    ■       ■     ■  ■      ■       ■");
    gotoxy(19, 4);
    printf("■ ■ ■ ■    ■       ■   ■ ■ ■ ■   ■ ■ ■ ■");
    gotoxy(19, 5);
    printf("■             ■       ■         ■      ■       ■");
    gotoxy(19, 6);
    printf("■ ■ ■ ■    ■ ■ ■ ■         ■      ■ ■ ■ ■");
}

绘制效果:

2.5 游戏界面的绘制

void drawTheGameBox()
{
    number();
    color(14);
    gotoxy(19, 8);
    printf("游戏制作者:Billsheng  当前分数:%-6d  最高分:%-6d", score, best);
    gotoxy(19, 9);
    printf("------------------------------------------------------");
    gotoxy(19, 11);
    printf("┌────────────┬────────────┬────────────┬────────────┐");
    gotoxy(19, 12);
    printf("│            │            │            │            │");
    gotoxy(19, 13);
    printf("├────────────┼────────────┼────────────┼────────────┤");
    gotoxy(19, 14);
    printf("│            │            │            │            │");
    gotoxy(19, 15);
    printf("├────────────┼────────────┼────────────┼────────────┤");
    gotoxy(19, 16);
    printf("│            │            │            │            │");
    gotoxy(19, 17);
    printf("├────────────┼────────────┼────────────┼────────────┤");
    gotoxy(19, 18);
    printf("│            │            │            │            │");
    gotoxy(19, 19);
    printf("└────────────┴────────────┴────────────┴────────────┘");
    for (int i = 0; i < 4; i++)
    {
        for (int j = 0; j < 4; j++)
        {
            if (board[i][j] != 0)
            {
                if (board[i][j] == 2048)
                {
                    game_win = 1;
                    return;
                }
                for (int k = 1; k < 12; k++)
                {
                    if (board[i][j] == pow(2, k))
                    {
                        zimoxu = k - 1;
                        break;
                    }
                }
                gotoxy(lieweixu[j], hangweixu[i]);
                color(zimo[zimoxu]);
                printf("%4d", board[i][j]);
                color(0);
            }
        }
    }
}

1)首先通过gotoxy定位光标,精确绘制好基础的4*4的格子,格子当中数值通过二维数组board来存储。

2)每次数据更新需要逐一遍历该二维数组,采用两个for循环完成,0表示格子当中无数值,当格子数值当中出现2048时游戏胜利。

3)数字的色块代码是通过一维数组zimo来存储的,因为数值为2的x次幂,所以通过x可以控制不同数值色块颜色的变化。

4)因为4*4格子中数值显示位置是固定的,所以x和y可以通过两个一维数组来存储列数和行数。

2.6 逻辑判断

对于用户输入的向左、向右、向上、向下,二维数组board该做如何对应的变换?这是实现2048游戏的重点。下面以向左为例,给出代码和注释,以作分享。

void move_left()
{
    for (int i = 0; i < 4; i++) // 逐行查看
    {
        for (int j = 1, k = 0; j < 4; j++) // 逐列检查
        {
            if (board[i][j] != 0)
            {
                if (board[i][k] == board[i][j]) // 左右相等,可以合并
                {
                    score += board[i][k++] *= 2;
                    board[i][j] = 0;
                    add_num_flag = 1; // 合并则需要添加随机数
                }
                else if (board[i][k] == 0) // 左侧为0,直接移过去
                {
                    board[i][k] = board[i][j];
                    board[i][j] = 0;
                    add_num_flag = 1; // 合并则需要添加随机数
                }
                else // 左右两侧均不相等,发生碰撞
                {
                    board[i][++k] = board[i][j];
                    if (j != k) // 两个不相邻,则j位置置0
                    {
                        board[i][j] = 0;
                        add_num_flag = 1;
                    }
                }
            }
        }
    }
}

3. 其它需要思考的点

1)如何通过生成随机数,实现在空白格子的随机位置中随机添加一个2或4?

提示:需要统计空白格子数,并生成随机数,随机数对空白格子数取余,再去遍历到余数值,填充数字即可。

2)如何判断游戏结束了?

提示:当二维数组填满了数字且任一位置的上下左右均不与该位置值相同即为结束

3)如何保存用户的最高分,以实现下次打开应用时,最高分仍不变?当打破最高分后记录新的高分怎么操作?

提示:涉及文件的读入、写入操作。

具体实现代码可参见源码文件中各函数

游戏源码及可执行文件(exe)下载

辛苦各位,支持作者,请关注公众号“优秀物联人”回复“2048小游戏”获取下载地址(包含.c源码和.exe可执行文件)

标签:19,gotoxy,C语言,2048,int,源码,board,printf
From: https://www.cnblogs.com/Billsheng/p/my_2048.html

相关文章

  • C语言进阶--#和##运算符
    ##运算符用于在预处理器粘连两个标识符##的连接作用实在预处理期完成的,因此只在宏定义中有效编译器不知道##的连接作用用法:#defineBB(a,b)a##bintBB(a,1);  //inta1;a1=2; #运算符用于预处理期将宏参数转换为字符串#的转换作用是在预处理期完成的,因此只在宏......
  • 基于JAVA的springboot+vue摄影跟拍预定管理系统,附源码+数据库+论文+PPT
    1、项目介绍困扰管理层的许多问题当中,摄影跟拍预定管理一定是不敢忽视的一块。但是管理好摄影跟拍预定又面临很多麻烦需要解决,例如有几个方面:第一,往往用户人数都比较多,如何保证能够管理到每一用户;第二,如何在工作琐碎,记录繁多的情况下将摄影跟拍预定的当前情况反应给领导......
  • C语言进阶--#pragma pack
    为什么需要内存对齐?--CPU对内存的读取不是连续的,而是分成块读取的,块的大小只能是1、2、4、16、。。。字节--当读取操作的数据未对齐,则需要两次总线周期来访问内存,因此性能会大打折扣--某些硬件平台只能从规定的相对地址处读取特定类型的数据,否则产生硬件异常#pragmapack用于......
  • C语言进阶--条件编译使用分析
    #include的本质是将已经存在的文件内容嵌入到当前文件中#include的间接包含同样会产生嵌入文件内容的操作 条件编译可以解决头文件重复包含的编译错误#ifndef_HEADER_FILE_H#define_HEADER_FILE_H//sourcecode#endif --条件编译使得我们可以按不同的条件编译不同的......
  • C语言进阶--#error和#line分析
    #error用于生成一个编译错误消息用法:#errormessage --message不需要用双引号包围#error编译指示符用于自定义程序员特有的编译错误消息,#error是一种预编译器指示符,可用于提示编译条件是否满足 ifndef_cplusplus#errorThisfileshouldbeprocessedwithC++compil......
  • C语言进阶--宏定义
    #define--是预处理器处理的单元实体之一--定义的宏可以出现在程序的任意位置--定义之后,代码可以使用这个宏 注意:--宏表达式被预处理器处理,编译器不知道宏表达式的存在--宏表达式没有任何的“调用”开销--宏表达式用“实参”完全替代形参,不进行任何运算--宏表达式中不能......
  • Tomcat请求处理流程与源码浅析
    系列文章目录和关于我一丶Connector在tomcat中,Connector负责开启socket并且监听客户端请求,返回响应数据。其中:Endpoint:tomcat中没有这个接口,只有AbstractEndpoint,它负责启动线程来监听服务器端口,并且在接受到数据后交给Processor处理Processor:Processor读取到客户端请求......
  • 基于C语言开发菜鸟驿站管理系统
    访问【WRITE-BUG数字空间】_[内附完整源码和文档]这是用C语言写的简单的菜鸟驿站管理系统,还配有的我的学年设计文档,内容应该很详细一、绪论1.1设计背景随着社会的发展,互联网的兴起,网络购物渐成为人们购物的新时尚。快递行业也在网络购物的带动下蓬勃发展,成为人们生活中必不可少的......
  • coreutils test 源码分析
    Test的代码中主要解析如下语法,当然使用的时候也可以参考如下语法进行语句的编写/*test(1)acceptsthefollowinggrammar:oexpr::=aexpr|aexpr"-o"oexpr;aexpr::=nexpr|nexpr"-a"aexpr;nexpr::=primary|"!"primaryprimary::=un......
  • C语言--模拟实现atoi 字串转整型
    模拟实现atoi,仅考虑了部分转换规则intmy_atoi(constchar*p){ intflag=1; longlongn=0; //空指针 if(p==NULL) return0x000000; //空字符 if(*p=='\0') return0x000000; //跳过字串前空字符 while(!(*p=='+'||*p=='-'||(*p>='0......