用C语言编写2048游戏

article/2025/10/27 6:55:38

2048_C_code

用C语言编写的2048

1

要实现我们的 2048 小游戏,需要涉及一些数据结构的知识,以及一些 Linux 的系统调用。此外,为了方便在屏幕上使用字符绘图,我们还需要使用一个文本界面的屏幕绘图库 ncurses ,具体到操作就是在编译的时候需要加上 -lcurses 选项。
安装ncurses库:
sudo apt-get install libncurses5-dev

设计思路

要实现 2048 游戏目前有两个关键点:

  1. 在满足条件情况下消除方块
  2. 允许在游戏主界面(16 宫格)中任意一格输出数据
    其中第二点借助 ncurses 库可以较容易实现,但是第一点要稍微麻烦些。第一点的实现思路是,我们创建一个与游戏地图相同维数的数组矩阵,通过数组矩阵来维护 2048 游戏中每个格子的数据与状态,从而玩家的移动操作都可以映射为对数组矩阵的操作。

基础工作

  1. 引头文件
    编写自己的头文件head.h。
    添加库函数头文件:
#include <stdio.h>
#include <stdlib.h>
#include <curses.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
  1. 创建函数
void draw(); //用于绘制游戏界面
void play(); //游戏运行的逻辑主体
void init(); //初始化函数,用于完成一些必要的初始化操作
void draw_one(int y, int x); //绘制单个数字
void cnt_value(int *new_y, int *new_x);
int game_over(); //结束游戏
int cnt_one(int y, int x);
  1. 编写函数
    创建函数文件head.c。
    添加函数的内容。
