这是效果图

用c++写的,其实就是用了c++的输入输出,剩下全是C的内容

代码中有详解,很简单,欢迎借鉴和交流

#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include <conio.h>   //为了读取方向键
#include <iomanip>    //设置控制台填充字符等
using namespace std;
int score = 0;
int map[4][4];    //棋盘void showMap()    //显示棋盘
{cout << setw(46) << "2048 by DoubleCake" << endl;cout << setw(50) << " |-----------------------|" << endl;for (int i = 0; i <= 3; i++){cout << setw(24) << "";for (int j = 0; j <= 3; j++){if (map[i][j] == 0)cout << setw(2) << "|" << setw(4) << " ";elsecout << setw(2) << "|" << setw(4) << map[i][j];if (j == 3){cout << setw(2) << "|" << endl;cout << setw(50) << " |-----------------------|" << endl;}}}
}void randNum() //从随机位置产生数
{int m = rand() % 4;int n = rand() % 4;while (map[m][n]){m = rand() % 4;n = rand() % 4;}map[m][n] = 2;
}
void startGame() //开始游戏
{memset(map, 0, sizeof(map));randNum();showMap();
}
int moveUp()    //上移
{int i, j;int res = 0;//用来记录是否发生移动for (j = 0; j < 4; j++){//先补一次空位for (i = 1; i < 4; i++){if (map[i][j] && !map[i - 1][j]){map[i - 1][j] = map[i][j];map[i][j] = 0;//把空位补到底if (i > 1)i -= 2;res = 1;}}//从根部开始,相同的合并for (i = 1; i < 4; i++){if (map[i][j] && map[i][j] == map[i - 1][j]){map[i - 1][j] *= 2;score += map[i][j];map[i][j] = 0;res = 1;}}//再补一次空位for (i = 1; i < 4; i++){if (map[i][j] && !map[i - 1][j]){map[i - 1][j] = map[i][j];map[i][j] = 0;//把空位补到底if (i > 1)i -= 2;}}}return res;
}int moveDown() //下移
{int i, j;int res = 0;for (j = 0; j < 4; j++){for (i = 2; i >= 0; i--){if (map[i][j] && !map[i + 1][j]){map[i + 1][j] = map[i][j];map[i][j] = 0;if (i < 2)i += 2;res = 1;}}for (i = 2; i >= 0; i--){if (map[i][j] && map[i][j] == map[i + 1][j]){map[i + 1][j] *= 2;score += map[i][j];map[i][j] = 0;res = 1;}}for (i = 2; i >= 0; i--){if (map[i][j] && !map[i + 1][j]){map[i + 1][j] = map[i][j];map[i][j] = 0;if (i < 2)i += 2;}}}return res;
}int moveLeft()
{int i, j;int res = 0;for (i = 0; i < 4; i++){for (j = 1; j < 4; j++){if (map[i][j] && !map[i][j - 1]){map[i][j - 1] = map[i][j];map[i][j] = 0;if (j > 1)j -= 2;res = 1;}}for (j = 1; j < 4; j++){if (map[i][j] && map[i][j] == map[i][j - 1]){map[i][j - 1] *= 2;score += map[i][j];map[i][j] = 0;res = 1;}}for (j = 1; j < 4; j++){if (map[i][j] && !map[i][j - 1]){map[i][j - 1] = map[i][j];map[i][j] = 0;if (j > 1)j -= 2;}}}return res;
}int moveRight()
{int i, j;int res = 0;for (i = 0; i < 4; i++){for (j = 2; j >= 0; j--){if (map[i][j] && !map[i][j + 1]){map[i][j + 1] = map[i][j];map[i][j] = 0;if (j < 2)j += 2;res = 1;}}for (j = 2; j >= 0; j--){if (map[i][j] && map[i][j] == map[i][j + 1]){map[i][j + 1] *= 2;score += map[i][j];map[i][j] = 0;res = 1;}}for (j = 2; j >= 0; j--){if (map[i][j] && !map[i][j + 1]){map[i][j + 1] = map[i][j];map[i][j] = 0;if (j < 2)j += 2;}}}return res;
}int maxNum()  //棋盘最大数
{int max = map[0][0];for (int i = 0; i <= 3; i++)for (int j = 0; j <= 3; j++)if (map[i][j]>max)max = map[i][j];return max;
}
int Win()    //判断是否胜利
{int flag = 0;if (maxNum() == 2048){cout << setw(45) << "You Win!" << endl;flag = 1;}return flag;
}
int GameOver()       //判断是否游戏结束
{int flag = 1;int i, j;//如果有空位就可以继续for (i = 0; i < 4; i++)for (j = 0; j < 4; j++)if (!map[i][j])flag = 0;//如果没有空位但是有相邻相同的数也可以继续if (flag == 1){for (i = 0; i < 4; i++){for (j = 0; j < 4; j++){if (i != 0 && map[i][j] == map[i - 1][j])flag = 0;if (i != 3 && map[i][j] == map[i + 1][j])flag = 0;if (j != 0 && map[i][j] == map[i][j - 1])flag = 0;if (j != 3 && map[i][j] == map[i][j + 1])flag = 0;}}}if (flag == 1)cout << setw(43) << "Game Over!" << endl;return flag;
}
void keydown() //读取方向
{int ch = _getch();srand((unsigned)time(NULL));switch (ch){case 72:    // topif (moveUp()){randNum();system("cls");showMap();} break;case 75:     // leftif (moveLeft()){randNum();system("cls");showMap();} break;case 77:    // rightif (moveRight()){randNum();system("cls");showMap();} break;case 80:   // downif (moveDown()){randNum();system("cls");showMap();} break;default:break;}
}
int main() //主函数
{system("color f9");int makesure = 1;    //游戏结束后是否继续游戏while (makesure){system("cls");startGame();while (Win() + GameOver() == 0){keydown();}cout << setw(43) << "你的最后成绩为:" << score << endl;cout << setw(60) << "若要重新开始游戏请输入1,若要结束请输入0。" << endl;cin >> makesure;while (makesure != 1 && makesure != 0){cout << "输入不正确,请重新输入!" << endl;cin >> makesure;}}cout << "再见!" << endl;system("pause");return 0;
}

2048 控制台版(c实现)相关推荐

  1. 2048网页版游戏高分插件代码分享

    2048网页版是一款开源游戏:Gabriele Cirulli. 在线游戏地址:https://2048game.com/ 本人的历史成绩: 于是范总提出了质疑: 下面我给大家公布一下,在2048游戏 ...

  2. Android开发之2048安卓版

    之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...

  3. linux控制台单人五子棋简书,Java控制台版五子棋的简单实现方法

    这篇文章主要给大家介绍了关于Java控制台版五子棋的简单实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 设计一个10*1 ...

  4. python红包游戏_脑力2048红包版

    脑力2048红包版是一款最新推出的非常好玩的手机2048闯关赢红包小游戏,在脑力2048红包版游戏中玩家可以通过2048的玩法来进行闯关,游戏玩法非常的简单有趣,成功通过关卡就有机会获得现金红包,感兴 ...

  5. 金山打字游戏c语言代码,一天练习一个小C/C++程序(一) 控制台版“金山打字”游戏...

    今天练习了一个C语言小程序,控制台版的简易"金山打字"小游戏. 效果图: 代码: #include #include #include #include void printfSp ...

  6. 简易五子棋游戏(控制台版)

    目录 1. 需求分析 2. 游戏设计 2.1 游戏功能结构 2.2 游戏业务流程 3. 代码 4. 打包为可执行文件 5. 总结 五子棋是中国古代的传统黑白棋种之一.五子棋不仅能增强思维能力,提高智力 ...

  7. C++ 2D我的世界![控制台版]

    C++ 2D我的世界![控制台版] 源码地址:点击查看 https://paste.ubuntu.com/p/tWdDxKfWvP/ 作者:Evan_song 大大 http://openjudge. ...

  8. 2048经典版震撼来袭,多种游戏模式,三种布局,来迎接挑战吧!

    2048经典版震撼来袭,多种游戏模式,三种布局(3*3.4*4.5*5),两种风格(厚重.灵巧),来迎接挑战吧! appstore下载地址:https://itunes.apple.com/cn/ap ...

  9. 简易扫雷游戏c语言程序,C++实现简单的扫雷游戏(控制台版)

    C++新手的代码,请各位多包涵. 用C++写的一个简单的控制台版扫雷游戏.玩家通过输入方块的坐标来翻开方块. 只是一个雏形,能够让玩家执行翻开方块的操作并且判断输赢,还未添加标记方块.游戏菜单.记录游 ...

最新文章

  1. 不要一辈子靠技术生存
  2. yii2 postman 文件上传
  3. 每日一皮:年轻时的你,是不是也各种重构欲望?
  4. DEDECMS 安全优化
  5. python---可执行文件的转换
  6. 问号和点运算符是什么? 在C#6.0中意味着什么?
  7. Security+ 学习笔记33 主机安全
  8. 利用 LSTM 神经网络预测股价走势
  9. 天津天狮学院关于2021年天狮专升本新生入学缴费有关事项的通知
  10. TCP三次握手(详解)
  11. bubbles html5游戏源码,html5 canvas弹性气泡爆破 | 撒花动画
  12. java 怎么让图片运动,小编给你传授java怎么实现键盘控制图片移动
  13. 及时尽孝,别枉读了大学
  14. 基于Modelsim的verilog语言设计AES加密解密(硬件电路HDL)
  15. fsck的介绍和应用
  16. 【STM32F429开发板用户手册】第18章 STM32F429的GPIO应用之跑马灯
  17. 中小网站如何使用谷歌Adsence国际化优势赚钱?
  18. Solar2DCorona(一) - Hello World
  19. 【Java进阶营】月薪10000+,一天的工作量只改5行代码,我也要当程序员
  20. 记录:element UI table 表格 固定列单元格上下错位

热门文章

  1. MySql按每日、每周、每月分组统计数据
  2. python写入csv 用Excel打开乱码的解决方法
  3. python怎么设置画布大小_在Matplotlib中设置绘图画布的大小
  4. 剪花布条(字符串,C++)
  5. 高德地图中加载three.js(vue中)(封装
  6. 什么样的MES系统才是好系统
  7. 如何使用pgrep匹配
  8. Shiro 未登录或登录失效,定义返回JSON格式数据
  9. Linux学习之路--基础命令(4)
  10. MySQL数据库之索引