篇文章主要為大家詳細介紹了C語言實現——《拼圖游戲項目》,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下!
網圖
游戲介紹:
對剛開始接觸拼圖的玩家而言,所謂入門級的拼圖主要是取決于圖案的一些特征。那些圖案內容比較豐富的,也就是說,在整幅畫面的各個角落里也有內容相對完整的子畫面的,且色彩和輪廓反差較大的,這樣的拼圖玩起來就相對容易一些。因為在拼組的局部,想要尋找合適的零片,可選的零片總能被限制在比較小的范圍內
項目技術:
1.二維數組
2.可視化編程
2.1 動態制作
3.切割技術
3.1 實現圖片的自動切割
4.鼠標操作
4.1 玩游戲的內容
對邏輯也是有一定的要求,但是這些在我們項目源碼里面都會有注釋,大家到時候學習的時候千萬不要忽略注釋,注釋可以更好地幫你理解代碼,尤其是C語言初學者。
本項目編譯環境:VS2019/VS2013;
插件:圖形庫插件easyX,涉及圖片素材可以自行百度找也可以關注文末領?。?/span>
配套講解教程:游戲教程——嗶哩嗶哩
源代碼示例:
#include <graphics.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>
/******************************************/
// 全局變量的定義
IMAGE img, blank; //美女和空的
int array2D[4][4];
int array1D[15]={ 0 };
struct pos
{
int i;
int j;
}mypos={0,0};
struct pos searchPos(int array2D[][4], int i,int j)
{
for (i=0; i <=3; i++)
{
for (j=0; j <=3; j++)
{
if (array2D[i][j]==15)
{
mypos.i=i;
mypos.j=j;
return mypos;
}
}
}
return mypos;
}
/******************************************/
// 繪制開始菜單
void drawMenu()
{
initgraph(640, 450);
setbkcolor(WHITE); //設置窗口顏色為白色
cleardevice(); //刷新顯示
setfillcolor(LIGHTBLUE); //設置填充顏色為淡藍色
settextstyle(30, 0, "字魂24號-鎮魂手書");
setbkmode(TRANSPARENT); //透明方式去掉文字背景
//畫矩形
fillrectangle(240, 100, 380, 150);
fillrectangle(240, 100+60, 380, 150 + 60);
//文字輸出
outtextxy(240 + 20, 100 + 13, "開始游戲");
outtextxy(240 + 20, 100 + 13 + 60, "退出游戲");
settextcolor(RED); //設置文字顏色為紅色
outtextxy(130, 280, "頓開教育莫影拼圖游戲 v1.0版本");
MOUSEMSG m;
//鼠標操作
while (1)
{
m=GetMouseMsg();
//當鼠標放到矩形區域,畫一個矩形
if (m.x >=240 && m.x <=380 && m.y >=100 && m.y <=150)
{
setlinecolor(RED);
rectangle(240 - 5, 100 - 5, 380 + 5, 150 + 5);
if (m.uMsg==WM_LBUTTONDOWN)
{
break;
}
}
else if (m.x >=240 && m.x <=380 && m.y >=160 && m.y <=210)
{
setlinecolor(RED);
rectangle(240 - 5, 160 - 5, 380 + 5, 210 + 5);
if (m.uMsg==WM_LBUTTONDOWN)
{
exit(0);
}
}
else
{
setlinecolor(WHITE);
rectangle(240 - 5, 100 - 5, 380 + 5, 150 + 5);
rectangle(240 - 5, 160 - 5, 380 + 5, 210 + 5);
}
}
closegraph();
}
/******************************************/
// 加載資源
void loadResource()
{
srand((unsigned int)time(NULL));
int length=15;
int pos=0;
int i, j;
//1.給一維數組初始化0-15
for (i=0; i < 15; i++)
{
//0-14
array1D[i]=i;
}
//2.隨機出來一個下表
for (i=0; i < 4; i++)
{
for (j=0; j < 4; j++)
{
//單獨處理最后一個位置
if (i==3 && j==3)
{
array2D[3][3]=15;
break;
}
pos=rand() % length;
array2D[i][j]=array1D[pos];
for (int k=pos; k < length; k++)
{
array1D[k]=array1D[k + 1];
}
length--;
}
if (i==3 && j==3)
{
array2D[3][3]=15;
break;
}
}
//縮放加載
loadimage(&img, "Love.jpg", 800, 800);
loadimage(&blank, "blank.jpg", 200, 200);
}
/******************************************/
// 繪圖過程
void drawMap()
{
//根據打亂順序的二維數組中的值去拿照片中相應的位置
for (int i=0; i < 4; i++)
{
for (int j=0; j < 4; j++)
{
int x=j * 200;
int y=i * 200;
switch (array2D[i][j])
{
case 0:
case 1:
case 2:
case 3:
putimage(x, y, 200, 200, &img, array2D[i][j] * 200, 0);
break;
case 4:
case 5:
case 6:
case 7:
putimage(x, y, 200, 200, &img, (array2D[i][j]-4) * 200, 200);
break;
case 8:
case 9:
case 10:
case 11:
putimage(x, y, 200, 200, &img, (array2D[i][j] - 8) * 200, 400);
break;
case 12:
case 13:
case 14:
putimage(x, y, 200, 200, &img, (array2D[i][j] - 12) * 200, 600);
break;
case 15:
putimage(x, y, &blank);
break;
}
}
}
}
/******************************************/
// 游戲過程
void playGame()
{
MOUSEMSG m;
//白塊在數組那個位置
int j_Mouse, i_Mouse; //鼠標點在數組那個位置
while (1)
{
drawMap(); //第一次顯示
//換之前定位 白塊在哪里
int i=0, j=0;
searchPos(array2D, 3, 3);
i=mypos.i;
j=mypos.j;
m=GetMouseMsg();
switch (m.uMsg)
{
case WM_LBUTTONDOWN:
j_Mouse=m.x / 200;
i_Mouse=m.y / 200;
if (i >=0 && j < 4&&i<4&&j>=0)
{
if (i_Mouse==i + 1&&i+1<=3 && j_Mouse==j)
{
array2D[i][j]=array2D[i_Mouse][j_Mouse];
array2D[i_Mouse][j_Mouse]=15;
break;
}
if (i_Mouse==i - 1 && i - 1 >=0 && j_Mouse==j)
{
array2D[i][j]=array2D[i_Mouse][j_Mouse];
array2D[i_Mouse][j_Mouse]=15;
break;
}
if (i_Mouse==i && j_Mouse==j - 1&&j-1>=0)
{
array2D[i][j]=array2D[i_Mouse][j_Mouse];
array2D[i_Mouse][j_Mouse]=15;
break;
}
if (i_Mouse==i && j_Mouse==j + 1&&j+1<=3)
{
array2D[i][j]=array2D[i_Mouse][j_Mouse];
array2D[i_Mouse][j_Mouse]=15;
break;
}
}
break;
}
}
}
/******************************************/
// 游戲過程
void GameOve()
{
int flag=1;
}
int main()
{
drawMenu();
loadResource();
initgraph(800, 800);
playGame();
closegraph();
return 0;
}
寫在最后:對于準備學習C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內功)不妨從現在開始!
編程學習書籍分享:
編程學習視頻分享:
整理分享(多年學習的源碼、項目實戰視頻、項目筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!
對于C/C++感興趣可以關注小編在后臺私信我:【編程交流】一起來學習哦!可以領取一些C/C++的項目學習視頻資料哦!已經設置好了關鍵詞自動回復,自動領取就好了!
最親愛的伙計們,經過了一個漫長的51假期,鄙人宣布正式上班啦~
做自媒體的朋友肯定知道,有時候需要將視頻一張張的截取出來,圖片少的還好,真遇上多的,確實是挺累的。
還真是不巧,最近鄙人也在郁悶這個事。網上倒是有這樣子的軟件,不過需要花錢,像我這種一年半載用不到幾次的人,充毛線錢?但不買吧,你一張張的截圖那麻煩死,于是呢就有了今天的文章。
效果圖:
系統:windows7
openCV:2.4.X
語言:C++
工具:Visual Studio 2013
注:opencv的環境變量配置:
鄙人的opencv安裝路徑為:D:\opencv\opencv,大家按實際情況來,把bin目錄添加進去。
添加環境變量:
D:\opencv\opencv\build\x64\vc12\bin;D:\opencv\opencv\build\x86\vc12\bin;(不要忘記“;”)
打開Visual Studio 2013然后點擊“文件”--“新建”--“項目”,創建一個“wind32控制臺應用程序”
創建完畢之后就開始我們的配置開發環境,這很重要!
點項目-進入屬性頁,修改幾個地方:
1.包含目錄配置:
注:這個地方的路徑填三個同樣用;號分割:
(1)OpenCV安裝目錄下的...\include目錄
(2)OpenCV安裝目錄下的...\include\opencv目錄
(3)OpenCV安裝目錄下的...\include\opencv2目錄
2.庫目錄配置:
OpenCV目錄下的...x64\vc12\lib
注:此處的x64表示電腦是64位,32位選擇x86,無論是32還是64,路徑下的目錄都是一樣的。
拓撲:vc10表示VS是2010,vc11對應VS2012,vc12對應VS2013,vc14對應VS2015
3.鏈接器配置:
連接器就是OpenCV安裝目錄下的庫,直接復制過來就行。
注:末尾帶d的為debug,不帶d的為release,如opencv_core249d.lib/opencv_core249.lib分別為debug/release
參考路徑:D:\opencv\opencv\build\x64\vc12\lib
你只需要把上面的這些亂七八糟的東西做完就可以進入正規了,看起來也不是特別麻煩嘿嘿嘿。
鄙人因為講究“體面”,寫的程序是帶圖形化界面的,當然這些都不是精華,我們今天只做一個控制臺的程序就OK,都一樣用~
幾個小知識:
1.為什么char *xx=new char[x]最后需要delete[],而平時用的char *x=“xxxx”卻不需要?
在C++中new出的空間是創建在堆上,系統不會清除,由人工干預;而第二種創建的空間在棧上,由系統自動清理。
2.sprintf跟printf有什么區別?
sprintf函數會將內容打印到某個指定字符串中,而printf函數是打印輸出到屏幕上。sprintf函數多用在完成其他數據類型轉換成字符串類型的操作中。
我們把代碼寫完,點編譯。
注:鄙人這里直接編譯運行,cmd黑框會一閃而過,目前原因不明,只能去工程的debug目錄在cmd下運行。
我們找一個10秒的視頻放在debug的目錄下面,也就是我們編譯好的exe文件的根目錄,然后cmd運行我們變異好的程序,我們可以發現在指定的圖片保存目錄下生成了296張圖片。
這個1.MP4的時長為12秒,296/12=24.4計算結果為24幀每秒,效果還是不錯的~
好嘞,今天的文章就寫到這了。
源碼明天微頭條公布~
用VS2013實現加載頁,包括加載進度條和加載字樣,詳細代碼如下:
LoadingLayer.h:
#include <stdio.h>
#include "cocos2d.h"
#include "OnlyOneShotUtils.h"
using namespace cocos2d;
class LoadingLayer : public Scene {
public:
static Scene* createScene();
CREATE_FUNC(LoadingLayer);
void callback();
public:
virtual bool init();
static Sprite* getSprite(std::string pStr);
}
*請認真填寫需求信息,我們會在24小時內與您取得聯系。