[C] 纯文本查看 复制代码
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<bits/stdc++.h>
using namespace std;
void loadImage();
void releaseImage();
void addRandomNum(int n);
bool move(int direction);
void draw();
#define DEVIDE 15
#define GRID_WIDTH 106
//图片
#define NUM_BLOCK 18
PIMAGE blockImgs[NUM_BLOCK], backgroundImg;
key_msg keyMsg;
int board[4][4]; //格子
//int emptyBlock = 16; //空格子数
char ch;
//数据文件
const char* recordFile = "game2048.txt";
//图片文件位置
PIMAGE pimgs[5];
const char* imgFiles[5] = {
"resource\\image\\background.png",
"resource\\image\\gamelogo.png",
"resource\\image\\scorebg.png",
"resource\\image\\restart.png",
"resource\\image\\gameOver.png"
};
//音乐
MUSIC mergeMusic;
MUSIC startMusic;
const char* mergeMusicFile = "resource\\music\\merge.mp3";
const char* startMusicFile = "resource\\music\\start.mp3";
int topScore, score, maxNum;//最高分 ,当前分,最大合成数
void getRand()
{
int x,y;
while(1)
{
x=rand()%4;
y=rand()%4;
if(board[x][y]==0)
{
break;
}
}
board[x][y]=1;
}
void loadImage()//图片载入
{
char imgName[40];
//数字图片 初始化
for (int i = 1, num = 2; i < NUM_BLOCK; i++, num *= 2)
{
blockImgs[i] = newimage();//声明
sprintf(imgName, "resource\\image\\block_%d.png", num);//字符串赋值
getimage(blockImgs[i], imgName);//图片对象赋值
}
//底图 初始化
for (int i = 0; i < 5; i++)
{
pimgs[i] = newimage();
getimage(pimgs[i], imgFiles[i]);
}
}
void score_cnt()//分数计算
{
}
void start()//初始化
{
//关闭窗口不强制退出程序,以便进行游戏保存工作
// setinitmode(INIT_RENDERMANUAL | INIT_NOFORCEEXIT, 100, 50);
initgraph(500+40, 500+178+20);//图形初始化
setbkcolor(WHITE);
srand(time(0));//随机数初始化
loadImage();//图片载入
setfont(25,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
//音乐载入
mergeMusic.OpenFile(mergeMusicFile);
startMusic.OpenFile(startMusicFile);
startMusic.Play(0);
}
void draw()//图形绘制
{
putimage_withalpha(NULL, pimgs[0], 20, 178);//绘制带透明通道的图像
//绘制背景
putimage_withalpha(NULL, pimgs[1], 34, 30); //图标
putimage_withalpha(NULL, pimgs[2], 260, 10); //游戏分数背景
putimage_withalpha(NULL, pimgs[3], 20, 110); //重新开始安妮
//游戏分数
setcolor(DARKGRAY);
setfont(30, 0, "黑体");
xyprintf(370, 24, "%8d", topScore);
xyprintf(370, 72, "%8d", score);
int temp = pow(2,maxNum);
xyprintf(370, 120, "%8d", temp);
//绘制数字图
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
int x = (j + 1) * DEVIDE + j * GRID_WIDTH+20;
int y = (i + 1) * DEVIDE + i * GRID_WIDTH+178;
if (board[i][j] != 0)
putimage_withalpha(NULL, blockImgs[board[i][j]], x, y);
}
}
void restart()//重新开始
{
score=0;
for(int i=3;i>=0;i--)
for(int j=3;j>=0;j--)
{
board[i][j]=0;
}
}
bool judgeUpSlide()
{
for(int i=0;i<=3;i++)
{
for(int j=0;j<=3;j++)
{
if(board[i][j]==0)
{
return true;
}
else if(i>0&&board[i][j]==board[i-1][j])
{
return true;
}
}
}
return false;
}
void upSlide()
{
for(int i=3;i>=0;i--)
{
for(int j=0;j<=3;j++)
{
if(i>0&&board[i-1][j]==0&&board[i][j]!=0)
{
board[i-1][j]=board[i][j];
board[i][j]=0;
}
else if(i>0&&board[i][j]==board[i-1][j]&&board[i][j]!=0)
{
board[i-1][j]=board[i][j]+1;
board[i][j]=0;
}
}
}
}
bool judgeLeftSlide()
{
for(int i=0;i<=3;i++)
{
for(int j=0;j<=3;j++)
{
if(board[i][j]==0)
{
return true;
}
else if(board[i][j]==board[i][j+1])
{
return true;
}
}
}
return false;
}
void leftSlide()
{
for(int i=3;i>=0;i--)
{
for(int j=0;j<=3;j++)
{
if(board[i][j+1]==0&&board[i][j]!=0)
{
board[i][j+1]=board[i][j];
board[i][j]=0;
}
else if(board[i][j]==board[i][j+1]&&board[i][j]!=0)
{
board[i][j+1]=board[i][j];
board[i][j]=0;
}
}
}
}
bool judgeDownSlide()
{
for(int i=0;i<=3;i++)
{
for(int j=0;j<=3;j++)
{
if(board[i][j]==0)
{
return true;
}
else if(board[i][j]==board[i+1][j])
{
return true;
}
}
}
return false;
}
void downSlide()
{
for(int i=3;i>=0;i--)
{
for(int j=0;j<=3;j++)
{
if(board[i+1][j]==0&&board[i][j]!=0)
{
board[i+1][j]=board[i][j];
board[i][j]=0;
}
else if(board[i][j]==board[i+1][j]&&board[i][j]!=0)
{
board[i+1][j]=board[i][j]+1;
board[i][j]=0;
}
}
}
}
bool judgeRightSlide()
{
for(int i=0;i<=3;i++)
{
for(int j=0;j<=3;j++)
{
if(board[i][j]==0)
{
return true;
}
else if(i>0&&board[i][j]==board[i][j-1])
{
return true;
}
}
}
return false;
}
void rightSlide()
{
for(int i=3;i>=0;i--)
{
for(int j=0;j<=3;j++)
{
if(i>0&&board[i][j-1]==0&&board[i][j]!=0)
{
board[i][j-1]=board[i][j];
board[i][j]=0;
}
else if(i>0&&board[i][j]==board[i][j-1]&&board[i][j]!=0)
{
board[i][j-1]=board[i][j]+1;
board[i][j]=0;
}
}
}
}
void update()//数据更新
{
switch(keyMsg.key)
{
case 'W':
if(judgeUpSlide()) upSlide();
break;
/*case 'A':
if(judgeLeftSlide()) leftSlide();
break;
case 'S':
if(judgeDownSlide()) downSlide();
break;
case 'D':
if(judgeRightSlide()) rightSlide();
break;
case 'Q':
restart();
break;*/
default:break;
}
}
void loadRecord()
{
FILE* fp = fopen(recordFile, "r");
fscanf(fp, "topScore:%d score:%d maxNum:%d",&topScore, &score, &maxNum);
for (int i = 0; i < 4; i++)
for (int j = 0; j < 4; j++)
{
fscanf(fp, "%d", &board[i][j]);
}
fclose(fp);
}
void gameSave()
{
//数据写入
FILE* fp = fopen(recordFile, "w");
if (fp == NULL)
return;
fprintf(fp, "topScore:%d\nscore:%d\nmaxNum:%d\n",
topScore,score,maxNum);
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++)
fprintf(fp, "%d ", board[i][j]);
fprintf(fp, "\n");
}
fclose(fp);
}
int main()
{
loadRecord();
a: start();//初始化
getRand();//产生随机数字
draw();//图形绘制
while(1)//!judgeOver())
{
while(kbmsg())
{
keyMsg = getkey();
if ((keyMsg.msg == key_msg_down)&&((keyMsg.key=='A')||(keyMsg.key=='S')||
(keyMsg.key=='W')||(keyMsg.key=='D')||(keyMsg.key=='Q')))
{
mergeMusic.Play(0);
update();
getRand();
score_cnt();
cleardevice();
draw();
gameSave();
}
}
delay_fps(60);
}
//gameSave();
xyprintf(200,300,"GAME OVER");
getch();
restart();
goto a;
return 0;
}