c语言实现2048游戏

本文涉及的产品
图片翻译,图片翻译 100张
语种识别,语种识别 100万字符
文档翻译,文档翻译 1千页
简介: c语言实现2048游戏

经过一天的学习研究,终于实现了c语言dos版本的2048游戏,通过wsad控制方向,esc,q键退出,空格键重新开始,实现了计分板功能,代码如下:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>     // for rand() and srand() and exit()
#include <windows.h>    // for system()
#include <string.h>     //字符串操作函数
#include <sys/time.h>   //系统时间
void welcome(void);//欢迎界面
void cls(void);//清屏
void init(void);//初始化元素
void draw(void);//绘制图形
int mt_rand(int, int);//随机数专用
void play(void);//游戏中
void addNumber(void);//新增数字
void keyUp(void);//向上事件;
void keyDown(void);//向下事件;
void keyLeft(void);//向左事件;
void keyRight(void);//向右事件;
void gameOver(int);//结束事件;
void isGameOver(void);//判断游戏是否结束;
int map\[4\]\[4\];
int emptyNum = 16;//地图元素为空数量
int scores = 0;
void main(void) {
    srand(time(0));//随机数播种
    welcome();
    init();
    cls();
    draw();
    while (1) {
//        printf("%d\\n",getch());
        isGameOver();
        play();
        Sleep(100);
    }
}
/**
 * 欢迎界面
 */
void welcome(void) {
    printf("****************************\\n");
    printf("          2048 doc版        \\n");
    printf("       通过w/s/a/d控制      \\n");
    printf("   通过字母q或esc退出游戏   \\n");
    printf("    通过空格键可重新开始    \\n");
    printf("     请按任意键开始游戏     \\n");
    printf("****************************\\n");
    getch();//阻塞方式等待按键
}
/**
 * 初始化界面元素
 */
void init(void) {
    int x, y;
    emptyNum = 16;
    scores=0;
    for (x = 0; x < 4; ++x) {
        for (y = 0; y < 4; ++y) {
            map\[x\]\[y\] = 0;
        }
    }
    x = mt_rand(1, 4) % 4;
    y = mt_rand(1, 4) % 4;
//    x = 1;
//    y = 3;
    map\[x\]\[y\] = 2;
    emptyNum--;//为空数量减一
}
/**
 * 运行游戏
 */
void play(void) {
    //检测em
    //监听按键
    int key = getch();
    switch (key) {
        case 119:    // 向上移动
        case 87:
            keyUp();
            cls();
            addNumber();
            draw();
            break;
        case 115:    // 向下移动
        case 83:
            keyDown();
            cls();
            addNumber();
            draw();
            break;
        case 97:    // 向左移动
        case 65:
            keyLeft();
            cls();
            addNumber();
            draw();
            break;
        case 100:     // 向右移动
        case 68:
            keyRight();
            cls();
            addNumber();
            draw();
            break;
        case 27:   // 退出游戏
        case 113:
        case 81:
            cls();
            printf("****************************\\n");
            printf("           确定退出?        \\n");
            printf("     Enter确定,其他键取消   \\n");
            printf("****************************\\n");
            int key = getch();
            if (key == 13) {
                gameOver(1);
            } else {
                cls();
                draw();
            }
            break;
        case 32:
            cls();
            printf("****************************\\n");
            printf("         确定重新开始?      \\n");
            printf("     Enter确定,其他键取消   \\n");
            printf("****************************\\n");
            key = getch();
            cls();
            if (key == 13) {
                init();
            }
            draw();
            break;
        default:
            cls();
            draw();
            printf("按键错误,请重新输入\\n");
            break;
    }
}
/**
 * 随机增加2,4字母
 */
void addNumber(void) {
    int temp, number;
    int x, y;
    if (emptyNum > 0) {     // 找出空格
        do {
            x = mt_rand(1, 4) % 4;
            y = mt_rand(1, 4) % 4;
        } while (map\[x\]\[y\] != 0);
        number = mt_rand(1, 2);
        temp = number % 2;
        if (temp == 1) {  // 判断是生成数字2,还是数字4
            map\[x\]\[y\] = 2;
            emptyNum--;
        }
        if (temp == 0) {
            map\[x\]\[y\] = 4;
            emptyNum--;
        }
    }
}
/**
 * 判断游戏是否结束
 */
void isGameOver(void) {
    if (emptyNum == 0) {
        for (int x = 0; x < 4; ++x) {
            for (int y = 0; y < 4; ++y) {
                //判断右边和下边的是否相等
                if (map\[x\]\[y\] != map\[x + 1\]\[y\] && map\[x\]\[y\] != map\[x\]\[y + 1\]) {
                    gameOver(2);
                }
            }
        }
    }
}
/**
 * 游戏结束处理
 * @param overType
 */
