C/C++編程筆記:C語言實現連連看遊戲,小白練手項目(源碼分享)

本篇文章分享看題目就知道是寫給初學者的,學的比較好的小夥伴也能夠將自動算法等一些知識給加進去,但願對你們有幫助!算法

好了,當咱們全部的準備工做作好以後,咱們就能夠來編寫咱們的C語言連連看遊戲了!編程

其實這個遊戲設計起來真的是很簡單的一種,本例用到的知識點主要有:數組,結構體,分支結構,圖形庫函數。數組

遊戲效果展現


 
連連看遊戲的效果圖大體就是這樣(之因此沒用本例的,是由於沒用圖形開發仍是有點很差看,嘿嘿~)

編寫準備:編譯軟件(VS2013),連連看圖片素材,easyX圖形庫插件,有須要能夠關注筆者微信公衆號:C語言編程學習基地,領取相關圖片素材能夠回覆關鍵字【連連看】便可。微信

那麼接下來就給你們展現咱們本期的連連看遊戲C語言代碼,本身寫以前,請必定要獲取到相關的必備資料哦!否則你就沒法根據代碼示例寫出來了!函數

源代碼示例

/*
    課程內容:練練看,很簡單
    開發環境:vs2013+easyx圖形庫
    知識點:
    數組,結構體,分支結構,圖形庫函數
*/
#include<stdio.h>
#include<graphics.h>
#define IMG_SIZE 39 //隔一個動物圖片的寬度
#define MAX_ANIMAL_NUM 42 //總共的動物數量
#define MAP_SIZE 10  //每行動物的數量
#define WIN_SIZE (MAP_SIZE*IMG_SIZE+2*IMG_SIZE)

