zoukankan      html  css  js  c++  java
  • 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张图片,为了简化难度,我加了一张纯数字的。

     部分截图:

    拼图成功后,会出现拼图成功的提示,因为素材限制,只能弄成下面的样。

    部分游戏截图:

    全部的代码和素材:

    https://download.csdn.net/download/qq_41505957/11446221

    下面是代码:

    #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 == '
    ')
    			break;
    
    }
    
    int main()
    {	
    	get_arr();                  //获取初始数组
    	choosephoto();             //选择图片
    	Game();                    //输出起始拼图
    	Gamestart();               //游戏开始
    	system("pause");
    	closegraph();              //关闭画布
    	return 0;
    }
  • 相关阅读:
    十二、redis常用的运维命令及注意参数
    十一,redis的主从集群
    十、redis的持久化配置
    九、Redis的消息发布和订阅
    八、Redis 中的事务
    apache、nginx、iis日志记录的各个字段内容与含义
    Pikachu-RCE
    Pikachu-SQL-Inject(SQL注入漏洞)
    Pikachu-CSRF(跨站请求伪造)
    Pikachu-XSS(跨站脚本)漏洞
  • 原文地址:https://www.cnblogs.com/zyq1758043090/p/11852541.html
Copyright © 2011-2022 走看看