#include "head.h"
int a[4][4] = {0};
int empty;
int old_y, old_x;
void draw()
{int n, m, x, y;char c[4] = {'0', '0', '0', '0'};clear();for(n=0;n<9;n+=2){for(m=0;m<21;m++){move(n, m);addch('-');refresh();}}for(m=0;m<22;m+=5){for(n=1;n<8;n++){move(n,m);addch('|');refresh();}}for(y=0;y<4;y++){for(x=0;x<4;x++){draw_one(y, x);}}
}
void play()
{int x, y, i, new_x, new_y, temp;int old_empty, move;char ch;while(1){move = 0;old_empty = empty;ch = getch();switch(ch) {case 97:    //左移  acase 104:   // hcase 68:    // 左移方向键for(y = 0; y < 4; y++)for(x = 0; x < 4; ){if(a[y][x] == 0){x++;continue;}else{for(i = x + 1; i < 4; i++){if(a[y][i] == 0){continue;}else{if(a[y][x] == a[y][i]){a[y][x] += a[y][i];a[y][i] = 0;empty++;break;}else{break;}}}x = i;}}for(y = 0; y < 4; y++)for(x = 0; x < 4; x++){if(a[y][x] == 0){continue;}else{for(i = x; (i > 0) && (a[y][i-1] == 0); i--){a[y][i-1] = a[y][i];a[y][i] = 1;move = 1;}}}break;case 100:   //右移 dcase 108:   // lcase 67:    //右移方向键for(y = 0; y < 4; y++)for(x = 3; x >= 0; ){if(a[y][x] == 0){x--;continue;}else{for(i = x - 1; i >= 0; i--){if(a[y][i] == 0){continue;}else if(a[y][x] == a[y][i]){a[y][x] += a[y][i];a[y][i] = 0;empty++;break;}else{break;}}x = i;}}for(y = 0; y < 4; y++)for(x = 3; x >= 0; x--){if(a[y][x] == 0){continue;} else{for(i = x; (i < 3) && (a[y][i+1] == 0); i++){a[y][i+1] = a[y][i];a[y][i] = 0;move = 1;}}}break;case 119:   //上移 wcase 107:   //kcase 65:    //上移方向键for(x = 0; x < 4; x++)for(y = 0; y < 4; ){if(a[y][x] == 0){y++;continue;}else{for(i = y + 1; i < 4; i++){if(a[i][x] == 0){continue;}else if(a[y][x] == a[i][x]){a[y][x] += a[i][x];a[i][x] = 0;empty++;break;} else{break;}}y = i;}}for(x = 0; x < 4; x++)for(y = 0; y < 4; y++){if(a[y][x] == 0){continue;}else{for(i = y; (i > 0) && (a[i-1][x] == 0); i--){a[i-1][x] = a[i][x];a[i][x] = 0;move = 1;}}}break;case 115:   //下移 scase 106:   //jcase 66:    //下移方向键for(x = 0; x < 4; x++)for(y = 3; y >= 0; ){if(a[y][x] == 0){y--;continue;}else{for(i = y - 1; i >= 0; i--){if(a[i][x] == 0){continue;}else if(a[y][x] == a[i][x]){a[y][x] += a[i][x];a[i][x] = 0;empty++;break;}else{break;}}y = i;}}for(x = 0; x < 4; x++)for(y = 3; y >= 0; y--){if(a[y][x] == 0){continue;}else{for(i = y; (i < 3) && (a[i+1][x] == 0); i++){a[i+1][x] = a[i][x];a[i][x] = 0;move = 1;}}}break;case 'Q':case 'q':game_over();break;default:continue;break;}if(empty <= 0)game_over();if((empty != old_empty) || (move == 1)){do{new_x = rand() % 4;new_y = rand() % 4;}while(a[new_y][new_x] != 0);cnt_value(&new_y, &new_x);do {temp = rand() % 4;}while(temp == 0 || temp == 2);a[new_y][new_x] = temp + 1;empty--;}draw();}
}
void init()
{int x, y;initscr();cbreak();noecho();curs_set(0);empty = 15;srand(time(0));x = rand() % 4;y = rand() % 4;a[y][x] = 2;draw();
}
void draw_one(int y, int x)
{int i, m, k, j;char c[5] = {0x00};i = a[y][x];m = 0;while(i>0){j = i %10;c[m++] = j + '0';i = i / 10;}m = 0;k = (x+1) * 5 - 1;while(c[m] != 0x00){move(2*y+1, k);addch(c[m++]);k--;}
}
void cnt_value(int *new_y, int *new_x)
{int max_x, max_y, x, y, value;int max = 0;max = cnt_one(*new_y, *new_x);for(y = 0; y < 4; y++)for(x = 0; x < 4; x++){// 如果(y, x)对应的空格为空if(!a[y][x]){// 优先选取周围空格最多的空格展示新数字value = cnt_one(y, x);if(value > max && old_y != y && old_x != x){// 避免在同一位置反复出现新数字*new_y = y;*new_x = x;old_x = x;old_y = y;break;}}}
}
int game_over()
{sleep(1);endwin();exit(0);
}
int cnt_one(int y, int x)
{int value = 0;if(y - 1 > 0)a[y-1][x] ? 0 : value++;if(y + 1 < 4)a[y+1][x] ? 0 : value++;if(x - 1 >= 0)a[y][x-1] ? 0 : value++;if(x + 1 < 4)a[y][x+1] ? 0 : value++;if(y - 1 >= 0 && x - 1 >= 0)a[y-1][x-1] ? 0 : value++;if(y - 1 >= 0 && x + 1 < 4)a[y-1][x+1] ? 0 : value++;if(y + 1 < 4 && x - 1 >= 0)a[y+1][x-1] ? 0 : value++;if(y + 1 < 4 && x + 1 < 4)a[y+1][x+1] ? 0 : value++;return value;}
  1. 编写主函数game_2048.c
#include "head.h"
int main()
{init();play();endwin();return 0;
}
  1. 编写makefile文件
test:game_2048.o head.ogcc game_2048.o head.o -o test -lcurses
game_2048.o:game_2048.cgcc -c -Wall game_2048.c -o game_2048.o -lcurses
head.o:head.cgcc -c -Wall head.c -o head.o -lcurses.PHONY:clean
clean:rm *.o test
  1. 编译
    make
  2. 结果在这里插入图片描述
    [外链图片转存失败(img-HlCDoo0v-1565955275132)(picture/1.png)]
    [外链图片转存失败(img-NpvIMnir-1565955275134)(picture/2.png)]

2

也可以用Game_2048.c一个文件进行编译

gcc Game_2048.c -o 2048 -lcurses

[外链图片转存失败(img-zIWXnzpJ-1565955275135)(picture/3.png)]

[外链图片转存失败(img-ph1SKZxg-1565955275136)(picture/2.png)]
代码地址:
Github地址
参考:

实验楼->C 语言制作 2048
C 语言制作 2048


http://chatgpt.dhexx.cn/article/dbUeGPF8.shtml

相关文章

C语言编写猜数字小游戏

C语言编写猜数字小游戏 经过对C语言的初步学习&#xff0c;为提高编程能力&#xff0c;可以敲一些稍费脑筋的代码&#xff0c;猜数字就是一个很好的选择。要想实现该游戏&#xff0c;那么首先我们应该知道制作的大体思路。 电脑应随机产生一个数字&#xff08;为便于玩家猜的…

C语言编写2048小游戏

一、原理 这里以向上移动为例&#xff0c;其他方向的移动类似。 因为纵向移动不会横向变化&#xff0c;所以可以单独拿出某一列来分析。 我们先假设一个具有代表性的例子&#xff0c;假设当前某列数据是【2】【0】【2】【8】&#xff08;0代表空白&#xff09;&#xff0c;如…

Linux C语言编写2048小游戏

2048 2048小游戏是用Linux C语言写的&#xff0c;运行在Ubuntu系统上&#xff0c;其中Ubuntu链接Ncuses库。首先&#xff0c;我们简单了解一下Ncurses。 Ncurses库是由原CURSES库发展而来的&#xff0c;这个库提供了C/C对屏幕以及光标、鼠标访问的特性。使得C/C简易写屏成为可能…

C语言编写小游戏:MinesWeeper(扫雷)闯关版

《扫雷》&#xff1a;大众类的益智小游戏&#xff0c;游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子&#xff0c;同时避免踩雷&#xff0c;踩到一个雷即全盘皆输。 话不多说&#xff0c;我们直接进入正题。 首先&#xff0c;我们得给用户显示一个菜单栏&…

(C语言)用C语言编写小游戏——三子棋

目录 三子棋效果展示 三子棋的功能实现 1、初始化棋盘格 2、打印棋盘 3、玩家下棋 4、电脑下棋 5、判断输赢&#xff08;玩家赢/电脑赢/平局&#xff09; 完整代码展示 三子棋小游戏的代码实现分为三个文件&#xff0c;test.c&#xff08;测试游戏功能&#xff09;、ga…

c语言编写的小游戏(c语言编写小游戏入门)

C语言编写是要注意什么&#xff1f; 因此&#xff0c;在编写选择语句之前&#xff0c;应该首先明确判断条件是什么&#xff0c;并确定当判断结果为“真”或“假”时应分别执行什么样的操作(算法) c语言编写小游戏请提供俄罗斯方块&#xff0c;坦克大战之类的小游戏的程序的c 应…

(C语言)用C语言编写小游戏——扫雷

目录 扫雷效果展示 扫雷的功能实现 1、初始化棋盘格 2、 打印棋盘 3、布置雷 4、排查雷 完整代码展示 扫雷小游戏的代码实现分为三个文件&#xff0c;test.c&#xff08;测试游戏功能&#xff09;、game.h&#xff08;头文件的包含和函数的声明&#xff09;、game.c&…

详解5个C语言简单易懂小游戏

文章目录 前言一、准备工作二、游戏菜单三、游戏内容1.猜数字2.三子棋3.扫雷4.五子棋5.飞行棋 总结 前言 我们通过5个简单易懂的小游戏来加强我们对C语言的认识&#xff0c;这五个小游戏不仅有单人&#xff0c;还有人机对战和人人对战。让我们在学习之余来上一局紧张刺激的小游…

C语言趣味小游戏——扫雷(详解版)

前言 ​ 全篇无任何废话&#xff0c;本文的解释大多数都在代码段中&#xff0c;所以一定要看代码&#xff0c;边看边学边理解。 这只是初学者入门的一个小游戏&#xff0c;不难懂&#xff0c;没有什么复杂的内容 可以先学习一下比扫雷还简单的猜数字和三子棋 C语言趣味小游戏—…

C语言小程序游戏

c语言小程序游戏 ​ 本代码是我大一刚学完c语言自己编写的&#xff0c;三个游戏分别是飞机竞速、走迷宫和魔塔&#xff0c;满满的都是回忆。 1、不可能的任务-飞机竞速 ​ 这种游戏在以前小时候玩的游戏机里面玩过&#xff0c;那时抱着个游戏机一玩就是一下午&#xff0c;如…

C语言简易小游戏

文章目录 前言一、猜数字游戏二、旋转光标三、多个字符从两端移动&#xff0c;向中间汇聚四、恶搞&#xff1a;关机小程序五、闪烁的五彩爱心六、扫雷七、三子棋 前言 本篇博客将带领大家自己动手写一下一些C语言小游戏&#xff1b;以增加对于C语言的兴趣&#x1f600;&#x…

c语言成绩管理系统(链表)

C语言实现了学生成绩管理系统&#xff0c;可以进行学生成绩的增加&#xff0c;删除&#xff0c;修改&#xff0c;查询&#xff0c;计算平均成绩和展示。 开发语言&#xff1a;C语言 开发工具&#xff1a;Dev c 开发者&#xff1a;呵呵up 创建学生成绩信息 2. 插入学生信息 3.…

C语言实现学生成绩管理系统设计

本系统有增加学生记录、修改学生记录、删除学生记录、按姓名查询学生记录、按C语言成绩对学生进行排序、退出系统6大功能。 能够对学生的姓名&#xff0c;学号&#xff0c;c语言成绩做相应的操作。 在检测到输入成绩大于55时&#xff0c;会自动加上5。 该管理系统设计功能模块…

c语言成绩管理系统常见错误,求教 学生成绩管理系统出错

已结贴√ 问题点数:20 回复次数:5 求教 学生成绩管理系统出错 小弟刚做了个学生成绩管理系统 编译无错误 但是运行的时候连选择函数都不能 特来求教 望高手解释 代码如下: #include #include #define N 20 #define M 100 struct score {int scr1; int scr2; int scr…

c语言课程设计 学生成绩管理系统

学生成绩管理系统要求&#xff1a; 1、系统功能以菜单方式工作&#xff1b; 2、数据的输入&#xff1b; 3、数据的插入&#xff1b; 4、数据的输出&#xff1b; 5、数据的删除&#xff1b; 6、数据的查找&#xff0c;通常以两种方式进行查找&#xff0c;如姓名、学号&#xff1…

C语言学生成绩管理系统详解

文章目录 一、系统概述二、数据类型三、自定义函数说明四、运行界面五、源代码 源代码请直接跳到最后 引言&#xff1a;最近写了C语言的大作业&#xff0c;感觉做得还行&#xff0c;记录一下&#xff0c;给后人一些参考&#xff0c;给自己留更深印象方便后续改进&#xff01; …

学生成绩管理系统 C语言

基础篇问题&#xff1a; 1.输出如下菜单&#xff1a; *********************学生成绩管理系统******************* * 1 成绩录入 2 成绩查询 3 计算平均分 * * 4 计算最高分 5 排名 6 退出 * ******************************…

C语言编程学生成绩管理系统

目录 一、介绍 二、功能 1.录入学生 2.删除学生信息 3.修改学生信息 4.查询学生信息 5.所有学生信息 6.成绩排序 7.退出程序 三、代码 1.主函数 2.头文件 3.函数封装库 一、介绍 利用C语言&#xff0c;运用链表、指针、封装函数等基本知识实现一个学生管理系统。通…

C语言学生成绩管理系统

制作学生成绩管理系统&#xff0c;可以实现以下功能&#xff1a; 每条记录包括&#xff1a;学号、姓名、专业和5门课程的成绩&#xff1b;能够实现添加、删除、修改功能&#xff1b;能够计算某学生的总分和平均分&#xff1b;能按照总分排序输出&#xff1b; 利用C语言的基本…

c语言成绩管理系统

关注微信公众号每日新觉&#xff0c;私聊作者获取提取密码点击下面链接&#xff0c;私聊作者获取提取密码。https://mp.weixin.qq.com/s/QgRQ3YB2JqCvNOGQHQ57rA 作者每日新觉&#xff0c;是一名热爱技术和编程的年轻程序员。他在计算机科学和软件工程领域有着广泛的研究和实践…