//定義變量 int  a;
IMAGE img_total[2];
IMAGE img_animal[MAX_ANIMAL_NUM][2];
//地圖
int map[MAP_SIZE+2][MAP_SIZE+2];
//存儲兩次點擊的數組的下標
POINT begin = { -1, -1 }, end = { -1, -1 };
enum STATE
{
    BEGIN,
    END,
};
int flag = BEGIN;
//遊戲初始化
void GameInit()
{
    //建立一個圖形窗口,貼圖片
    initgraph(WIN_SIZE, WIN_SIZE,SHOWCONSOLE);
    //設置隨機數種子
    srand(GetTickCount());
    //加載圖片,若是現實沒有重載的函數,就是字符集的問題
    loadimage(&img_total[0], "./res/animal.bmp");
    loadimage(&img_total[1], "./res/bk.jpg", WIN_SIZE, WIN_SIZE);
    //把整個圖片進行分割,保存到新的數組
    SetWorkingImage(&img_total[0]);
    for (int i = 0; i < MAX_ANIMAL_NUM; i++)
    {
        for (int k = 0; k < 2; k++)
        {
            getimage(&img_animal[i][k], k*IMG_SIZE, i*IMG_SIZE, IMG_SIZE, IMG_SIZE);
        }
    }
    SetWorkingImage();
    //11111  222 3333
    //每張圖片來10張
    int temp = 1,_count=1;
    for (int i = 1; i <= MAP_SIZE; i++)
    {
        for (int k = 1; k <= MAP_SIZE; k++)
        {
            map[i][k] = temp;
            if (_count % 10 == 0)
            {
                temp++;
            }
            _count++;

        }
    }
    //打亂圖片,實際上就是打亂數組數據
    for (int i = 1; i <= MAP_SIZE; i++)
    {
        for (int k = 1; k <= MAP_SIZE; k++)
        {
            int temp=map[i][k];
            int row = rand() % 10 + 1;
            int col = rand() % 10 + 1;
            map[i][k] = map[row][col];
            map[row][col] = temp;
        }
    }
}
//遊戲的繪製
void GameDraw()
{
    putimage(0, 0, &img_total[1]);
    for (int i = 1; i <= MAP_SIZE; i++)
    {
        for (int k = 1; k <= MAP_SIZE; k++)
        {
            if (map[i][k]>0)
            {
                //用透明貼圖,使圖片背景透明
                putimage(k*IMG_SIZE, i*IMG_SIZE, &img_animal[map[i][k]][1],SRCAND);
                putimage(k*IMG_SIZE, i*IMG_SIZE, &img_animal[map[i][k]][0],SRCPAINT);
            }
        }
    }
    
}
//鼠標控制消除,獲取鼠標消息
void GameMouse()
{
    //檢測是否有鼠標操做
    if (MouseHit())
    {
        MOUSEMSG msg = GetMouseMsg();
        if (msg.uMsg == WM_LBUTTONDOWN )
        {
            if (flag==BEGIN)
            {
                begin.x = msg.y / IMG_SIZE;
                begin.y = msg.x / IMG_SIZE;
                flag = END;
            }
            else if (flag == END)
            {
                end.x = msg.y / IMG_SIZE;
                end.y = msg.x / IMG_SIZE;
                flag = BEGIN;
            }
            printf("begin(%d,%d),end(%d,%d)\n", begin.x, begin.y, end.x, end.y);
        }
    }
}
void show()
{
    for (int i = 0; i <= MAP_SIZE+2; i++)
    {
        for (int k = 0; k <= MAP_SIZE+2; k++)
        {
            printf("%2d ",map[i][k]);

        }
        printf("\n");
    }

}
//判斷某一點是否有圖片,沒有爲0
int isBlocked(int x,int y)
{
    return map[x][y];
}
//水平方向是否可以消除
bool horizon(POINT begin, POINT end)
{
    //不能點擊同一個
    if (begin.x == end.x &&begin.y == end.y)
    {
        return false;
    }
    //檢測是否在同一水平方向
    if (begin.x != end.x)
    {
        return false;
    }
    //求出大小
    int m_min = min(begin.y, end.y);
    int m_max = max(begin.y, end.y);
    for (int i = m_min + 1; i < m_max; i++)
    {
        if (isBlocked(begin.x, i))
        {
            return false;
        }
    }
    return true;
}
//垂直方向是否可以消除
bool vertical(POINT begin, POINT end)
{
    //不能點擊同一個
    if (begin.x == end.x &&begin.y == end.y)
    {
        return false;
    }
    //檢測是否在同一垂直方向
    if (begin.y != end.y)
    {
        return false;
    }
    //求出大小
    int m_min = min(begin.x, end.x);
    int m_max = max(begin.x, end.x);
    for (int i = m_min + 1; i < m_max; i++)
    {
        if (isBlocked(i,begin.y))
        {
            return false;
        }
    }
    return true;
}
//一個拐點
bool turn_ocne(POINT begin, POINT end)
{
    //不能點擊同一個
    if (begin.x == end.x &&begin.y == end.y)
    {
        return false;
    }
    //保存兩個拐點信息
    POINT temp1 = { begin.x, end.y }, temp2 = { end.x, begin.y };
    if (!isBlocked(begin.x, end.y))
    {
        if (horizon(begin, temp1) && vertical(end, temp1))
        {
            return true;
        }

    }
    if (!isBlocked(end.x, begin.y))
    {
        if (horizon(end, temp2) && vertical(temp2, begin))
        {
            return true;
        }

    }
    return false;
}
int main()
{
    GameInit();
    show();
    BeginBatchDraw();
    while (1)
    {
        GameDraw();
        FlushBatchDraw();
        GameMouse();
        //消除操做,消除就是讓數組的值等於0
        if (map[begin.x][begin.y] == map[end.x][end.y])
        {
            if (horizon(begin, end))
            {
                map[begin.x][begin.y] = 0;
                map[end.x][end.y] = 0;
            }
            else if (vertical(begin, end))
            {
                map[begin.x][begin.y] = 0;
                map[end.x][end.y] = 0;
            }
            else if (turn_ocne(begin, end))
            {
                map[begin.x][begin.y] = 0;
                map[end.x][end.y] = 0;
            }

        }
    }
    return 0;
}

以上就是分享給你們的所有的C語言代碼,但願可以對你們有幫助~學習

自學C/C++編程難度很大,不妨和一些志同道合的小夥伴一塊兒學習成長!
spa

C語言C++編程學習交流圈子,【點擊進入】微信公衆號:C語言編程學習基地插件

有一些源碼和資料分享,歡迎轉行也學習編程的夥伴,和你們一塊兒交流成長會比本身琢磨更快哦!設計

相關文章
相關標籤/搜索