空闲时间用C语言写了下2048游戏

本身这个游戏逻辑挺简单的,所以,不多说了,直接上代码吧

#include <climits>
#include <cstdio>
#include <cstring>
#include <stack>
#include <string>
#include <map>
#include <vector>
#include <cmath>

using namespace std;

const int MAXX = 10;

int box[MAXX][MAXX];

void moveLeft(int n, bool &ret){
	for (int i = 0; i < n; ++i){
		for (int j = 0; j < n; ++j){
			int k;
			for (k = j - 1; k >= 0; --k){
				if (box[i][k] != -1){
					break;
				}
			}
			box[i][k + 1] = box[i][j];

			if ((k + 1) != j){
				box[i][j] = -1;
				ret = true;
			}
		}
	}
}

void mergeLeft(int n, bool &ret){
	for (int i = 0; i < n; ++i){
		for (int j = 0; j < n - 1; ++j){
			if (box[i][j] == -1)continue;

			if (box[i][j] == box[i][j + 1]){
				box[i][j] *= 2;
				box[i][j + 1] = -1;
				ret = true;
				++j;
			}
		}
	}
}

bool left(int n){
	bool ret = false;
	moveLeft(n, ret);
	mergeLeft(n, ret);
	moveLeft(n, ret);
	return ret;
}

void moveRight(int n, bool &ret){
	for (int i = 0; i < n; ++i){
		for (int j = n - 1; j >= 0; --j){
			if (box[i][j] == -1)continue;

			int k;
			for (k = j + 1; k < n; ++k){
				if (box[i][k] != -1){
					break;
				}
			}

			box[i][k - 1] = box[i][j];
			if ((k - 1) != j){
				box[i][j] = -1;
				ret = true;
			}
		}
	}
}

void mergeRight(int n, bool &ret){
	for (int i = 0; i < n; ++i){
		for (int j = n - 1; j >0; --j){
			if (box[i][j] == -1)continue;

			if (box[i][j] == box[i][j - 1]){
				box[i][j] *= 2;
				box[i][j - 1] = -1;
				ret = true;
				--j;
			}
		}
	}
}

bool right(int n){
	bool ret = false;
	moveRight(n, ret);
	mergeRight(n, ret);
	moveRight(n, ret);
	return ret;
}

void moveUp(int n, bool &ret){
	for (int j = 0; j < n; ++j){
		for (int i = 0; i < n; ++i){
			int k;
			for (k = i - 1; k >= 0; --k){
				if (box[k][j] != -1){
					break;
				}
			}
			box[k + 1][j] = box[i][j];

			if ((k + 1) != i){
				box[i][j] = -1;
				ret = true;
			}
		}
	}
}

void mergeUp(int n, bool &ret){
	for (int j = 0; j < n; ++j){
		for (int i = 0; i < n - 1; ++i){
			if (box[i][j] == -1)continue;

			if (box[i][j] == box[i + 1][j]){
				box[i][j] *= 2;
				box[i + 1][j] = -1;
				ret = true;
				++i;
			}
		}
	}
}

bool up(int n){
	bool ret = false;
	moveUp(n, ret);
	mergeUp(n, ret);
	moveUp(n, ret);
	return ret;
}

void moveDown(int n, bool &ret){
	for (int j = 0; j < n; ++j){
		for (int i = n - 1; i >= 0; --i){
			if (box[i][j] == -1)continue;

			int k;
			for (k = i + 1; k < n; ++k){
				if (box[k][j] != -1)break;
			}

			box[k - 1][j] = box[i][j];

			if ((k - 1) != i){
				box[i][j] = -1;
				ret = true;
			}
		}
	}
}

void mergeDown(int n, bool &ret){
	for (int j = 0; j < n; ++j){
		for (int i = n - 1; i > 0; --i){
			if (box[i][j] == -1)continue;

			if (box[i][j] == box[i - 1][j]){
				box[i][j] *= 2;
				box[i - 1][j] = -1;
				ret = true;
				--i;
			}
		}
	}
}

bool down(int n){
	bool ret = false;
	moveDown(n, ret);
	mergeDown(n, ret);
	moveDown(n, ret);
	return ret;
}

void line(int n){
	for (int i = 0; i < n; ++i){
		printf("--------");
	}
	printf("-");
	printf("\n");
}

void print(int n){
	for (int i = 0; i < n; ++i){
		line(n);
		for (int j = 0; j < n; ++j){
			printf("|");
			if (box[i][j] == -1){
				printf("\t");
				continue;
			}

			printf("%2d\t", box[i][j]);
		}
		printf("|");
		printf("\n");
	}
	line(n);
}

bool isFull(int n){
	bool mark = true;
	for (int i = 0; i < n; ++i){
		for (int j = 0; j < n; ++j){
			if (box[i][j] == -1){
				mark = false;
				return mark;
			}
		}
	}
	return mark;
}

bool isOver(int n){
	if (!isFull(n)){
		return false;
	}
	for (int i = 0; i < n; ++i){
		for (int j = 0; j < n; ++j){
			if (box[i][j] == box[i][j + 1] || box[i][j] == box[i + 1][j]){
				return false;
			}
		}
	}
	return true;
}

void fillBox(int n){
	int i, j, num;

	if (isFull(n)){
		return;
	}

	while (true){
		i = rand() % n;
		j = rand() % n;
		num = rand() % 2 == 0 ? 2 : 4;

		if (box[i][j] == -1){
			box[i][j] = num;
			break;
		}
	}
}

