2048 控制台版

这是效果图

用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) << " ";
			else
				cout << 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:	// top
			if (moveUp()){
				randNum();
				system("cls");
				showMap();
			}
			break;
		case 75:	 // left
			if (moveLeft()){
				randNum();
				system("cls");
				showMap();
			}
			break;
		case 77:	// right
			if (moveRight()){
				randNum();
				system("cls");
				showMap();
			}
			break;
		case 80:	// down
			if (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;
}
时间: 2024-10-22 16:08:00

2048 控制台版的相关文章

Windows控制台版2048

上一篇说了Linux控制台版的2048,这次是对代码进行简单修改后的Windows版2048. 运行效果如下: 与Linux版本相比,核心代码没有改动,只是改变终端颜色函数的部分做了调整. 不过,在Windows下,使用VS2013 Express,与GCC有所不同,所以做了一些处理,并对原有代码做了整理,使之No Warning.代码同样放在在Github,可以点这里查看. 

C++实现简单的扫雷游戏(控制台版)

C++新手的代码,请各位多包涵. 用C++写的一个简单的控制台版扫雷游戏.玩家通过输入方块的坐标来翻开方块. 只是一个雏形,能够让玩家执行翻开方块的操作并且判断输赢,还未添加标记方块.游戏菜单.记录游戏时间.重新开一局等等的功能. 玩家输入坐标的方式来翻开方块只适用于小型的“雷区”,若“雷区”大了,用坐标会变得很不方便. 代码片段扫雷V1.1 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

2048电脑版

2048 PC版 开发环境:VS2012 + WIN8-x64 框架:MFC,主要GDI绘图 时间:1天 缺点:部分代码冗余,不知如何合并简化-- 源码及可执行程序 下载链接 http://download.csdn.net/detail/npu_wy/7369611 不足之处,多多指教! 2048电脑版

c/c++ 贪吃蛇控制台版

贪吃蛇控制台版(操作系统win7 64位:编译环境gcc, vs2017通过,其它环境未测试 不保证一定通过) 运行效果: #include <iomanip> #include <windows.h> #include <conio.h> using namespace std; HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//全局句柄 class snake; void Init_Console();//控制台初始化

初识C语言控制台版万年历

任务:使用C完成控制台版万年历 从控制台输入年份和月份,然后显示该月日历. 使用分支和循环结构完成. 提示: 1.1900年1月1日是星期一 2.计算输入的月份的1月1日距离1900年1月1日有多少天 3.输入月份的1月1日是星期几 = 得到的总天数 % 7 4.然后根据下图可以看出,该月的1号是星期几,我们在控制台上,就需要在前面打印几个\t控制符,比如2016年10月1日是星期六,那么前面我们就需要六个\t来制造空格空出来. 具体的实现步骤如下: 1.接收控制台输入的年份和月份 2 . 计算

C++ 控制台版 2048小游戏

先说说2048游戏的规则: 开始的时候空格中会出现两个数字(只能为2或者4),用户可以选择上下左右键进行移动,数字们整体沿着方向移动,中间不存在空格,如果相邻的两个数字相等,那么合并至沿着方向的后一个,更新最大值,总分数加上新出现的数字.当出现2048,Win.或者没有空格了,Lose. 基本就是一个按照思路的模拟题,没有什么难度.不过我想写一个自动求解的程序,但是bfs搜索的话解空间太庞大,没有想到好的方法,有路过的牛人还请指点. //2048 by Tach #include<iostrea

C++实现控制台版2048

前言 之前做过一个JavaScript版本的2048游戏,最近在学习C++,昨天晚上突然心血来潮,想用C++来实现,因为核心算法已十分理解,所以两个小时撸出来一个C++的简易版本. 简介 二维数组遍历,C++基本数据类型,string类,控制结构,函数. 本方法不涉及指针以及面向对象思想,所以可作为刚入门C++的新人的第一个小project. 效果图 实现思路 1.背景 游戏的背景即一个4*4的二维数组,通过每次运动中二维数组中值的变化以及数字的位置的变化,完成该游戏. 2.随机数字及位置 游戏

假期休闲,来发贪吃蛇!(Win32控制台版)

假期无事,整理电脑文件的时候发现了以前大二时做的坦克小游戏,心血来潮,决定再来一发贪吃蛇. 游戏玩法不必多说,主要是算法实现和绘制过程. 首先,利用一个二维数组 mp[][] 来存储地图信息,其中的值表示: 0:空 1:被蛇覆盖 2:食物 有了这个地图数组,生成随机食物的时候就可以避免生成到蛇身上. 那蛇的身体如何存储呢?也很简单,用队列(存储每一个小格的坐标信息). 队列的头尾方向与蛇的头尾方向正好相反. 蛇每走一步,在蛇头方向的下一位置画一个小方格,同时把该位置放置到队列尾端.取出队列第一个

2048网页版源代码

<!DOCTYPE html> <html> <head> <title>2048</title> <meta charset="utf-8"/> <style> #gridPanel{ width:480px; height:480px; margin:0 auto; background-color:#bbada0; border-radius:10px; position:relative; }