最近闲着无聊,写了一个拼图游戏,正好学习一下图片的处理。
效果图如下:
程序中用到了图形库操作,把一张图片分割,用一个二维数组代表各个碎片,初始打乱数组就可以得到打乱的图片。
void get_arr() { int book[10] = { 0 }; srand((unsigned int)time(NULL)); //设置时间种子 for(int i=0; i<3; i++) //随机arr数组,打乱图片顺序 for (int j = 0; j < 3; j++) { if (i == 2 && j == 2) break; while (1) { int s = rand() % 8; if (book[s] == 0) { book[s] = 1; arr[i][j] = s; break; } } } arr[2][2] = 9; }
因为这里数字并不大,所以我就暴力写了一下。
总共有5张图片,为了简化难度,我加了一张纯数字的。
部分截图:
拼图成功后,会出现拼图成功的提示,因为素材限制,只能弄成下面的样。
部分游戏截图:
全部的代码和素材:C语言拼图游戏
下面是代码:
#include <stdio.h> #include <stdlib.h> #include <graphics.h> #include <windows.h> #include <conio.h> #include<time.h> #include <iostream> #include <algorithm> #define N 600 //图片长和宽,为便于计算取600 #define M N/3 //分为9块,每块有 using namespace std; IMAGE t, over; int arr[5][5]; void get_arr() { int book[10] = { 0 }; srand((unsigned int)time(NULL)); //设置时间种子 for(int i=0; i<3; i++) //随机arr数组,打乱图片顺序 for (int j = 0; j < 3; j++) { if (i == 2 && j == 2) break; while (1) { int s = rand() % 8; if (book[s] == 0) { book[s] = 1; arr[i][j] = s; break; } } } arr[2][2] = 9; } void choosephoto() { int choose; srand((unsigned int)time(NULL)); //设置时间种子 choose = rand() % 5; //选择图片 if(choose==0) loadimage(&t, "少司命.jpeg", N, N); //加载图片 if (choose == 1) loadimage(&t, "柯南.jpg", N, N); if (choose == 2) loadimage(&t, "马里奥.jpeg", N, N); if (choose == 3) loadimage(&t, "火影.jpeg", N, N); if (choose == 4) loadimage(&t, "数字.png", N, N); } void Game() //显示拼图 { initgraph(N, N); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { putimage(j * M, i * M, M, M, &t, arr[i][j]%3*M, arr[i][j]/3*M); //切割图片 } } } int GameOver() { int temp = 1; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (arr[i][j] != 3 * i + j) { temp = 0; break; } } if (temp == 0) break; } if (temp == 1) { loadimage(&over, "游戏结束.png", 400, 400); putimage(100, 100, &over); return 1; } } void Gamestart() { char ch; int tx, ty; while (1) { if (_kbhit()) { //检测键盘输入 for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) if (arr[i][j] == 9) { tx = i; ty = j; break; } } ch = _getch(); if (ch == 72 || ch=='w') //按键为w或者上 { if (tx >= 1) { //swap(arr[tx][ty], arr[tx - 1][ty]); int x = arr[tx][ty]; arr[tx][ty] = arr[tx - 1][ty]; arr[tx - 1][ty] = x; } } else if (ch == 75 || ch=='a') //按键为a或者左 { if (ty >= 1) { int x = arr[tx][ty]; arr[tx][ty] = arr[tx][ty - 1]; arr[tx][ty - 1] = x; } } else if (ch == 80 || ch=='s') //按键为s或者下 { if (tx < 2) { int x = arr[tx][ty]; arr[tx][ty] = arr[tx + 1][ty]; arr[tx + 1][ty] = x; } } else if (ch == 77 || ch=='d') //按键为d或者右 { if (ty < 2) { int x = arr[tx][ty]; arr[tx][ty] = arr[tx][ty + 1]; arr[tx][ty + 1] = x; } } Game(); //输出拼图界面 if (GameOver()) break; } } while (ch=getchar()) if (ch == '\n') break; } int main() { get_arr(); //获取初始数组 choosephoto(); //选择图片 Game(); //输出起始拼图 Gamestart(); //游戏开始 system("pause"); closegraph(); //关闭画布 return 0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。