int main(){
	//freopen("in.txt", "r", stdin);
	memset(box, -1, sizeof(box));

	int n;
	bool mark;
	scanf("%d%*c", &n);

	fillBox(n);
	fillBox(n);
	print(n);

	while (true){
		char ch;
		scanf("%c%*c", &ch);
		if (ch == 'a'){
			mark = left(n);
		}
		else if (ch == 'd'){
			mark = right(n);
		}
		else if (ch == 'w'){
			mark = up(n);
		}
		else if (ch == 's'){
			mark = down(n);
		}
		else{
			continue;
		}
		system("cls");
		printf("Move:\n");
		print(n);
		if (!mark){
			continue;
		}
		fillBox(n);
		printf("Fill:\n");
		print(n);

		if (isOver(n)){
			printf("\n\nGame Over!\n\n");
			break;
		}
	}

	return 0;
}

只是玩了几局,没有很深度的找bug,所以可能会有bug。

空闲时间用C语言写了下2048游戏

时间: 2024-10-07 19:48:58

空闲时间用C语言写了下2048游戏的相关文章

js+css 写出 简单2048游戏

新手写的,可能不是很完善,欢迎修改及探讨 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>2048游戏</title> 6 <style> 7 .container{ 8 width: 600px; 9 height: 600px; 10 border: 2px solid

在windows下用C语言写socket通讯实例

原文:在windows下用C语言写socket通讯实例 From:Microsoft Dev Center #undef UNICODE #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <winsock2.h> #include <ws2tcpip.h> #include <stdlib.h> #include <stdio.h> // Need to link with Ws2

不好意思啊,我上周到今天不到10天时间,用纯C语言写了一个小站!想拍砖的就赶紧拿出来拍啊

花10天时间用C语言做了个小站 http://tieba.yunxunmi.com/index.html 简称: 云贴吧 不好意思啊.我上周到今天不到10天时间.用纯C语言写了一个小站!想拍砖的就赶紧拿出来拍啊 估计採集1000万贴,欢迎大家狠狠的来拍吧! 整站大小(网页+C ISAPI类库)不到1MB 容量大.速度快.不管什么贴,随便贴吧,就是量大.容量大.肚量大!

用C语言写解释器(一)——我们的目标

声明 为提高教学质量,我所在的学院正在筹划编写C语言教材.<用C语言写解释器>系列文章经整理后将收入书中"综合实验"一章.因此该系列的文章主要阅读对象定为刚学完C语言的学生(不要求有数据结构等其它知识),所以行文比較罗嗦,请勿见怪.本人水平有限,如有描写叙述不恰当或错误之处请指教!特此声明. 起因 近期,我们学院老师联系我,希望我能提供一段用 C 语言编写的 BASIC 解释器,用于 C 语言课程设计教学.我前段时间也正好着迷于"语言"本身,本就有打算写

只学一点点:我的技术学习策略(可以参考一下:寻找遁去的一,不用管别人怎么想;有学习的时间,不如自己写、自己实践,否则学完了都不知道是什么东西)

李敖有首诗叫<只爱一点点> : 不爱那么多, 只爱一点点: 别人的爱情像海深, 我的爱情浅. 不爱那么多, 只爱一点点: 别人的爱情像天长, 我的爱情短. 不爱那么多, 只爱一点点: 别人眉来又眼去, 我只偷看你一眼. 一点足够.在黄易的大唐双龙传中有个说法叫<遁去的一>,也就是说任何事情在纷杂万象之中都有一个消失的一,把这个消失的一找到,就可以事半功倍. 在学技术中,很多人纠结于掌握与精通.掌握是能够熟练的使用该技术实现自己的目标,而精通,则是对该技术的常用及半常用的场景都熟悉,

Go 语言简介(下)— 特性

希望你看到这篇文章的时候还是在公交车和地铁上正在上下班的时间,我希望我的这篇文章可以让你利用这段时间了解一门语言.当然,希望你不会因为看我的文章而错过站.呵呵. 如果你还不了解Go语言的语法,还请你移步先看一下上篇——<Go语言简介(上):语法> goroutine GoRoutine主要是使用go关键字来调用函数,你还可以使用匿名函数,如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 package main import "fmt" func

换一个视角看事务 - 用&quot;Java语言&quot;写&quot;作文&quot;

前段时间在抽工作之空余,更加系统和深入的重新学习Java的一些技术知识. 最近也试着申请了一个专栏,对前段时间的一些收获和知识点做一个系统性的归纳回顾和总结. 昨天也是刚刚写完了关于Java中的各种基础语言要素的总结,总觉得少了点什么. 对基础语言要素的理解和使用,实际上是很重要的. 俗话说,一切伟大的行动和思想,都源于一个微不足道的开始. 而对于一门语言来说,熟练的掌握对其基础语言要素的理解和使用,就是这个"微不足道的开始" 可以这样说,一门语言的基础语言要素,就等同于是一门武功的内

PIC12F629帮我用C语言写个程序,控制三个LED亮灭

http://power.baidu.com/question/240873584599025684.html?entry=browse_difficult PIC12F629帮我用C语言写个程序,控制三个LED亮灭! 2014-12-31 16:05DINZEYU  分类:C/C++ | 浏览 87 次 C语言VC++ 按键按一次LED1低亮,按两次高亮,按三次2HZ闪,按三次关,按键长按3秒松开LED2亮,长按3秒松开LED2灭,按键长按5秒松开LED3亮,长按5秒松开LED3灭,每个功能独

Java语言Lang包下常用的工具类介绍_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 无论你在开发哪中 Java 应用程序,都免不了要写很多工具类/工具函数.你可知道,有很多现成的工具类可用,并且代码质量都很不错,不用你写,不用你调试,只要你发现. 在 Apache Jakarta Common 中, Lang 这个 Java 工具包是所有 Apache Jakarta Common 项目中被使用最广泛的,几乎你所知道的名气比较大的软件里面都有用到它,包括 Tomcat, Weblogic, Webs