c语言版2048
一.前言
- 环境准备:vc系列(vc 6.0,vs2005等等)编译器,下载easy x
- easy x下载链接
- easy x简介:相当于多加了一个库函数,头文件为:#include < graphics.h > 可以绘图,加载图片,音乐,获取鼠标信息。
- easy x官网链接
二. 效果截图
三. 程序框架和函数调用关系
1. 所有函数
main()//主函数
lent()//开始
show1()//主页面
show2()//游戏简介页面
show3()//操作界面
show4()//游戏画面
start()//游戏
rands()//随机生成数字块
updateWithInput()//与输入有关的更新
judge()//判断是否失败
win()//成功界面
lose()//失败界面
2. 函数框架-伪代码
int mian(void)
{
lent();//开始
}
void lent
{
while(1)
{
show1(); //主页面
1.获取鼠标信息
2.根据鼠标信息进行选择界面
if(鼠标点击游戏界面这个选项)
start();//游戏界面
else if()
show2();//游戏说明界面
else if()
show3();//操作说明界面
else if()
exit(0);//退出
}
}
void start()
{
1.使map数组元素清零 map(二维数组,保存2048游戏4*4格子中每个数的信息);
rands();//随机位置生成2/4
rands();
while(1)
{
show4()//游戏界面
updateWithInput();//与输入有关的更新
if(score_i>=2048)//本次得分超过2048胜利
win();//胜利界面
}
}
void rands()
{
随机位置生成2/4
judge();//判断是否失败 失败进入失败界面
}
void updateWithInput()
{
1.根据wasd 或者方向键进行2048中所有数字块的移动,合并碰撞
2.每次移动后计算本次得分,总分
3.每次移动后调用rands函数.
}
3. 函数框架-思维导图
四. 部分功能实行思路
1. 各种界面的绘制所用的的函数
- setbkcolor()//设置背景颜色
- setfillcolor()//设置填充颜色
- settextcolor()//设置字体颜色
- setfont()//设置字体大小,字体样式
- drawtext()//指定位置写入字符串
- solidroundrect()//绘制圆角矩形
- 具体用法可以看easy x帮助文件
2. 鼠标的应用
MOUSEMSG m;//定义鼠标类型变量
while(1)
{
m=GetMouseMsg();//获取鼠标信息
if(m.uMsg==WM_LBUTTONDOWN)//此时鼠标左键按下
{
if(m.x>WIDTH/2-45&&m.x<WIDTH/2+45&&m.y>HEIGHT/3&&m.y<HEIGHT/3+30)/\/鼠标座标所在位置
start();
}
}
getch();
}
更多操作可以看easy x的帮助
3. 图片的加载
IMAGE img0;//定义图片类型变量
loadimage(&img0,"pic\\0.jpg");//类似于赋值
putimage(i*165+30,j*165+230,&img0);//将图片写入屏幕上
4. 随机位置产生数字块
void rands()
{
int x,y,temp,num;
srand((int)time(0));
while(1)
{
x=rand()%4;
y=rand()%4;
temp=rand()%5;
if(temp==1)
num=4;
else
num=2;
if(map[y][x]==0)//随机生成的坐标为0时,将2/4赋给它,并跳出循环
{
map[y][x]=num;
break;
}
if(judge())//当格子内没有空位置并且有相邻相同的时跳出循环
break;
}
}
5. 失败判断
int judge()
{
int i,j;
//检查是否有0值
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(map[i][j]==0)
return 0;
//查看边界是否有相同的
for(i=0;i<4;i+=3)
for(j=1;j<3;j++)
if(map[i][j-1]==map[i][j]||map[i][j+1]==map[i][j])
return 1;
for(i=1;i<3;i++)
for(j=0;j<4;j+=3)
if(map[i-1][j]==map[i][j]||map[i+1][j]==map[i][j])
return 1;
//查看中心是否有相同
for(i=1;i<3;i++)
for(j=1;j<3;j++)
if(map[i-1][j]==map[i][j]||map[i+1][j]==map[i][j]||map[i][j-1]==map[i][j]||map[i][j+1]==map[i][j])
return 1;
lose();//失败界面
}
6. 与输入有关的更新(以上为例)
if(keyboard=='w'||keyboard=='W'||keyboard==72)//上
{
for(n=0;n<4;n++)//次数
for(i=1;i<4;i++)//行
for(j=0;j<4;j++)//列
if(map[i][j]!=0)//若当前元素不为0
{
if(map[i-1][j]==0)//上方元素为0,当前元素上移
{
map[i-1][j]=map[i][j];
map[i][j]=0;
}
if(map[i-1][j]==map[i][j])//当前元素和上方元素相同碰撞
{
num=map[i][j]*2;//得分
score_i=score_i+num;//本次操作得分
map[i-1][j]=map[i][j]*2;
map[i][j]=0;
}
}
score=score+score_i;//目前累计的分
rands();//随机位置生成数组块
}