整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          C語言項目實戰:《拼圖游戲》零基礎項目!250 行源

          C語言項目實戰:《拼圖游戲》零基礎項目!250 行源碼注釋示例

          篇文章主要為大家詳細介紹了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;(不要忘記“;”)

          VS工程文件:

          打開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);

          }


          主站蜘蛛池模板: 色欲AV蜜臀一区二区三区| 91一区二区在线观看精品| 亚洲色精品aⅴ一区区三区| 亚洲无圣光一区二区| 精品视频在线观看一区二区| 性无码免费一区二区三区在线 | 亚洲欧美日韩国产精品一区| 国产AV国片精品一区二区| 国模无码一区二区三区| 人妻体体内射精一区二区| 中文字幕永久一区二区三区在线观看 | 91精品国产一区| 99久久精品费精品国产一区二区| 日韩三级一区二区| 中文字幕精品一区二区2021年 | 一本AV高清一区二区三区| 国产主播一区二区三区| 日本高清一区二区三区| 久久精品国产第一区二区三区| 精品国产日韩亚洲一区| 视频一区二区精品的福利| 国内精品一区二区三区东京| 无码成人一区二区| 一区二区在线视频| 午夜福利一区二区三区在线观看 | 濑亚美莉在线视频一区| 人妻互换精品一区二区| 亚洲综合无码一区二区痴汉| 一区二区三区亚洲视频| 无码人妻精品一区二区三区9厂 | 亚洲av无码一区二区三区不卡 | 国产AV天堂无码一区二区三区| 国产伦精品一区二区| 国产伦精品一区二区三区视频猫咪 | 日韩人妻无码一区二区三区| 国产精品区AV一区二区| 亚洲人AV永久一区二区三区久久| 国产精品亚洲一区二区三区久久| 中文字幕无线码一区2020青青| 国产一区二区三区乱码网站| 亚洲高清一区二区三区电影|