C语言打造——炫酷海贼王拼图
发布时间:2023-05-19 11:50:20 作者:互联网收集 浏览量:236
写拼图,找好素材,自然我也喜欢找一个好看点的界面,我就以海贼王为题材,用C语言写一个拼图游戏,涉及到的知识点也不是很多,等会我最后总结一下,先把代码发出来吧,还加上了音乐。
#include <stdio.h>
#include <graphics.h>
#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,动手去尝试写一下也是不错的,要学着写有界面的东西,不然写黑窗口,自己就会感觉太普通了,对于编程有兴趣的,希望大家能坚持吧。
收藏