本篇文章分享看題目就知道是寫給初學者的,學的比較好的小伙伴也可以將自動演算法等一些知識給加進去,希望對大家有幫助! 好了,當我們所有的準備工作做好之後,我們就可以來編寫我們的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++編程難度很大,不妨和一些志同道合的小伙伴一起學習成長!
C語言C++編程學習交流圈子,【點擊進入】微信公眾號:C語言編程學習基地
有一些源碼和資料分享,歡迎轉行也學習編程的伙伴,和大家一起交流成長會比自己琢磨更快哦!