1. 程式人生 > 程式設計 >C語言實現拼圖小遊戲

C語言實現拼圖小遊戲

最近閒著無聊,寫了一個拼圖遊戲,正好學習一下圖片的處理。

效果圖如下:

C語言實現拼圖小遊戲

程式中用到了圖形庫操作,把一張圖片分割,用一個二維陣列代表各個碎片,初始打亂陣列就可以得到打亂的圖片。

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語言實現拼圖小遊戲

部分截圖:

C語言實現拼圖小遊戲

拼圖成功後,會出現拼圖成功的提示,因為素材限制,只能弄成下面的樣。

C語言實現拼圖小遊戲

部分遊戲截圖:

C語言實現拼圖小遊戲

全部的程式碼和素材: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);
 if (choose == 2)
 loadimage(&t,"馬里奧.jpeg",N);
 if (choose == 3)
 loadimage(&t,"火影.jpeg",N);
 if (choose == 4)
 loadimage(&t,"數字.png",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,&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;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。