Discuz! Board

 找回密码
 立即注册
查看: 559|回复: 0

2048未完

[复制链接]

15

主题

15

帖子

209

积分

中级会员

Rank: 3Rank: 3

积分
209
发表于 2023-4-1 14:05:22 | 显示全部楼层 |阅读模式
#include <graphics.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

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;

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);//图片对象赋值
        }
        //底图 初始化
        backgroundImg = newimage();
        getimage(backgroundImg, "resource\\image\\background.png");
}

void start()//初始化
{
        initgraph(500, 500);//图形初始化
        setbkcolor(WHITE);
        srand(time(0));//随机数初始化
        loadImage();//图片载入
       
        setfont(25,0,"幼圆");//(字体高度,字体宽度(为0即为自适应),字形)设置字体为25,幼圆字体
        setbkmode(TRANSPARENT); //设置文字背景色为透明(默认为有背景色)
}

void getRand()
{       
   
        int x;
        int y;
        int flag=0;
    for(int i=0;i<=3;i++)
    for(int j=0;j<=3;j++)
    {
            if(board[i][j]==0)
            {
                    flag=1;
                    break;
                }
                if(flag==1)
                {
                       
                }
       
        }
        if(flag==1)
        {
        while(1)
        {
                x=rand()%4;
                y=rand()%4;
                if(board[x][y]==0)
                {
                        break;
                }
        }
        board[x][y]=1;               
        }
}

void draw()//图形绘制
{
        putimage_withalpha(NULL, backgroundImg, 0, 0);//绘制带透明通道的图像

        for (int i = 0; i < 4; i++)
        for (int j = 0; j < 4; j++)
        {
                int x = (j + 1) * DEVIDE + j * GRID_WIDTH;
                int y =  (i + 1) * DEVIDE + i * GRID_WIDTH;

                if (board[i][j] != 0)
                        putimage_withalpha(NULL, blockImgs[board[i][j]], x, y);       
        }
}
void upSlide()
{
    for(int i=3;i>=1;i--)
    for(int j=0;j<=3;j++)
    {
            if((board[i][j]>0)&&(board[i-1][j]==0))
            {
                    board[i-1][j]=board[i][j];
                    board[i][j]=0;                
                }
                if((board[i][j]>0)&&(board[i][j]==board[i-1][j]&&i>=1))
            {
                    board[i-1][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;
                }
                if(board[i][j]==board[i-1][j]&&i>=1)
            {
                    return true;
                }
        }        return false;
}
void downSlide()
{
    for(int i=3;i>=1;i--)
    for(int j=0;j<=3;j++)
    {
            if((board[i][j]>0)&&(board[i-1][j]==0))
            {
                    board[i-1][j]=board[i][j];
                    board[i][j]=0;                
                }
                if((board[i][j]>0)&&(board[i][j]==board[i-1][j]&&i>=1))
            {
                    board[i-1][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;
                }
                if(board[i][j]==board[i-1][j]&&i>=1)
            {
                    return true;
                }
        }        return false;
}
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;
                default:break;
        }
}

int main()
{
        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')))
                        {
                                update();
                                getRand();
                                cleardevice();
                                draw();
                        }
                }
                delay_fps(60);
        }
       
        xyprintf(200,300,"GAME OVER");
        getch();
        return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-5-31 13:40 , Processed in 0.064851 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

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