void gameOver(int overType) {
    switch (overType) {
        case 1:
            cls();
            //正常结束
            printf("****************************\\n");
            printf("           已退出...        \\n");
            printf("****************************\\n");
            Sleep(1);
            exit(0);
        case 2:
            cls();
            init();
            printf("****************************\\n");
            printf("       游戏结束,分数:%d     \\n",scores);
            printf("       是否重新开始游戏?    \\n");
            printf("     Enter继续游戏,Esc退出  \\n");
            printf("****************************\\n");
            int key = getch();
            cls();
            switch (key) {
                case 27:
                    gameOver(1);
                    break;
                case 13:
                    welcome();
                    break;
            }
    }
}
void keyUp(void) {
    int x, y, i;
    //先合并相同的方块
    //通过y轴,上下合并
    for (y = 0; y < 4; y++) {
        for (x = 0; x < 4; ++x) {
            if (map\[x\]\[y\] != 0) {
                for (i = y + 1; i < 4; ++i) {
                    if (map\[x\]\[y\] == map\[x\]\[i\]) {
                        map\[x\]\[y\] = map\[x\]\[y\] * 2;
                        scores+=map\[x\]\[y\];
                        map\[x\]\[i\] = 0;
                        emptyNum++;
                        break;
                    } else if (map\[x\]\[i\] != 0) {
                        break;
                    } else {
                        continue;
                    }
                }
            }
        }
    }
    //向上移动数字
    for (y = 0; y < 4; y++) {
        for (x = 0; x < 4; x++) {
            if (map\[x\]\[y\] == 0) {
                for (i = y + 1; i < 4; ++i) {
                    if (map\[x\]\[i\] != 0) {
                        map\[x\]\[y\] = map\[x\]\[i\];
                        map\[x\]\[i\] = 0;
                        break;
                    }
                }
            }
        }
    }
}
void keyDown(void) {
    int x, y, i;
    //先合并相同的方块
    //通过y轴,上下合并
    for (y = 3; y >= 0; y--) {
        for (x = 0; x < 4; ++x) {
            if (map\[x\]\[y\] != 0) {
                for (i = y - 1; i >= 0; i--) {
                    if (map\[x\]\[y\] == map\[x\]\[i\]) {
                        map\[x\]\[y\] += map\[x\]\[i\];
                        scores+=map\[x\]\[y\];
                        map\[x\]\[i\] = 0;
                        emptyNum++;
                        break;
                    } else if (map\[x\]\[i\] != 0) {
                        break;
                    } else {
                        continue;
                    }
                }
            }
        }
    }
    //向下移动数字
    for (y = 3; y >= 0; y--) {
        for (x = 0; x < 4; x++) {
            if (map\[x\]\[y\] == 0) {
                for (i = y - 1; i >= 0; i--) {
                    if (map\[x\]\[i\] != 0) {
                        map\[x\]\[y\] = map\[x\]\[i\];
                        map\[x\]\[i\] = 0;
                        break;
                    }
                }
            }
        }
    }
}
void keyLeft(void) {
    int x, y, i;
    //先合并相同的方块
    //通过x轴,左右合并
    for (x = 0; x < 4; x++) {
        for (y = 0; y < 4; ++y) {
            if (map\[x\]\[y\] != 0) {
                for (i = x + 1; i < 4; ++i) {
                    if (map\[x\]\[y\] == map\[i\]\[y\]) {
                        map\[x\]\[y\] = map\[x\]\[y\] * 2;
                        scores+=map\[x\]\[y\];
                        map\[i\]\[y\] = 0;
                        emptyNum++;
                        break;
                    } else if (map\[i\]\[y\] != 0) {
                        break;
                    } else {
                        continue;
                    }
                }
            }
        }
    }
    //向左移动数字
    for (x = 0; x < 4; x++) {
        for (y = 0; y < 4; y++) {
            if (map\[x\]\[y\] == 0) {
                for (i = x + 1; i < 4; ++i) {
                    if (map\[i\]\[y\] != 0) {
                        map\[x\]\[y\] = map\[i\]\[y\];
                        map\[i\]\[y\] = 0;
                        break;
                    }
                }
            }
        }
    }
}
void keyRight(void) {
    int x, y, i;
    //先合并相同的方块
    //通过x轴,左右合并
    for (x = 3; x >= 0; x--) {
        for (y = 0; y < 4; ++y) {
            if (map\[x\]\[y\] != 0) {
                for (i = x - 1; i >= 0; i--) {
                    if (map\[x\]\[y\] == map\[i\]\[y\]) {
                        map\[x\]\[y\] += map\[i\]\[y\];
                        scores+=map\[x\]\[y\];
                        map\[i\]\[y\] = 0;
                        emptyNum++;
                        break;
                    } else if (map\[i\]\[y\] != 0) {
                        break;
                    } else {
                        continue;
                    }
                }
            }
        }
    }
    //向右移动数字
    for (x = 3; x >= 0; x--) {
        for (y = 0; y < 4; y++) {
            if (map\[x\]\[y\] == 0) {
                for (i = x - 1; i >= 0; i--) {
                    if (map\[i\]\[y\] != 0) {
                        map\[x\]\[y\] = map\[i\]\[y\];
                        map\[i\]\[y\] = 0;
                        break;
                    }
                }
            }
        }
    }
}
/**
 * 绘制游戏界面
 */
