吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 17001|回复: 16
收起左侧

[C&C++ 转载] 分享一个自己用C语言刚写完2048源码

[复制链接]
xhmshine 发表于 2014-12-28 13:54
刚学C语言半年,分享自己刚写完的2048源码
写了1周,中间也遇到一些函数不会使用,也都通过百度解决了......
[C] 纯文本查看 复制代码
#include<stdio.h>
#include<conio.h>   //使用getch()函数 
#include<time.h> 
#include <stdlib.h>
int num[4][4];
int score, gameover, ifappear, gamew, gamef,move;
char key;
void explation()
{
	void menu();
	system("cls");
	printf("\t\t*****************************************\t\t\n");
	printf("\t\t*****************************************\n");
	printf("\t\t******************游戏规则***************\n");
	printf("\t\t*****************************************\n");
	printf("\t\t*****************************************\t\t\n");
	printf("玩家可以选择上、下、左、右或W、A、S、D去移动滑块\n");
	printf("玩家选择的方向上若有相同的数字则合并\n");
	printf("合并所得的所有新生成数字相加即为该步的有效得分\n");
	printf("玩家选择的方向行或列前方有空格则出现位移\n");
	printf("每移动一步,空位随机出现一个2或4\n");
	printf("棋盘被数字填满,无法进行有效移动,判负,游戏结束\n");
	printf("棋盘上出现2048,获胜,游戏结束\n");
	printf("按上下左右去移动滑块\n");
	printf("请按任意键返回主菜单...\n");
	getch();
	system("cls");
	main();
}
void gamefaile()
{
	int i, j;
	system("cls");
	printf("\t\t*****************************************\t\t\n");
	printf("\t\t*****************************************\n");
	printf("\t\t******************you fail***************\n");
	printf("\t\t*****************************************\n");
	printf("\t\t*****************************************\t\t\n");
	printf("\t\t\t---------------------\n\t\t\t");
	for (j = 0; j<4; j++)
	{
		for (i = 0; i<4; i++)
			if (num[j][i] == 0)
				printf("|    ");
			else
				printf("|%4d", num[j][i]);
		printf("|\n");
		printf("\t\t\t---------------------\n\t\t\t");
	}
	printf("你的成绩:%d,移动了%d步\n", score,move);
	printf("请按任意键返回主菜单...\n");
	getch();
	system("cls");
	main();

}
void gamewin()
{
	int i, j;
	system("cls");
	printf("\t\t*****************************************\t\t\n");
	printf("\t\t*****************************************\n");
	printf("\t\t*******************you win***************\n");
	printf("\t\t*****************************************\n");
	printf("\t\t*****************************************\t\t\n");
	printf("\t\t\t---------------------\n\t\t\t");
	for (j = 0; j<4; j++)
	{
		for (i = 0; i<4; i++)
			if (num[j][i] == 0)
				printf("|    ");
			else
				printf("|%4d", num[j][i]);
		printf("|\n");
		printf("\t\t\t---------------------\n\t\t\t");
	}
	printf("你的成绩:%d,移动了%d步\n", score,move);
	printf("请按任意键返回主菜单...\n");
	getch();
	system("cls");
	main();
}
void prin()
{
	int i, j;
	system("cls");
	printf("\t\t*****************************************\t\t\n");//输出界面
	printf("\t\t*****************************************\n");
	printf("\t\t******************游戏开始***************\n");
	printf("\t\t*****************************************\n");
	printf("\t\t*****************************************\t\t\n");
	printf("\t\t      请按方向键或W、A、S、D移动滑块\n");//输出操作提示语句
	printf("\t\t          按ESC返回至主菜单\n");
	printf("\t\t\t---------------------\n\t\t\t");
	for (j = 0; j<4; j++)                 //输出4*4的表格
	{
		for (i = 0; i<4; i++)
			if (num[j][i] == 0)
				printf("|    ");
			else
				printf("|%4d", num[j][i]);
		printf("|\n");
		printf("\t\t\t---------------------\n\t\t\t");
	}
	printf("你的成绩:%d,移动了%d步\n", score,move);//输出得分和移动步数
}
void appear()
{
	int i, j,ran,t[16],x=0,a,b;
	srand((int)time(0));          //随机种子初始化
	for (j = 0; j < 4; j++)      //将空白的区域的坐标保存到中间数组t中
		for (i = 0; i < 4;i++)
			if (num[j][i] == 0)
			{
		        t[x] = j * 10 + i;
				x++;
			}
	if (x == 1)            //在t中随机取一个坐标
		ran = x - 1;
	else
		ran = rand() % (x - 1);
	a = t[ran] / 10;      //取出这个数值的十位数
	b = t[ran] % 10;     //取出这个数值的个位数
	srand((int)time(0));
	if ((rand() % 9)>2)    //在此空白区域随机赋值2或4
		num[a][b] = 2;
	else
		num[a][b] = 4;
}
void close()
{
	exit(0);
}
void add(int *p)
{
	
	int i=0, b;
	while (i<3)
	{
		if (*(p + i) != 0)
		{
			for (b = i + 1; b < 4; b++)
			{
				if (*(p + b) != 0)
					if (*(p + i) == *(p + b))
					{
					score = score + (*(p + i)) + (*(p + b));
					*(p + i) = *(p + i) + *(p + b);
					if (*(p + i) == 2048)
						gamew = 1;
					*(p + b) = 0;
					i = b + i;
					++ifappear;
					break;
					}
					else
					{
						i = b;
						break;
					}
			}
			if (b == 4)
				i++;
		}
		else
			i++;
	}

}
void Gameplay()
{
	int i, j, g, e, a, b[4];
	appear();
	appear();
	while (1)
	{
		if (ifappear!=0)
			appear();
		prin();
		key = getch();
		switch (key)
		{
		case 'w':
		case 'W':
		case 72:
			ifappear = 0;
			for (j = 0; j < 4; j++)
			{
				for (i = 0; i < 4; i++)
				{
					b[i] = num[i][j];
					num[i][j] = 0;
				}
				add(b);
				e = 0;
				for (g = 0; g < 4; g++)
				{
					if (b[g] != 0)
					{
						num[e][j] = b[g];
						if (g != e)
							++ifappear;
						e++;
					}
				}
			}
			if (ifappear!=0)
				++move;
		break;
		case 's':
		case 'S':
		case 80:
			ifappear = 0;
			for (j = 0; j < 4; j++)
			{
				for (i = 0; i < 4; i++)
				{
					b[i] = num[i][j];
					num[i][j] = 0;
				}
				add(b);
				e = 3;
				for (g = 3; g>=0; g--)
				{
					if (b[g] != 0)
					{
						num[e][j] = b[g];
						if (g != e)
							++ifappear;
						e--;
					}
				}
			}
			if (ifappear != 0)
				++move;
		break;
		case 'a':
		case 'A':
		case  75:
			ifappear = 0;
			for (j = 0; j < 4; j++)
			{
				for (i = 0; i < 4; i++)
				{
					b[i] = num[j][i];
					num[j][i] = 0;
				}
				add(b);
				e = 0;
				for (g = 0; g < 4; g++)
				{
					if (b[g] != 0)
					{
						num[j][e] = b[g];
						if (g!=e)
							++ifappear;
						e++;
					}
				}
			}
			if (ifappear != 0)
				++move;
		break;
		case 'd':
		case 'D':
		case  77:
			ifappear = 0;
			for (j = 0; j < 4; j++)
			{
				for (i = 0; i < 4; i++)
				{
					b[i] = num[j][i];
					num[j][i] = 0;
				}
				add(b);
				e = 3;
				for (g = 3; g >=0; g--)
				{
					if (b[g] != 0)
					{
						num[j][e] = b[g];
						if (g!=e)
							++ifappear;
						e--;
					}
				}
			}
			if (ifappear != 0)
				++move;
		break;
	    case 27:
			system("cls");
		    main();
		    break;

		}
		for (j = 0; j < 4; j++)
		{
			for (i = 0; i < 4; i++)
			{
				if (j < 3)
				{
					if (i < 3)
					{
						if (num[j][i] == num[j + 1][i] || num[j][i] == num[j][i + 1] || num[j][i] == 0)
						{
							gamef = 0;
							break;
						}
						else
							gamef = 1;
					}
					else
					{
						if (num[j][i] == num[j + 1][i] || num[j][i] == 0)
						{
							gamef = 0;
							break;
						}
						else
							gamef = 1;
					}
				}
				else
				{
					if (i < 3)
					{
						if (num[j][i] == num[j][i + 1] || num[j][i] == 0 || num[j][i + 1] == 0)
						{
							gamef = 0;
							break;
						}
						else
							gamef = 1;
					}
				}

			}
			if (gamef == 0)
				break;
		}
		if (gamef == 1 || gamew == 1)
			break;

	}
	if (gamef == 1)
		gamefaile();
	else
		gamewin();
}
void menu()
{
	int n;
	printf("\t\t*****************************************\t\t\n");            //输出游戏菜单的图形
	printf("\t\t*              1、开始游戏              *\n");
	printf("\t\t*              2、游戏规则              *\n");
	printf("\t\t*              3、退出游戏              *\n");
	printf("\t\t*****************************************\n");
	printf("请输入1或2或3:[ ]\b\b");
	scanf("%d", &n);
	switch (n)
	{
	case 1:
		Gameplay();                                                         //游戏开始函数
		break;
	case 2:
		explation();                                                       //游戏规则函数
		break;
	case 3:
		close();                                                          //关闭游戏函数
		break;
	}
}
int main()
{
	int j, i;
	for (j = 0; j < 4; j++)             //对4*4进行初始赋值为0
		for (i = 0; i < 4; i++)
			num[j][i] = 0;
	gamew = 0;                        //游戏获胜的判断变量初始化
	gamef = 0;                       //游戏失败的判断变量初始化
	ifappear = 0;                   //判断是否应该随机出现2或4的变量初始化
	score = 0;                     //游戏得分变量初始化
	gameover = 0;                 //游戏是否结束的变量初始化
	move = 0;                    //游戏的移动步数初始化
	menu();                     //调用主菜单函数
	return 0;
}


发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

Jack丶雷 发表于 2014-12-28 14:11
愿楼主终将成为大神!                      ---沙发我拿了。
墨色点滴 发表于 2014-12-28 16:41 来自手机
波风雨泽 发表于 2014-12-28 14:11
A001 发表于 2015-1-17 12:16
运行怎么显示有错误
时光 发表于 2015-1-29 23:39
学习学习,谢谢分享
跑江湖 发表于 2015-3-30 16:28
学习学习
空城叹、颖 发表于 2015-3-30 20:25 来自手机
支持支持楼主,。
红玫瑰1996 发表于 2015-3-31 20:01
不错,喜欢
xiaosir 发表于 2015-4-1 23:37
你这是什么编译器?VS下开发么?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 07:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表