2048小游戏上

本次全程跟着b站视频教学,感谢互联网,感谢感谢。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<easyx.h>
#include<math.h>
#include<conio.h>
/*
* 2048game
* 1.数据可以使用二维数组存储
* 2.随机数 srand rand函数在stdlib
* 3.把数据转成图形界面
*/

#define ROW 4          //引用方便
#define COL 4          //4为个数
#define GRID_SIZE 100  //100是像素,格子的宽度和高度
#define INTERVAL  15   //格子间的间隔

enum Color//枚举格子颜色
{
	zero=RGB(205,193,180),//0de color
	twoTo1=RGB(238,228,218),//2
	twoTo2=RGB(237,224,200),//4
	twoTo3=RGB(242,177,121),//8
	twoTo4=RGB(245,149,99),//16
	twoTo5=RGB(246,124,95),//32
	twoTo6=RGB(246,94,59),//64
	twoTo7=RGB(242,177,121),//128
	twoTo8=RGB(237,204,97),//256
	twoTo9=RGB(255,0,128),//512
	twoTo10=RGB(145,0,72),//1024
	twoTo11=RGB(242,17,158),//2048
	back=RGB(187,173,160),

};
//定义数组
Color colors[13] = { zero,twoTo1,twoTo2,twoTo3,twoTo4,twoTo5,twoTo6,twoTo7,twoTo8,twoTo9,twoTo10,twoTo11 };

//存储数据的数组
int map[ROW][COL];
//随机产生2or4
int createNumber()
{
	//控制概率
	if (rand() % 10 != 0)
	{
		return 2;
	}
	else
	{
		return 4;
	}
}
  1. 宏定义:定义了常量,如 ROW、COL、GRID_SIZE、INTERVAL 。

  2. 枚举类型:定义了颜色的枚举类型Color。

  3. 二维数组:定义了存储数据的二维数组map。

  4. 函数:定义了生成随机数的函数 createNumber()。

  5. 计数:使用了随机数生成函数 rand() 和 srand()。

  6. 头文件:引用了多个头文件,如 stdio.h、stdlib.h、time.h、easyx.h、math.h 和 conio.h。

//给数组空白处填充数
void mapFillNumber()
{
	//随机产生一个数并且放到数组,可以引用rand
    //一开始需要产生两个数
	while(true)
	{
		//多次产生下标的时候,可能会重复 0 1 0 1
		int r = rand() % ROW;//0 1 2 3
		int c = rand() % COL;//0 1 2 3
		if (map[r][c] == 0)
		{
			map[r][c] = createNumber();
			return;
			//只有正确生成了数字,才i++
		}

	}
}


//初始化
void init()
{
	//设置随机数种子
	srand(time(NULL));
	//因为每次运行程序系统时间不一样
	//随机产生一个数,,并且放到数组里
	for (int i = 0; i < 2; i++)
	{
		mapFillNumber();
	}
	//map[0][0] = 2048;测试数据
	//map[0][0] = 512;
}

  1. 设置随机数种子:使用srand函数设置随机数种子,以系统时间作为参数。

  2. 初始化游戏:通过循环两次调用mapFillNumber函数,将初始的两个随机数放到数组里面。

  3. 初始数字的生成:mapFillNumber函数通过使用rand函数随机产生行列下标,并在数组里面随机找一个为0的元素,并通过调用createNumber函数产生随机数填充到数组里面

 

//绘制
void draw()
{
	setbkcolor(RGB(187, 173, 160));//设置背景颜色
	cleardevice();//用设置的背景颜色填充整个屏幕
	
	for (int i = 0; i < ROW; i++)
	{
		for (int k = 0; k < COL; k++)
		{
			//把每个格子左上角坐标求出来
			int x = k * GRID_SIZE + (k + 1) * INTERVAL;
			int y = i * GRID_SIZE + (i + 1) * INTERVAL;
			//RGB 205 193 180
			//map[i][k] 2048 2^11=2048 2^?=0未定义会造成程序无法运行
			int index = map[i][k] ? log2(map[i][k]) : 0;
			setfillcolor(colors[index]);
			solidroundrect(x, y, x + GRID_SIZE, y + GRID_SIZE, 10, 10);

			if (map[i][k])//为真不显示0
			{
				//先把数字转成字符串
				// ASCII
				char numberStr[5] = { 0 };
				sprintf(numberStr, "%d", map[i][k]);

				//绘制文字,把map的i和k绘制
				//设置字体颜色
				settextcolor(RGB(119, 110, 101));
				settextstyle(50, 0, "微软雅黑");
				setbkmode(TRANSPARENT);//设置背景颜色为透明

				//文字居中显示
				int hspace = (GRID_SIZE - textwidth(numberStr)) / 2;//水平间距
				int vspace = (GRID_SIZE - textheight(numberStr)) / 2;

				//printf不可以做到,因为它是输入输出到控制台的
				//而我们需要的是输入输出到图形窗口,则可以使用outtextxy,把文本输出到指定坐标
				outtextxy(x + hspace, y + vspace, numberStr);//该函数只能是字符或字符串,数字不会报错,但对游戏的实现有影响
			}

		}
		printf("\n");
	}
}

 

实现了在图形界面中绘制一个2048游戏的界面。

首先设置背景颜色为 RGB(187, 173, 160),并用该颜色清空整个屏幕。

接下来是一个双重循环,循环绘制每一个格子,每个格子的左上角坐标是通过一个公式计算出来的。如果该格子的数字不为 0,则填充该格子的颜色,并在该格子内显示数字,该数字颜色为 RGB(119, 110, 101)。最后通过 outtextxy 函数,将数字字符串绘制到图形界面的指定坐标。

这段代码实现了2048游戏界面的绘制,通过循环遍历每一个格子,以及根据每个格子的数字进行相应的处理,最终绘制出了一个2048游戏的界面。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值