void draw(void) {
    int x, y;
    //绘制第一行横线
    printf(" ___________________");
    printf("\\n");
    for (y = 0; y < 4; ++y) {          // 一个方格由三根竖线组成
        for (x = 0; x < 4; ++x) {     // 第一排竖线 每个竖线之间占5个格
            printf("|    ");
        }
        printf("|\\n");
        for (x = 0; x < 4; ++x) {   // 第二排竖线与数字
            if (map\[x\]\[y\] == 0) {
                printf("|    ");
            } else {
                printf("|%4d", map\[x\]\[y\]);
            }
        }
        printf("|\\n");
        for (x = 0; x < 4; ++x) {    // 第三排竖线加底线
            printf("|____");
        }
        printf("|\\n");
    }
    //输出分数
    printf("分数:%d \\n", scores);
}
/**
 * 清屏
 */
void cls(void) {
    system("cls");
}
/**
 * 根据区间随机
 * @param start
 * @param end
 * @return
 */
int mt_rand(int start, int end) {
    return rand() % (end + 1 - start) + start; /*生成一个\[start,end)区间内的整数*/
}

游戏截图如下:




image.png

image.png

image.png

image.png

image.png

目录
相关文章
|
21天前
|
C语言
C语言之斗地主游戏
该代码实现了一个简单的斗地主游戏,包括头文件引入、宏定义、颜色枚举、卡牌类、卡牌类型类、卡牌组合类、玩家类、游戏主类以及辅助函数等,涵盖了从牌的生成、分配、玩家操作到游戏流程控制的完整逻辑。
62 8
|
2月前
|
C语言
扫雷游戏(用C语言实现)
扫雷游戏(用C语言实现)
106 0
|
4月前
|
机器学习/深度学习 C语言
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
【8月更文挑战第5天】本篇文章用C语言采用多文件编写实现了一个基础的扫雷游戏(附源码),并讲解了关于函数递归的基础概念及其相对应的习题练习(附源码)
44 1
九/十:《初学C语言》— 扫雷游戏实现和函数递归基础
|
14天前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
30 2
|
28天前
|
C语言 Windows
C语言课设项目之2048游戏源码
C语言课设项目之2048游戏源码,可作为课程设计项目参考,代码有详细的注释,另外编译可运行文件也已经打包,windows电脑双击即可运行效果
32 1
|
5月前
|
存储 C语言 开发者
C语言实战 | Flappy Bird游戏
【7月更文挑战第4天】Flappy Bird是由越南开发者制作的简单却极具挑战性的游戏,玩家需控制小鸟穿越水管障碍。游戏涉及角色初始化、显示和更新。小鸟和水管结构体存储数据,使用变量和数组。初始化小鸟和水管,显示背景、小鸟和水管,更新小鸟位置及碰撞检测。代码示例展示了小鸟和水管的状态管理,当小鸟与管道碰撞或触地时,游戏结束。游戏的成功在于其独特的虐心体验。
81 0
C语言实战 | Flappy Bird游戏
|
2月前
|
编译器 C语言
猜数字游戏实现#C语言
猜数字游戏实现#C语言
87 1
|
2月前
|
存储 C语言
揭秘C语言:泊舟的猜数字游戏
揭秘C语言:泊舟的猜数字游戏
|
2月前
|
存储 算法 安全
C语言实现扫雷游戏
C语言实现扫雷游戏
|
2月前
|
算法 编译器 C语言
【C语言】实现猜数字游戏(分支语句与循环语句的运用)
【C语言】实现猜数字游戏(分支语句与循环语句的运用)