zoukankan      html  css  js  c++  java
  • c语言推箱子 扫雷项目

    推箱子

    两关的推箱子用到一个三维数组

    用到的图片数据如下

    https://pan.baidu.com/s/1IDE4GQLo46cxNywDqwxmlQ

    密码:jdel

    代码如下:

    #include<stdio.h>#include<easyx.h>#include<conio.h>//getch不显示字母#include<mmsystem.h>#pragmacomment(lib,"winmm.lib")//PlaySound播放wav//mciSendString放mp3intmyMap[2][8][10]={{//8行9列-->8行10列0,1,1,1,1,1,1,1,0,0,0,1,0,2,4,4,4,1,0,0,0,1,0,0,0,1,1,1,1,0,1,1,1,3,0,0,0,0,1,0,1,0,0,0,1,3,1,0,1,0,1,0,3,0,1,0,0,0,1,0,1,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,0,0,0,0},{//7行10列-->8行100,0,0,1,1,1,1,1,1,0,0,1,1,1,0,0,0,0,1,0,1,1,4,0,3,1,1,0,1,1,1,4,4,3,0,3,0,0,2,1,1,4,4,0,3,0,3,0,1,1,1,1,1,1,1,1,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0}};//初始地图intmap[8][10];//正在使用地图IMAGEimg[6];intlevel=0;intflag;//当前关卡是否结束intop[100];//保存最近100次的操作inttimes=0;//保存的操作次数现在可以回撤次数voidrecord(intre)//记录每次的操作用于每部操作之后放到数组中{op[times++]=re;}voidrecall(){if(times==0)return;//无法撤回times--;intx,y;for(inti=0;i<8;i++){for(intj=0;j<10;j++){if(map[i][j]==2||map[i][j]==6)//人或者人在目的地上{x=i;y=j;}}}//用x,y来表示人的位置switch(op[times]){case0://直接往下走map[x][y]-=2;map[x+1][y]+=2;break;case1://带箱子往下走map[x][y]+=1;map[x+1][y]+=2;//箱子下去了map[x-1][y]-=3;break;case2://直接往上走map[x][y]-=2;map[x-1][y]+=2;break;case3://带着箱子往上走map[x][y]+=1;map[x+1][y]-=3;map[x-1][y]+=2;break;case4://直接往右走map[x][y]-=2;map[x][y+1]+=2;break;case5:map[x][y]+=1;map[x][y+1]+=2;map[x][y-1]-=3;break;case6://直接往左走map[x][y]-=2;map[x][y-1]+=2;break;case7:map[x][y]+=1;map[x][y-1]+=2;map[x][y+1]-=3;break;}}voidloadMap()//加载地图{for(inti=0;i<8;++i){for(intj=0;j<10;j++){map[i][j]=myMap[level][i][j];//把第几关的地图放进map}}}voiddrawMap()//利用数字进行贴图{BeginBatchDraw();//双缓冲贴图优化贴图效果putimage(0,0,&img[0]);for(inti=0;i<8;++i){for(intj=0;j<10;++j){switch(map[i][j]){case0://空地break;case1://墙壁putimage(j*50,i*50,&img[1]);break;case2://putimage(j*50,i*50,&img[2]);break;case3:putimage(j*50,i*50,&img[3]);break;case4:putimage(j*50,i*50,&img[4]);break;case6:putimage(j*50,i*50,&img[2]);break;case7:putimage(j*50,i*50,&img[5]);break;}}}EndBatchDraw();}voidplay(){intx,y;//保存人的位置for(inti=0;i<8;i++){for(intj=0;j<10;j++){if(map[i][j]==2||map[i][j]==6)//人或者人在目的地上{x=i;y=j;}}}//找到人开始操作getch直接读取键盘的一个字符头文件conio.h//getch直接按就有反应getchar按完需要回车才有反应switch(getch()){case'w':case'W':if(map[x-1][y]==0||map[x-1][y]==4)//上方可以走或者上面是目的地或者空地{map[x][y]-=2;map[x-1][y]+=2;record(0);}elseif(map[x-1][y]==3||map[x-1][y]==7)//上方是箱子或者目的地箱子{if(map[x-2][y]==0||map[x-2][y]==4){map[x][y]-=2;map[x-1][y]-=1;map[x-2][y]+=3;record(1);}}break;case'a':case'A':if(map[x][y-1]==0||map[x][y-1]==4){map[x][y]-=2;map[x][y-1]+=2;record(4);}elseif(map[x][y-1]==3||map[x][y-1]==7){if(map[x][y-2]==0||map[x][y-2]==4){map[x][y]-=2;map[x][y-1]-=1;map[x][y-2]+=3;record(5);}}break;case's':case'S':if(map[x+1][y]==0||map[x+1][y]==4){map[x][y]-=2;map[x+1][y]+=2;record(2);}elseif(map[x+1][y]==3||map[x+1][y]==7){if(map[x+2][y]==0||map[x+2][y]==4){map[x][y]-=2;map[x+1][y]-=1;map[x+2][y]+=3;record(3);}}break;case'd':case'D':if(map[x][y+1]==0||map[x][y+1]==4){map[x][y]-=2;map[x][y+1]+=2;record(6);}elseif(map[x][y+1]==3||map[x][y+1]==7){if(map[x][y+2]==0||map[x][y+2]==4){map[x][y]-=2;map[x][y+1]-=1;map[x][y+2]+=3;record(7);}}break;//如果方向键盘上下左右72807577case'r':case'R':recall();break;default:break;}}voidwin(){intboxNum=0;for(inti=0;i<8;i++){for(intj=0;j<10;j++){if(map[i][j]==3){boxNum++;if(map[i-1][j]==1||map[i+1][j]==1)//上下至少一睹墙{if(map[i][j-1]==1||map[i][j+1]==1){flag=-1;return;}}}}}if(boxNum==0){flag=1;//所有的箱子都推到目的地上游戏赢return;}flag=0;}intmain(){mciSendString(L"open遥远的你.mp3",0,0,0);mciSendString(L"play遥远的你.mp3",0,0,0);initgraph(500,400);loadimage(&img[0],L"素材/背景.jpg",500,400);loadimage(&img[1],L"素材/墙.jpg",50,50);loadimage(&img[2],L"素材/人物.jpg",50,50);loadimage(&img[3],L"素材/箱子.jpg",50,50);loadimage(&img[4],L"素材/目的地.jpg",50,50);loadimage(&img[5],L"素材/源氏.jpg",50,50);loadMap();//加载第一关while(1){drawMap();//画图play();win();if(flag==0)//没输没赢继续{}elseif(flag==1)//{level++;//关卡加1下一关times=0;//清空回撤记录drawMap();if(level==2){MessageBox(GetHWnd(),L"游戏结束",L"恭喜",MB_OK);break;//结束}else{if(MessageBox(GetHWnd(),L"是否进入下一关?",L"恭喜",MB_OKCANCEL)==IDOK)//IDCANCEL要么好要么不好{loadMap();flag=0;}elsebreak;}}else{drawMap();if(MessageBox(GetHWnd(),L"是否重新玩?",L"抱歉",MB_OKCANCEL)==IDOK){//level=0;//从最初的那关开始玩times=0;loadMap();//重新加载新地图}elsebreak;}}//getchar();closegraph();return0;}
    推箱子代码

    扫雷

    扫雷素材:

    https://pan.baidu.com/s/1oAAuPHCzfxiLggQuB7wFfw

    密码:5rxd

      1 #include<stdio.h>
      2 #include<graphics.h>
      3 #include<stdlib.h>
      4 #include<time.h>
      5 #include<Windows.h>
      6 #include<mmsystem.h>
      7 #pragma comment(lib,"WINMM.LIB")
      8 
      9 void drawMap(int map[][15], IMAGE img[]);
     10 void init(int map[][15], IMAGE img[],int bobNum);
     11 int play(int map[][15]);
     12 int open(int map[][15], int x, int y);//打开0周围的一片
     13 int main()
     14 {
     15     mciSendString(L"open  遥远的你.mp3", 0, 0, 0);
     16     mciSendString(L"play  遥远的你.mp3", 0, 0, 0);
     17     int map[10][15] = {0};
     18     srand((unsigned)time(NULL));
     19     int bobNum = rand() % 10 + 10;
     20     IMAGE img[12];
     21     init(map, img,bobNum);
     22     initgraph(15*50, 10*50);//图形库窗口
     23 
     24     int num,sum=0;
     25     while (1)
     26     {
     27         drawMap(map, img);
     28         num=play(map);
     29         sum += num;
     30         if (num == -1)
     31         {
     32             drawMap(map, img);
     33             MessageBox(GetHWnd(), L"踩到雷了", L"BOOM", MB_OK);
     34             break;
     35         }
     36         else if (sum==15*10-bobNum)//是不是踩完了 踩的总个数==地图大小-雷的个数
     37         {
     38             drawMap(map, img);
     39             MessageBox(GetHWnd(), L"恭喜", L"GOOD", MB_OK);
     40             break;
     41         }
     42     }
     43     closegraph();
     44     return 0;
     45 }
     46 //画图函数 作用画图 是否需要返回值?
     47 void drawMap(int map[][15],IMAGE img[])
     48 {
     49     for (int i = 0; i < 10; ++i)
     50     {
     51         for (int j = 0; j < 15; ++j)
     52         {
     53             if (map[i][j] >= -1 && map[i][j] <= 8)//没有分开
     54             {
     55                 putimage(j * 50, i * 50, &img[10]);
     56             }
     57             else if (map[i][j]>18)
     58             {
     59                 putimage(j * 50, i * 50, &img[11]);
     60             }
     61             else
     62             switch (map[i][j])
     63             {
     64             case 9://
     65                 putimage(j * 50, i * 50, &img[9]);break;
     66             case 10:putimage(j * 50, i * 50, &img[0]); break;
     67             case 11:putimage(j * 50, i * 50, &img[1]); break;
     68             case 12:putimage(j * 50, i * 50, &img[2]); break;
     69             case 13:putimage(j * 50, i * 50, &img[3]); break;
     70             case 14:putimage(j * 50, i * 50, &img[4]); break;
     71             case 15:putimage(j * 50, i * 50, &img[5]); break;
     72             case 16:putimage(j * 50, i * 50, &img[6]); break;
     73             case 17:putimage(j * 50, i * 50, &img[7]); break;            
     74             case 18:putimage(j * 50, i * 50, &img[8]); break;
     75             default:
     76                 break;
     77             }
     78         }
     79     }
     80 }
     81 void init(int map[][15], IMAGE img[], int bobNum)
     82 {
     83 
     84     int x, y; 
     85     for (int i = 0; i < bobNum;)
     86     {
     87         x = rand() % 10;
     88         y = rand() % 15;
     89         if (map[x][y] == 0)//这个位置没有雷
     90         {
     91             map[x][y] = -1;//随机位置放一个雷
     92             ++i;
     93         }
     94 
     95     }
     96     for (int i = 0; i < 10; ++i)
     97     {
     98         for (int j = 0; j < 15; ++j)
     99         {
    100             if (map[i][j] == -1)
    101             {
    102                 //给上下左右加上1
    103                 for (int x = i - 1; x <= i + 1; ++x)
    104                 {
    105                     for (int y = j - 1; y <= j + 1; ++y)
    106                     {
    107                         if (x >= 0 && x<10 && y >= 0 && y < 15 && map[x][y] != -1)
    108                         {
    109                             map[x][y]++;//不是雷的位置加1
    110                         }
    111                     }
    112                 }
    113             }
    114         }
    115     }
    116     //for (int i = 0; i < 10; ++i)
    117     //{
    118     //    for (int j = 0; j < 15; ++j)
    119     //    {
    120     //        printf("%d	", map[i][j]);
    121     //    }
    122     //    printf("
    ");
    123     //}
    124     loadimage(&img[0], L"素材2/space.jpg", 50, 50);
    125     loadimage(&img[1], L"素材2/1.jpg", 50, 50);
    126     loadimage(&img[2], L"素材2/2.jpg", 50, 50);
    127     loadimage(&img[3], L"素材2/3.jpg", 50, 50);
    128     loadimage(&img[4], L"素材2/4.jpg", 50, 50);
    129     loadimage(&img[5], L"素材2/5.jpg", 50, 50);
    130     loadimage(&img[6], L"素材2/6.jpg", 50, 50);
    131     loadimage(&img[7], L"素材2/7.jpg", 50, 50);
    132     loadimage(&img[8], L"素材2/8.jpg", 50, 50);
    133     loadimage(&img[9], L"素材2/hitmine.jpg", 50, 50);//
    134     loadimage(&img[10], L"素材2/stone.jpg", 50, 50);//石头
    135     loadimage(&img[11], L"素材2/flag.jpg", 50, 50);//旗帜
    136 
    137 }
    138 //play 1.有没有踩到雷 2.点开几个位置(翻开了几次)
    139 int play(int map[][15])
    140 {
    141     MOUSEMSG msg;//保存鼠标信息
    142     while (1)
    143     {
    144         msg = GetMouseMsg();//获取鼠标信息
    145         int i, j;
    146         switch (msg.uMsg)
    147         {
    148         case WM_LBUTTONDOWN://左键按下
    149             //左键按下的位置是属于数组的哪个元素
    150             i = msg.y / 50;
    151             j = msg.x / 50;
    152             //-1~8之间的数字 表示没有翻开
    153             //9~18之间的数字 表示翻开
    154             //-1+10-->9
    155             //写标记 只有没有翻开的位置才可以标记 标记+20
    156             //19~28 表示这个位置是标记过的
    157             if (map[i][j] == 0)
    158             {
    159                 int num=open(map, i, j);
    160                 //for (int x = i - 1; x <= i + 1; ++x)
    161                 //{
    162                 //    for (int y = j - 1; y <= j + 1; ++y)
    163                 //    {
    164                 //        if (x >= 0 && x < 10 && y >= 0 && y < 15)//判断是否越界
    165                 //        {
    166                 //            if (map[x][y] <= 8 && map[x][y] >= -1)//判断是否翻开
    167                 //            {
    168                 //                map[x][y] += 10;//翻开周围一片
    169                 //            }
    170                 //        }
    171                 //    }
    172                 //}
    173                 return num;
    174             }
    175             if (map[i][j] <= 8 && map[i][j] >= 1)//能不能点开
    176             {
    177                 map[i][j] += 10;
    178                 return 1;
    179             }//
    180             else if (map[i][j] == -1)
    181             {
    182                 map[i][j] += 10;
    183                 return -1;
    184             }
    185                 break;
    186         case WM_RBUTTONDOWN://鼠标右键按下
    187             i = msg.y / 50;
    188             j = msg.x / 50;
    189             //如果已经标记了的 可以取消标记
    190             //如果是没有标记过  并且没有翻开的 点开标记
    191             if (map[i][j] <= 8 && map[i][j] >= -1)
    192             {
    193                 map[i][j] += 20;
    194                 return 0;
    195             }
    196             else if (map[i][j] >= 18)
    197             {
    198                 map[i][j] -= 20;
    199                 return 0;
    200             }
    201         default:
    202             break;
    203         }
    204     }
    205 }
    206 int open(int map[][15], int x, int y)
    207 {
    208     int num = 1;
    209     map[x][y] += 10;
    210     for (int i = x - 1; i <= x + 1; ++i)
    211     {
    212         for (int j = y - 1; j <= y + 1; ++j)
    213         {
    214             if (i >= 0 && i<10 && j>=0 && j < 15)
    215             {
    216                 if (map[i][j] == 0)
    217                 {
    218                     num+=open(map, i, j);//如果周围有0那么翻开周围的0
    219                 }
    220                 else if (map[i][j] >= -1 && map[i][j] <= 8)
    221                 {
    222                     map[i][j] += 10;
    223                     num++;
    224                 }
    225             }
    226         }
    227     }
    228     return num;
    229 }
    230 //获取鼠标信息方法
    231 //        WM_MOUSEMOVE        鼠标移动
    232 //        WM_MOUSEWHEEL        鼠标滚轮拨动
    233 //        WM_LBUTTONDOWN        左键按下
    234 //        WM_LBUTTONUP        左键弹起
    235 //        WM_LBUTTONDBLCLK    左键双击
    236 //        WM_MBUTTONDOWN        中键按下
    237 //        WM_MBUTTONUP        中键弹起
    238 //        WM_MBUTTONDBLCLK    中键双击
    239 //        WM_RBUTTONDOWN        右键按下
    240 //        WM_RBUTTONUP        右键弹起
    241 //        WM_RBUTTONDBLCLK    右键双击
    View Code
  • 相关阅读:
    Linq之旅:Linq入门详解(Linq to Objects)【转】
    Shadow Map 原理和改进 【转】
    OSG 中文解决方案 【转】
    shadow mapping实现动态shadow实现记录 【转】
    RenderMonkey 练习 第六天 【OpenGL Water 水效】
    glsl水包含倒影的实现(rtt) 【转】
    Docker镜像仓库Harbor之搭建及配置
    docker登录没有配置https的harbor镜像仓库
    Git 清除远端已删除的分支
    单节点k8s的一个小例子 webapp+mysql
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/10459447.html
Copyright © 2011-2022 走看看