首页  > 游戏热搜  > C语言打造——炫酷海贼王拼图

C语言打造——炫酷海贼王拼图

发布时间:2023-05-19 11:50:20     作者:互联网收集     浏览量:236    

海贼王1000拼图技巧

写拼图,找好素材,自然我也喜欢找一个好看点的界面,我就以海贼王为题材,用C语言写一个拼图游戏,涉及到的知识点也不是很多,等会我最后总结一下,先把代码发出来吧,还加上了音乐。

海贼王1000拼图技巧

#include <stdio.h>

海贼王1000拼图技巧

#include <graphics.h>

海贼王1000拼图技巧

#include <conio.h>

#include 'resource.h'

#include <mmsystem.h>

#pragma comment(lib,'winmm.lib')

#include <stdlib.h>

#include <time.h>

#define WINDOW_WIDTH800

#define WINDOW_HEIGHT500

#define SIZE100

#define ROWWINDOW_WIDTH/SIZE

#define COLWINDOW_HEIGHT/SIZE

IMAGE Img[6];

IMAGE picImg[ROW*COL];

int map[ROW][COL];

bool GameInit();

void Welcome();

void RandArry();

void JigsawMain();

void DrawMap();

void PlayGame();

void JigsawInit();

int main()

{

int flag = 1;

if (!GameInit())

return -1;

Welcome();

MOUSEMSG msg = { 0 };

while (1)

{

msg = GetMouseMsg();

if (msg.x >= 320 && msg.x <= 450 && msg.y >= 370 && msg.y <= 420)

{

settextcolor(GREEN);

outtextxy(320, 370, L'Start');

}

else if (msg.x >= 320 && msg.x <= 450 && msg.y >= 425 && msg.y <= 475)

{

settextcolor(GREEN);

outtextxy(322, 425, L'Music');

}

else

{

settextcolor(RED);

outtextxy(320, 370, L'Start');//320 450 370 420

outtextxy(322, 425, L'Music');//322 452 425 475

}

switch (msg.uMsg)

{

case WM_LBUTTONDOWN:

if (msg.x >= 320 && msg.x <= 450 && msg.y >= 370 && msg.y <= 420)

{

//拼图

JigsawMain();

}

else if (msg.x >= 320 && msg.x <= 450 && msg.y >= 425 && msg.y <= 475)

{

flag = !flag;

PlaySound(NULL, NULL, NULL);

if (flag)

{

PlaySound(LPCWSTR(IDR_WAVE1), NULL, SND_LOOP | SND_RESOURCE | SND_ASYNC);

}

}

break;

}

}

_getch();

closegraph();

return 0;

}

bool GameInit()

{

initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);

PlaySound(LPCWSTR(IDR_WAVE1), NULL, SND_LOOP | SND_RESOURCE | SND_ASYNC);

srand((unsigned int)time(NULL));

//loadimage(&interImg, L'./image/界面.jpg', WINDOW_WIDTH,WINDOW_HEIGHT);

for (int i = 0; i < 6; i++)

{

loadimage(&Img[i], L'IMAGE', MAKEINTRESOURCE(IDR_IMAGE1 + i),

//80, 50);

WINDOW_WIDTH, WINDOW_HEIGHT);

}

return true;

}

void Welcome()

{

IMAGE tempImg;

int n = 0;

while (1)

{

rotateimage(&tempImg,&Img[0],n*360L/6,BLACK,false,true);

putimage(0, 0, &tempImg);

Sleep(100);

if (++n == 10)

break;

}

putimage(0, 0, &Img[0]);

setbkmode(TRANSPARENT);

settextstyle(50, 0, L'Rosewood Std Regular');

}

void JigsawMain()

{

JigsawInit();

while (1)

{

DrawMap();

PlayGame();

}

//num = 0;

//for (int i = 0; i < ROW; i++)

//{

//for (int j = 0; j < COL; j++)

//{

//putimage(i * SIZE, j * SIZE, &picImg[num]); //40 0 - 39

//num++;

//}

//}

getch();

}

void JigsawInit()

{

RandArry();

//setbkcolor(YELLOW);

cleardevice();

SetWorkingImage(&Img[rand() % 5 + 1]);

int num = 0;

for (int i = 0; i < ROW; i++)

{

for (int j = 0; j < COL; j++)

{

getimage(&picImg[num], i * SIZE, j * SIZE, SIZE, SIZE);

num++;

}

}

SetWorkingImage(NULL);

loadimage(&picImg[ROW*COL - 1], L'IMAGE', MAKEINTRESOURCE(IDR_IMAGE7), SIZE, SIZE);

}

