萌新自己瞎写的2048

#include<stdio.h>
#include "easyx.h"
#include "graphics.h"
#include<windows.h>
#include<stdlib.h>
#include <time.h>
#include <conio.h>
#include <iostream>
#define X 0
#define Y 3
/*有16个格子,初始时会有两个格子上安放了两个数字2,
每次可以选择上下左右其中一个方向去滑动,每滑动一次,
所有的数字方块都会往滑动的方向靠拢外,
系统也会在空v白的地方随即出现一个数字方块,相同数字的方块在靠拢、相撞时会相加。
每次移动,只能合并一次 */
int max_x;
int max_y;
int board_arry[4][4];
int score=0;
char S[] = "分数:";


绘制棋盘
void draw_board()
{
int i;


max_x = getmaxx(); //得到当前图形模式下对大有效X坐标值
max_y = getmaxy(); //得到当前图形模式下对大有效y坐标值
setfillstyle(1, BLUE); //设置填充模式和颜色
bar(0, 0, max_x, max_y); //绘制矩形,并以蓝色填充矩形内部


//绘制4*4的棋盘
for (i = -2; i <= 2; i++)
{
///绘制水平方向的线条
line(max_x / 2 - 2 * 80, max_y / 2 + i * 80, max_x / 2 + 2 * 80, max_y / 2 + i * 80);
///绘制垂直方向的线条
line(max_x / 2 + i * 80, max_y / 2 - 2 * 80, max_x / 2 + i * 80, max_y / 2 + 2 * 80);
}
}
将每次移动后的数组打印在方格内
void show()
{
int x, y, temp_x;
char s[20] = { 0 }, s_score[20] = { 0 };


temp_x=x = max_x / 2 - 2 * 80+20;
y = max_y / 2 - 2 * 80 + 20;
clearrectangle(max_x / 2 - 2 * 80, max_y / 2 - 2 * 80, max_x / 2 + 2 * 80, max_y / 2 + 2 * 80); //先清空,再重新绘制
draw_board();
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{

itoa(board_arry[i][j], s, 10);
if (board_arry[i][j]!=0)
outtextxy(x, y, s);
memset(s, 0, sizeof(char) * 20);
x = x + 80;
}
x = temp_x;
y = y + 80;
}
itoa(score, s_score, 10);
outtextxy(240, 40, S);
outtextxy(270, 40, s_score);
}
/随机得到一个坐标,b并判断是否为0,不为0则随机在一个点产生2
void getIndex()
{
int x, y;
time_t t;
srand((unsigned)time(&t));
while (1)
{
x = rand() % (Y - X + 1) + X;
y = rand() % (Y - X + 1) + X;
if (board_arry[x][y] == 0)
{
board_arry[x][y] = 2;
return;
}
}
}
判断胜负,出现2048或者16个格子都有数
int judgeWin()
{
int flag_1 = 0,flag_2=0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
if (board_arry[i][j] == 0)
flag_1 = 1;
if (board_arry[i][j] == 2048)
flag_2 = 1;
}
if (flag_1==0 || flag_2)
return 1; //游戏已经结束
else
return 0; //游戏未结束
}
/移动函数
void move_left()
{
int i, j, k,flag = 1;


for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
if (board_arry[i][j] != 0)
{
flag = 0;
break;
}
if (flag)
continue;
for (j = 0,k=0; j < 4; j++)
{
if (board_arry[i][j] != 0)
board_arry[i][k++] = board_arry[i][j];
}
for (; k < 4; k++)
board_arry[i][k] = 0;
for (j = 0; j < 3; j++)
if (board_arry[i][j] == board_arry[i][j + 1] && board_arry[i][j] != 0)
{
score += board_arry[i][j];
board_arry[i][j] = board_arry[i][j] * 2;
for (k = j+1; k <3; k++) //一行最后一个不需要移动
board_arry[i][k] = board_arry[i][k + 1];
board_arry[i][k] = 0;
break;
}
}
}
void move_right()
{
int i, j, k,flag = 1;;
for (i = 0; i < 4; i++)
{
for (j = 3; j >= 0; j--)
if (board_arry[i][j] != 0)
{
flag = 0;
break;
}
if (flag)
continue;
for (j = 3,k=3; j >= 0; j--)
{
if (board_arry[i][j] != 0)
board_arry[i][k--] = board_arry[i][j];
}
for (; k >= 0; k--)
board_arry[i][k] = 0;
for (j = 3; j >0;j--)
if (board_arry[i][j] == board_arry[i][j - 1] && board_arry[i][j]!=0)
{
score += board_arry[i][j];
board_arry[i][j] = board_arry[i][j] * 2;
for (k = j - 1; k >=1; k--) //一行最后一个不需要移动
board_arry[i][k] = board_arry[i][k - 1];
board_arry[i][k] = 0;
score += 10;
break;
}
}
}
void move_up()
{
int i, j, k, flag = 1;
for (j = 0; j < 4; j++)
{
for (i = 0; i < 4; i++)
if (board_arry[i][j] != 0)
{
flag = 0;
break;
}
if (flag)
continue;
for (i = 0, k = 0; i < 4; i++)
{
if (board_arry[i][j] != 0)
board_arry[k++][j] = board_arry[i][j];
}
for (; k < 4; k++)
board_arry[k][j] = 0;
for (i = 0; i < 3;i++)
if (board_arry[i][j] == board_arry[i + 1][j] && board_arry[i][j] != 0)
{
score += board_arry[i][j];
board_arry[i][j] = board_arry[i][j] * 2;
for (k = i + 1; k <3; k++) //一行最后一个不需要移动
board_arry[k][j] = board_arry[k+1][j];
board_arry[k][j] = 0;
score += 10;
break;
}
}


}
void move_down()
{
int i, j, k, flag = 1;
for (j = 0; j < 4; j++)
{
for (i = 3; i >= 0; i--)
if (board_arry[i][j] != 0)
{
flag = 0;
break;
}
if (flag)
continue;
for (i = 3, k = 3; i >= 0; i--)
{
if (board_arry[i][j] != 0)
board_arry[k--][j] = board_arry[i][j];
}
for (; k >= 0; k--)
board_arry[k][j] = 0;
for (i = 3; i > 0; i--)
if (board_arry[i][j] == board_arry[i - 1][j] && board_arry[i][j] != 0)
{
score += board_arry[i][j];
board_arry[i][j] = board_arry[i][j] * 2;
for (k = i - 1; k >= 1; k--) //一行最后一个不需要移动
board_arry[k][j] = board_arry[k-1][j];
board_arry[k][j] = 0;
score += 10;
break;
}
}
}
void move()
{
char button;
fflush(stdin);
while (1)
{
button = getch();
switch (button)
{
case 'A':
case 'a':move_left(); break;
case 'D':
case 'd':move_right(); break;
case 'W':
case 'w':move_up(); break;
case 'S':
case 's':move_down(); break;
}
getIndex();
show();
if (judgeWin())
{
settextcolor(RED);
outtextxy(270, 60, "游戏结束!\n");
if (score>10000)
outtextxy(270, 80, "你真tm是一个大神!\n");
else
outtextxy(270, 80, "捞比不解释!!\n");
return;
}
fflush(stdin);
}
}
void outRuller()
{
outtextxy(20, 40, "移动方法:");
outtextxy(20, 60, "w:上");
outtextxy(20, 80, "s:下");
outtextxy(20, 100, "a:左");
outtextxy(20, 120, "d:右");
}
void main()
{
int driver = DETECT, mode;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
board_arry[i][j] = 0;
getIndex();
getIndex();
initgraph(&driver, &mode, "");
draw_board();
outtextxy(270, 10, "2048小游戏");
outRuller();
show();
move();
system("pause");
closegraph();

}

第一次发。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值