广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >怎么用C语言完整实现2048游戏
  • 415
分享到

怎么用C语言完整实现2048游戏

2023-06-25 16:06:36 415人浏览 安东尼
摘要

这篇文章主要介绍怎么用C语言完整实现2048游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、游戏思路程序开始时出现菜单,让玩家选择开始游戏或者退出游戏。玩家选择开始游戏后,出现棋盘,通过方向键选择移动的方向。移

这篇文章主要介绍怎么用C语言完整实现2048游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

    一、游戏思路

    程序开始时出现菜单,让玩家选择开始游戏或者退出游戏。

    玩家选择开始游戏后,出现棋盘,通过方向键选择移动的方向。

    移动后会将所有方块向该方向移动直至补全空格,同样数字的方块合并成它们的和,还会生成一个随机位置的2或4。

    当出现“2048”时,游戏胜利;当棋盘满且无法消除时,游戏失败。

    二、游戏框架

    1.菜单界面

    菜单

    void menu(){printf("**************************\n");printf("*****按 1 开 始 游 戏*****\n");printf("*****按 0 退 出 游 戏*****\n");printf("**************************\n");}

    菜单的选择

    int main(){int input = 0;do{menu();printf("请选择:");scanf("%d", &input);switch (input){case 1:game2048(); break;case 0:printf("退出游戏,客官常来玩呀~)\n");break;default:printf("给你一次重新选择的机会\n");break;}} while (input);return 0;}

    实际效果

    怎么用C语言完整实现2048游戏

    菜单我觉得还是挺顺眼的,就是有点丑,毕竟是初学者就不要要求太高了。

    2.游戏主体

    1.初始化界面:

    生成一个4行4列的数组(此处的行数和列数已在头文件中用#define宏定义)。

    并且打印出来。

    void DisplayBoard(int board[ROW][COL],int row, int col){    int i = 0;    int j = 0;    for (int j = 0; j < COL; j++)        printf("+-----");    printf("+\n");    for (int i = 0; i < ROW; i++)    {        for (int j= 0; j < COL; j++)        {            printf("|");            if (board[i][j]!=0)                printf("%5d", board[i][j]);             else                printf("     ");         }        printf("|\n");        for (int j = 0; j < COL; j++)        {            printf("+-----");        }        printf("+\n");    }    }

    效果如下:

    怎么用C语言完整实现2048游戏

    方吗?方就对了,方就是个好界面!

    2.随机生成初始数字

    游戏的界面我们现在已经有了,接下来要做的就是加入两个随机位置的”2"。

    void get_num(int board[ROW][COL]){int x, y;x = rand() % ROW;y = rand() % COL;board[x][y] = 2;//一开始随机的数为2x = rand() % ROW;y = rand() % COL;while (board[x][y] == 2)     {x = rand() % ROW;y = rand() % COL;}board[x][y] = 2;    system("cls"); //清屏,美观界面return;}

    (这里照例还是使用了时间戳获取随机数的方法)

    怎么用C语言完整实现2048游戏

    怎么用C语言完整实现2048游戏

    可以看到每一次出现的两个位置都是随机的。

    3.实现移动

    这里我们以向上为例,我们要实现移动,以及判定两个方块数字相同就合并成为它们的和,并且当合并后存在空格时继续向上移动。

    简单来说,就是 移动 → 合并 → 再次移动补空。其他三个方向也是一样的道理,只需要改变其中的数值便可实现。

    void up(int board[ROW][COL]){int i = 0; int j = 0;int x = 0;int y = 0;for (i = 0; i < ROW; i++){//移动j = 0;y = 0;while (j < COL-1 && y < COL-1 ){if (board[j][i] == 0) {for (x = j; x < ROW-1; x++)board[x][i] = board[x + 1][i];board[ROW-1][i] = 0;y++;}elsej++; }//合并for (j = 0; j < COL-1; j++)if (board[j][i] == board[j + 1][i] && board[j][i] != 0) { board[j][i] = board[j][i] * 2; //和board[j + 1][i] = 0;}//再次移动补空j = 0;y = 0;while (j < COL - 1 && y < COL - 1){if (board[j][i] == 0)  {for (x = j; x < ROW - 1; x++)board[x][i] = board[x + 1][i];board[ROW - 1][i] = 0;y++;}elsej++;}}}
    4.增加新数字

    每次移动会在随机位置出现一个新的数字,可能是2,可能是4。

    通过查询网上资料得知,随机到2的概率约为 9/10,随机到4的概率约为 1/10。

    void put_num(int board[ROW][COL]){int x = 0;int y = 0; int z = 0;x = rand() % ROW;y = rand() % COL;while (board[x][y] !=0){x = rand() % ROW;y = rand() % COL;}z = rand() % 10; if (z<9)board[x][y] = 2;elseboard[x][y] = 4;return;}
    5.判定胜负

    当出现2048时胜利,当格子满了且无法消除时失败。

    int is_fail(int board[ROW][COL]){int i = 0; int j = 0;for (i = 0; i < ROW; i++){for (j = 0; j < COL; j++){if (board[i][j] == 0)return 0;if (i > 0){if (board[i - 1][j] == board[i][j])return 0;}if (j > 0){if (board[i][j - 1] == board[i][j])return 0;}}}return 1;} int is_win(int board[ROW][COL]){int i = 0;int j = 0;int num = 0;for (i = 0; i < ROW; i++)for (j = 0; j < COL; j++){if (board[i][j] > num)num = board[i][j];}if (num >= 2048)return 1;elsereturn 0;}
    6.游戏函数

    将上述代码结合起来

    void game2048(){int board[ROW][COL] = { {0} };int control = 0;DisplayBoard(board); init_num(board);system("cls"); //清屏,美观界面DisplayBoard(board);while ((control = _getch()) != 0x1b){ switch (control){case 0xe0:switch (control = getch()){    case 72:     up(board);    break;    case 80:     down(board);    break;    case 75:     left(board);    break;    case 77:      right(board);    break;    default:    break;}system("cls");DisplayBoard(board);if (is_win(board) == 1){printf("恭喜你赢了!");    }if (is_fail(board) == 1){printf("哈哈哈哈哈哈哈好菜\n");}}}}

    三、游戏运行

    已知目前游戏存在bug,当格子满了的时候假定一个方向可以消除,另一个方向不可以消除,按了那个不可以消除的方向的话,就会无法操作了,鉴于本人目前初学者并未能够想到很好的解决方法。若有大佬有好的方法也可指点一下。

    我太菜了玩了好久都玩不到2048,最高只有512,1024还是舍友打出来的。

    怎么用C语言完整实现2048游戏

    更新:修复了bug

    先判断数组是否相同再选择是否添加新的随机位置的数字。

    在此感谢各位帮助我测试的朋友,无论成功与否,当然特别感谢提供了这张图片的朋友。

    怎么用C语言完整实现2048游戏

    四、所有代码

    game2048.h

    #pragma once #include <stdio.h>#include <time.h>#include <stdlib.h>#include <windows.h>#include<coNIO.h> #define ROW 4#define COL 4const int copy[ROW][COL]; //初始化并打印游戏界面void DisplayBoard(int board[ROW][COL]);//开局随机生成两个2void init_num(int board[ROW][COL]);//在移动后随机放置数字2或4void put_num(int board[ROW][COL]);//移动void up(int board[ROW][COL]);void down(int board[ROW][COL]);void left(int board[ROW][COL]);void right(int board[ROW][COL]);//判定胜负int is_win(int board[ROW][COL]);int is_fail(int board[ROW][COL]);

    game2048.c

    #define _CRT_SECURE_NO_WARNINGS 1#include "game2048.h" void DisplayBoard(int board[ROW][COL]){    int i = 0;    int j = 0;    printf("tip:*方向键控制方块移动*ESC键返回菜单*\n");    for (int j = 0; j < COL; j++)        printf("+-----");    printf("+\n");    for (int i = 0; i < ROW; i++)    {        for (int j= 0; j < COL; j++)        {            printf("|");            if (board[i][j]!=0)                printf("%5d", board[i][j]);             else                printf("     ");        }        printf("|\n");        for (int j = 0; j < COL; j++)        {            printf("+-----");        }        printf("+\n");    }    } void init_num(int board[ROW][COL]){int x, y;x = rand() % ROW;y = rand() % COL;board[x][y] = 2;//随机在一个位置生成2x = rand() % ROW;y = rand() % COL;while (board[x][y] == 2)     {x = rand() % ROW;y = rand() % COL;}board[x][y] = 2; return;} void put_num(int board[ROW][COL]){int x = 0;int y = 0; int z = 0;x = rand() % ROW;y = rand() % COL;while (board[x][y] !=0){x = rand() % ROW;y = rand() % COL;}z = rand() % 10;if (z<9)board[x][y] = 2;elseboard[x][y] = 4;return;}void up(int board[ROW][COL]){int i = 0; int j = 0;int x = 0;int y = 0;for (i = 0; i < ROW; i++){//移动j = 0;y = 0;while (j < COL-1 && y < COL-1 ){if (board[j][i] == 0) {for (x = j; x < ROW-1; x++)board[x][i] = board[x + 1][i];board[ROW-1][i] = 0;y++;}elsej++; }//合并for (j = 0; j < COL-1; j++)if (board[j][i] == board[j + 1][i] && board[j][i] != 0) { board[j][i] = board[j][i] * 2;board[j + 1][i] = 0;}//再次移动补空j = 0;y = 0;while (j < COL - 1 && y < COL - 1){if (board[j][i] == 0){for (x = j; x < ROW - 1; x++)board[x][i] = board[x + 1][i];board[ROW - 1][i] = 0;y++;}elsej++;}}if (contrast(board) == 0)put_num(board);elsereturn;} void down(int board[ROW][COL]){int i = 0;int j = 0;int x = 0;int y = 0;for (i = 0; i < ROW; i++){j = COL-1;y = 0;while (j > 0 && y < COL-1){if (board[j][i] == 0){for (x = j; x > 0; x--)board[x][i] = board[x - 1][i];board[0][i] = 0;y++;}else j--;}for (j = COL-1; j > 0; j--)if (board[j][i] == board[j - 1][i] && board[j][i] != 0){board[j][i] = board[j][i] * 2;board[j - 1][i] = 0;}j = COL - 1;y = 0;while (j > 0 && y < COL - 1){if (board[j][i] == 0){for (x = j; x > 0; x--)board[x][i] = board[x - 1][i];board[0][i] = 0;y++;}elsej--;}}if (contrast(board) == 0)put_num(board);elsereturn;}void left(int board[ROW][COL]){int i = 0;int j = 0;int x = 0;int y = 0;for (i = 0; i < ROW; i++){j = 0; y = 0;while (j < 3 && y < 3 ){if (board[i][j] == 0){for (x = j; x < ROW-1; x++)board[i][x] = board[i][x + 1];board[i][COL-1] = 0;y++;}elsej++;}for (j = 0; j < 3; j++)if (board[i][j] == board[i][j + 1] && board[i][j] != 0){board[i][j] = board[i][j] * 2;board[i][j + 1] = 0;}j = 0; y = 0;while (j < 3 && y < 3){if (board[i][j] == 0){for (x = j; x < ROW - 1; x++)board[i][x] = board[i][x + 1];board[i][COL - 1] = 0;y++;}elsej++;}}if (contrast(board) == 0)put_num(board);elsereturn;} void right(int board[ROW][COL]){int i = 0;int j = 0;int x = 0;int y = 0;for (i = 0; i < 4; i++){j = COL-1;y = 0;while (j>0 && y < COL-1){if (board[i][j] == 0){for (x = j; x > 0; x--)board[i][x] = board[i][x - 1];board[i][0] = 0;y++;}else j--;}for (j = 3; j > 0; j--)if (board[i][j] == board[i][j - 1] && board[i][j] != 0){board[i][j] = board[i][j] * 2;board[i][j - 1] = 0;}j = COL - 1;y = 0;while (j > 0 && y < COL - 1){if (board[i][j] == 0){for (x = j; x > 0; x--)board[i][x] = board[i][x - 1];board[i][0] = 0;y++;}else j--;}}if (contrast(board) == 0)put_num(board);elsereturn;} int is_fail(int board[ROW][COL]){int i = 0; int j = 0;for (i = 0; i < ROW; i++){for (j = 0; j < COL; j++){if (board[i][j] == 0)return 0;if (i > 0){if (board[i - 1][j] == board[i][j])return 0;}if (j > 0){if (board[i][j - 1] == board[i][j])return 0;}}}return 1;} int is_win(int board[ROW][COL]){int i = 0;int j = 0;int num = 0;for (i = 0; i < ROW; i++)for (j = 0; j < COL; j++){if (board[i][j] > num)num = board[i][j];}if (num >= 2048)return 1;elsereturn 0;} void copyboard(int board[ROW][COL],int copy[ROW][COL]){int i = 0;int j = 0;for (i = 0; i < ROW; i++)for (j = 0; j < COL; j++)copy[i][j] = board[i][j];} int contrast(int board[ROW][COL]){int i = 0;int j = 0;for (i = 0; i < 4; i++)for (j = 0; j < 4; j++)if (copy[i][j] != board[i][j])return 0;return 1;}

    test.c

    #define _CRT_SECURE_NO_WARNINGS 1#include "game2048.h"  void menu(){printf("**************************\n");printf("*****按 1 开 始 游 戏*****\n");printf("*****按 0 退 出 游 戏*****\n");printf("**************************\n");} void game2048(){int board[ROW][COL] = { {0} };int control = 0;DisplayBoard(board); init_num(board);system("cls"); //清屏,美观界面DisplayBoard(board);while ((control = _getch()) != 0x1b){ switch (control){case 0xe0:switch (control = getch()){    case 72: copyboard(board, copy);    up(board);    break;    case 80: copyboard(board, copy);    down(board);    break;    case 75: copyboard(board, copy);    left(board);    break;    case 77:  copyboard(board, copy);    right(board);    break;    default:    break;}system("cls");DisplayBoard(board);if (is_win(board) == 1){printf("恭喜你赢了!\n");}if (is_fail(board) == 1){printf("哈哈哈哈哈哈哈好菜\n");}}}} int main(){int input = 0;srand((unsigned int)time(NULL));do{menu();    printf("请选择:");    scanf("%d", &input);switch (input){    case 1:    game2048();     break;    case 0:    printf("退出游戏,客官常来玩呀~)\n");    break;    default:    printf("给你一次重新选择的机会\n");    break;}} while (input);return 0;}

    以上是“怎么用C语言完整实现2048游戏”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网其他教程频道!

    --结束END--

    本文标题: 怎么用C语言完整实现2048游戏

    本文链接: https://www.lsjlt.com/news/306042.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 怎么用C语言完整实现2048游戏
      这篇文章主要介绍怎么用C语言完整实现2048游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、游戏思路程序开始时出现菜单,让玩家选择开始游戏或者退出游戏。玩家选择开始游戏后,出现棋盘,通过方向键选择移动的方向。移...
      99+
      2023-06-25
    • 用C语言完整实现2048游戏
      目录前言一、游戏思路二、游戏框架 1.菜单界面2.游戏主体1.初始化界面:2.随机生成初始数字3.实现移动4.增加新数字5.判定胜负6.游戏函数三、游戏运行四、所有代码总结 前言 游...
      99+
      2022-11-12
    • 怎么用C语言实现2048游戏
      本篇内容主要讲解“怎么用C语言实现2048游戏”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用C语言实现2048游戏”吧!本文实例为大家分享了用C语言实现2048游戏的具体代码,供大家参考,...
      99+
      2023-06-20
    • 用C语言实现2048游戏
      本文实例为大家分享了用C语言实现2048游戏的具体代码,供大家参考,具体内容如下 我遇到的几个问题: 问题1:如何显示? system("clear");//清屏 每次发生变化就清屏...
      99+
      2022-11-12
    • 基于C语言实现2048游戏
      本文实例为大家分享了C语言实现2048游戏的具体代码,供大家参考,具体内容如下 #include <stdio.h> #include <stdlib.h>...
      99+
      2022-11-12
    • R语言如何实现2048游戏
      小编给大家分享一下R语言如何实现2048游戏,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!2048 是一款益智游戏,只需要用方向键让两两相同的数字碰撞就会诞生一个...
      99+
      2023-06-14
    • C语言实现三子棋游戏含完整代码
      目录一、text.c源文件部分1、main函数部分2、game函数部分二、game.h头文件部分三、game.c源文件部分运行 三子棋是大家小时候和同桌在纸上都玩过的简单小游戏,这个...
      99+
      2022-11-12
    • C语言实现飞机大战小游戏完整代码
       大一课设做的飞机大战,可以进行登入和注册,这个是利用单链表做的,源代码已经给出,这个是最基本的飞机大战模式,我设置了几个功能,比如排行榜之类的。排行榜是用结构体数组做的,...
      99+
      2022-11-13
    • C语言实现扫雷小游戏完整算法详解(附完整代码)
      目录前言1.算法基本思路2.算法详解1.初始化数组与打印数组2.设置雷3.排查与标记4.CountMine函数计算周围雷的个数 5.ExpandMine函数递归展开周围所有...
      99+
      2022-11-13
    • java怎么实现2048游戏
      这篇文章主要介绍java怎么实现2048游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文实例讲述了java实现的2048游戏。分享给大家供大家参考,具体如下:先来看看运行效果:具体代码如下:package&nb...
      99+
      2023-05-30
    • 分别用python和go语言来实现的风靡一时的2048 游戏,包含完整代码
      目录 1、Python实现2、Go实现 2048 游戏实现主要包括以下几个步骤: 创建一个棋盘,通常使用二维列表表示。实现棋子的移动规则,左移、右移、上移、下移。判断游戏是否结束,即棋盘...
      99+
      2023-08-30
      python golang 游戏
    • 怎么用Python实现2048小游戏
      这篇文章主要介绍怎么用Python实现2048小游戏,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、开发环境Python版本:3.6.4相关模块:pygame模块;以及一些Python自带的模块。二、环境搭建安装P...
      99+
      2023-06-15
    • C语言怎么实现数独游戏
      本文小编为大家详细介绍“C语言怎么实现数独游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言怎么实现数独游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。目标写一个数独游戏,有以下功能:能随机产生题目并给...
      99+
      2023-06-29
    • C语言怎么实现飞机游戏
      这篇“C语言怎么实现飞机游戏”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C语言怎么实现飞机游戏”文章吧。scanf 控制飞...
      99+
      2023-06-30
    • 怎么用C语言实现五子棋游戏
      这篇文章主要介绍“怎么用C语言实现五子棋游戏”,在日常操作中,相信很多人在怎么用C语言实现五子棋游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C语言实现五子棋游戏”的疑惑有所帮助!接下来,请跟着小编...
      99+
      2023-06-20
    • 怎么用c语言实现三子棋游戏
      这篇文章给大家分享的是有关怎么用c语言实现三子棋游戏的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方式编译、...
      99+
      2023-06-14
    • 怎么用C语言实现扫雷小游戏
      这篇文章主要讲解了“怎么用C语言实现扫雷小游戏”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用C语言实现扫雷小游戏”吧!具体内容如下经典扫雷游戏规则:当玩家点击游戏区域,该处周围的八个位...
      99+
      2023-06-25
    • C语言 完整游戏项目推箱子详细代码
      话不多说 我们今天就来创造出属于我们自己的《推箱子》,GOGOGO!!! 直接开始吧 首先是我们用二维数组特定的数字描绘出这个地图 int cas = 0; int map[3...
      99+
      2022-11-12
    • C语言怎么实现扫雷小游戏
      本篇内容介绍了“C语言怎么实现扫雷小游戏”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!本文实例为大家分享了C语言实现扫雷小游戏的具体代码,供...
      99+
      2023-06-20
    • C语言怎么实现打砖块游戏
      这篇文章主要介绍“C语言怎么实现打砖块游戏”,在日常操作中,相信很多人在C语言怎么实现打砖块游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言怎么实现打砖块游戏”的疑惑有所帮助!接下来,请跟着小编一起来...
      99+
      2023-06-30
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作