void RandArry()

{

int temp[ROW*COL];

for (int i = 0; i < ROW*COL; i++)

{

temp[i] = i;

}

int num = 0;//一维数组的下标

int maxSize = ROW*COL;//temp数组的大小

for (int i = 0; i < ROW; i++)

{

for (int j = 0; j < COL; j++)

{

num = rand() % maxSize;

map[i][j] = temp[num];

//从选中的下标开始,把后面的元素移动一个单位

for (int tep = num; tep < maxSize - 1; tep++)

{

temp[tep] = temp[tep + 1];

}

maxSize--;

}

}

}

void DrawMap()

{

//把二维数组的元素跟图片绑定在一起

for (int i = 0; i < ROW; i++)

{

for (int j = 0; j < COL; j++)

{

putimage(i*SIZE, j*SIZE, &picImg[map[i][j]]);

}

}

}

void PlayGame()

{

int row, col;//鼠标点击的图片对应的数组下标

int blankR, blankC;//空白图片的对应的数组下标

int blankX, blankY;

MOUSEMSG msg = { 0 };

//1.鼠标点下去时 确定鼠标点的是哪张图片 确定空白图片的位置

//2.点中的图片是不是和空白图片是相邻的

//3.交换二维数组的这两个元素

for (int i = 0; i < ROW; i++)

{

for (int j = 0; j < COL; j++)

{

if (map[i][j] == ROW*COL - 1)

{

blankR = i;

blankC = j;

}

}

}

blankX = blankR*SIZE;

blankY = blankC*SIZE;

//确定鼠标点击图片的下标

msg = GetMouseMsg();

switch (msg.uMsg)

{

case WM_LBUTTONDOWN:

row = msg.x / SIZE;

col = msg.y / SIZE;

if ((msg.x > blankX&&msg.x<blankX + SIZE) && (msg.y>blankY - SIZE&&msg.y<blankY) ||

(msg.x>blankX - SIZE&&msg.x<blankX) && (msg.y>blankY &&msg.y < blankY + SIZE) ||

(msg.x>blankX + SIZE&&msg.x<blankX + SIZE * 2) && (msg.y>blankY &&msg.y < blankY + SIZE) ||

(msg.x>blankX &&msg.x<blankX + SIZE) && (msg.y>blankY + SIZE &&msg.y < blankY + 2 * SIZE))

{

map[blankR][blankC] = map[row][col];

map[row][col] = ROW*COL - 1;

}

break;

default:

break;

}

}

对了,下面我顺带也发一下头文件的吧,只是的话,素材肯定大家无法具备,到时候自己去配好,找好图片也是一样的哈。如果需要素材的话,可以加下群466572167(群内有各类型的基础项目以及大型的学习项目)

//{{NO_DEPENDENCIES}}

// Microsoft Visual C++ 生成的包含文件。

// 供 20170111_jigsaw.rc 使用

//

#define IDR_IMAGE1 101

#define IDR_IMAGE2 102

#define IDR_IMAGE3 103

#define IDR_IMAGE4 104

#define IDR_IMAGE5 105

#define IDR_IMAGE6 106

#define IDB_BITMAP1 107

#define IDR_WAVE1 113

#define IDR_IMAGE7 114

// Next default values for new objects

//

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE 115

#define _APS_NEXT_COMMAND_VALUE 40001

#define _APS_NEXT_CONTROL_VALUE 1001

#define _APS_NEXT_SYMED_VALUE 101

#endif

#endif

我的拼图图片用到了5张,也就是每一次打开都有不同的图片,下面我发出来给大家看一下

然后我把运行的效果图,以及界面发一下。


发一下效果图,可以加下群466572167,一起交流学习,群内也有各类型资料学习。

最后的话是自己玩成功的效果,这拼图还是挺难的哈,拼了十多分钟

涉及到的知识点也并不是很多的,只有 C语言里面的 一维数组 二维数组 以及简单的界面图形化编程,可以加下群466572167,一起交流学习,探讨知识点。其实的话C语言并不是很难,有时候自己能学个一两个知识点,动手去写个小项目,比如说贪吃蛇,或者推箱子,连连看,2048,动手去尝试写一下也是不错的,要学着写有界面的东西,不然写黑窗口,自己就会感觉太普通了,对于编程有兴趣的,希望大家能坚持吧。

收藏文章

收藏

文章标签: C语言     炫酷     海贼王    
上一篇:匠人心血的集大成者 三星S80PB带你解密手办/模型的制作 下一篇:文案创作指南:4个步骤,高转化率文案轻松完成