2048 控制台版(c实现)
这是效果图
用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实现)相关推荐
- 2048网页版游戏高分插件代码分享
2048网页版是一款开源游戏:Gabriele Cirulli. 在线游戏地址:https://2048game.com/ 本人的历史成绩: 于是范总提出了质疑: 下面我给大家公布一下,在2048游戏 ...
- Android开发之2048安卓版
之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...
- linux控制台单人五子棋简书,Java控制台版五子棋的简单实现方法
这篇文章主要给大家介绍了关于Java控制台版五子棋的简单实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 设计一个10*1 ...
- python红包游戏_脑力2048红包版
脑力2048红包版是一款最新推出的非常好玩的手机2048闯关赢红包小游戏,在脑力2048红包版游戏中玩家可以通过2048的玩法来进行闯关,游戏玩法非常的简单有趣,成功通过关卡就有机会获得现金红包,感兴 ...
- 金山打字游戏c语言代码,一天练习一个小C/C++程序(一) 控制台版“金山打字”游戏...
今天练习了一个C语言小程序,控制台版的简易"金山打字"小游戏. 效果图: 代码: #include #include #include #include void printfSp ...
- 简易五子棋游戏(控制台版)
目录 1. 需求分析 2. 游戏设计 2.1 游戏功能结构 2.2 游戏业务流程 3. 代码 4. 打包为可执行文件 5. 总结 五子棋是中国古代的传统黑白棋种之一.五子棋不仅能增强思维能力,提高智力 ...
- C++ 2D我的世界![控制台版]
C++ 2D我的世界![控制台版] 源码地址:点击查看 https://paste.ubuntu.com/p/tWdDxKfWvP/ 作者:Evan_song 大大 http://openjudge. ...
- 2048经典版震撼来袭,多种游戏模式,三种布局,来迎接挑战吧!
2048经典版震撼来袭,多种游戏模式,三种布局(3*3.4*4.5*5),两种风格(厚重.灵巧),来迎接挑战吧! appstore下载地址:https://itunes.apple.com/cn/ap ...
- 简易扫雷游戏c语言程序,C++实现简单的扫雷游戏(控制台版)
C++新手的代码,请各位多包涵. 用C++写的一个简单的控制台版扫雷游戏.玩家通过输入方块的坐标来翻开方块. 只是一个雏形,能够让玩家执行翻开方块的操作并且判断输赢,还未添加标记方块.游戏菜单.记录游 ...
最新文章
- 不要一辈子靠技术生存
- yii2 postman 文件上传
- 每日一皮:年轻时的你,是不是也各种重构欲望?
- DEDECMS 安全优化
- python---可执行文件的转换
- 问号和点运算符是什么? 在C#6.0中意味着什么?
- Security+ 学习笔记33 主机安全
- 利用 LSTM 神经网络预测股价走势
- 天津天狮学院关于2021年天狮专升本新生入学缴费有关事项的通知
- TCP三次握手(详解)
- bubbles html5游戏源码,html5 canvas弹性气泡爆破 | 撒花动画
- java 怎么让图片运动,小编给你传授java怎么实现键盘控制图片移动
- 及时尽孝,别枉读了大学
- 基于Modelsim的verilog语言设计AES加密解密(硬件电路HDL)
- fsck的介绍和应用
- 【STM32F429开发板用户手册】第18章 STM32F429的GPIO应用之跑马灯
- 中小网站如何使用谷歌Adsence国际化优势赚钱?
- Solar2DCorona(一) - Hello World
- 【Java进阶营】月薪10000+,一天的工作量只改5行代码,我也要当程序员
- 记录:element UI table 表格 固定列单元格上下错位