C语言入门项目——扫雷游戏(ege图形库+codeblocks)

扫雷游戏适合C练手,会C基本语法就可以尝试。需要导入ege图形库(文章后半部分写了ege如何导入codeblocks,以及我用到的ege函数)

一、先介绍如何将ege图形库导入codeblocks:
1、下载codeblocks
2、下载ege图形库的文件包 官方网址:ege图形库主站
(1)打开下载好的压缩包,找到ege文件夹中的include中的内容。在这里插入图片描述
在这里插入图片描述
将ege中include中的上述六个文件复制粘贴到codeblocks的include中。
在这里插入图片描述
(2)和上面(1)的操作相同,把ege文件夹中的lib中的内容复制粘贴到codeblocks的lib中。
在这里插入图片描述
注意:如果在有出现有64位的和32位的mingw,应选32位的,因为ege库本身是32位,添加64的会报错。在这里插入图片描述

	(3)点开codeblock,新建一个C++project,点击project---->build options---->选linker setting---->在link libraries中点add---->点打开文件夹的那个图标---->进入lib文件夹后,把这8个添加进去:"libgraphics.a""libgdi32.a" "libimm32.a" "libmsimg32.a""libole32.a" "liboleaut32.a" "libwinmm.a""libuuid.a"
			添加完成后点ok。

二、扫雷游戏源代码:

//头文件

#include <bits/stdc++.h>
#include <graphics.h>  //图形库
//#pragma comment(lib,"winmm.lib")
using namespace std;

#define ROW 15      //行
#define COL 15      //列
#define NUM 15      //雷的个数
#define SIZE 20     //图片大小50

ege::MUSIC music1;    //定义音乐
ege::MUSIC music2;
ege::MUSIC music3;

int blank=0;    //点开空白的个数      ROW*COL-NUM==count 即获胜
int mp[ROW+2][COL+2];   分为辅助区和游戏区    (定义在全局的数组都是初始化了的(值全为0))

    PIMAGE img0;     //定义图片
    PIMAGE img1;
    PIMAGE img2;
    PIMAGE img3;
    PIMAGE img4;
    PIMAGE img5;
    PIMAGE img6;
    PIMAGE img7;
    PIMAGE img8;
    PIMAGE img9;
    PIMAGE img10;
    PIMAGE img11;

//绘制函数

//绘制函数(打印二维数组)
void gameDraw(){
    for(int i=1;i<=ROW;i++){
        for(int j=1;j<=COL;j++){
            printf("%02d ",mp[j][i]);
        }
        printf("\n");
    }
}

//初始化游戏函数(新开始一局游戏重新设定)

//初始化函数
void gameInit(){

    srand((unsigned int)time(NULL));   //随机数播种

    for(int i=0;i<ROW+2;i++){         //初始化数组
        for(int j=0;j<COL+2;j++){
            mp[i][j]=0;
        }
    }

    for(int i=0;i<NUM;i++){     //布雷
        int r=rand()%ROW+1;   //可设雷的行范围为1~ROW
        int c=rand()%COL+1;   //列范围为1~COL   游戏区
        if(mp[r][c]==0) mp[r][c]=-1;
    }

    for(int i=1;i<ROW+1;i++){        //计算游戏区每个数所在的九宫格有几个雷
        for(int j=1;j<COL+1;j++){
            if(mp[i][j]==0){
                for(int m=i-1;m<=i+1;m++){
                    for(int n=j-1;n<=j+1;n++){
                        if(mp[m][n]==-1){
                            mp[i][j]++;
                        }
                    }
                }
            }
        }
    }
    //简单加密+20
        for(int i=1;i<=ROW;i++){
            for(int j=1;j<=COL;j++){
                mp[i][j]+=20;
            }
        }

}

//载入图片

void drawMap(){
    for(int i=0;i<ROW+1;i++){
        for(int j=0;j<COL+1;j++){
           // printf("%2d",mp[i][j]);
               /* ##################################################################
          元素                    图片
         -1(雷)                  img[9]
         0~8(数字)            img[0]~img[8]
         19~28(空白)             img[10]
         >30(标记)              img[11]
      ################################################################### */
            if(mp[i][j]==-1){
                putimage((i-1)*SIZE,(j-1)*SIZE,img9);  //雷
            }else if(mp[i][j]==0){
                putimage((i-1)*SIZE,(j-1)*SIZE,img0);   //数字0
            }else if(mp[i][j]==1){
                putimage((i-1)*SIZE,(j-1)*SIZE,img1);   //数字1
            }else if(mp[i][j]==2){
                putimage((i-1)*SIZE,(j-1)*SIZE,img2);   //数字2
            }else if(mp[i][j]==3){
                putimage((i-1)*SIZE,(j-1)*SIZE,img3);   //数字3
            }else if(mp[i][j]==4){
                putimage((i-1)*SIZE,(j-1)*SIZE,img4);   //数字4
            }else if(mp[i][j]==5){
                putimage((i-1)*SIZE,(j-1)*SIZE,img5);   //数字5
            }else if(mp[i][j]==6){
                putimage((i-1)*SIZE,(j-1)*SIZE,img6);   //数字6
            }else if(mp[i][j]==7){
                putimage((i-1)*SIZE,(j-1)*SIZE,img7);   //数字7
            }else if(mp[i][j]==8){
                putimage((i-1)*SIZE,(j-1)*SIZE,img8);   //数字8
            }else if(mp[i][j]>=19&&mp[i][j]<=28){
                putimage((i-1)*SIZE,(j-1)*SIZE,img10);      //空白图片
            }else if(mp[i][j]>30){
                putimage((i-1)*SIZE,(j-1)*SIZE,img11);       //标记
            }
        }
    }
}

//翻开空白出现到0后展开九宫格

void openZero(int r,int c){
    //先打开这个0
    mp[r][c]-=20;
    blank++;

    for(int m=r-1;m<=r+1;m++){
        for(int n=c-1;n<=c+1;n++){
            if(m>=1&&m<=ROW&&n>=1&&n<=COL){    //确保0位于游戏区
                if(mp[m][n]>=19&&mp[m][n]<=28){
                    if(mp[m][n]!=20){
                        mp[m][n]-=20;
                        blank++;
                    }else{
                        openZero(m,n);
                    }
                }

            }
        }
    }

}

//游戏开始

int playGame(){    //玩游戏
    //定义一个鼠标消息
    mouse_msg msg={0};
    int r,c;     //定义鼠标的行和列
    while(1){
        //msg=getmouse();  //获取鼠标消息信息

        while(mousemsg()){

            msg=getmouse();  //获取鼠标消息信息

            if(msg.is_down()&&msg.is_left()){     //左键按下:翻开 空白图片19~28
                r=msg.x/SIZE+1;
                c=msg.y/SIZE+1;
                if(mp[r][c]>=19&&mp[r][c]<=28){
                    if(mp[r][c]==20){     //翻开是0
                        openZero(r,c);
                    }else{
                        mp[r][c]-=20;     //-1~8
                        blank++;
                    }
                }
                return mp[r][c];
                break;
            }else if(msg.is_down()&&msg.is_right()){       //右键按下:标记一个空白图片,取消一个标记
                r=msg.x/SIZE+1;
                c=msg.y/SIZE+1;
                if(mp[r][c]>=19&&mp[r][c]<=28){
                    mp[r][c]+=50;     //标记>30
                }else if(mp[r][c]>30){
                    mp[r][c]-=50;
                }
                return mp[r][c];
                break;
            }
        }
    }
}

//主函数

int main(){
    //HWND hwnd=initgraph(ROW*SIZE,COL*SIZE,SHOWCONSOLE);
     initgraph(ROW*SIZE,COL*SIZE);    //界面

     /*mciSendString("open \"pic\win.mp3\" alias music",NULL,0,NULL);
     mciSendString("play file",NULL,0,NULL);
*/

    music1.OpenFile("bgm.mp3");
    music1.Play();

     img0=newimage();
     img1=newimage();
     img2=newimage();
     img3=newimage();
     img4=newimage();
     img5=newimage();
     img6=newimage();
     img7=newimage();
     img8=newimage();
     img9=newimage();
     img10=newimage();
     img11=newimage();
   /*for(int i=0;i<11;i++){
        getimage(imgi,"i.jpg");  //0~8为数字图片。9是雷。10是空白。11是标记图片
   }*/
   // loadimage(&img[0],L"0.jpg",50,50);  把0.jpg这张图片以50*50的大小保存到img[0]中
    getimage(img0,"pic/0.jpg");
    getimage(img1,"pic/1.jpg");
    getimage(img2,"pic/2.jpg");
    getimage(img3,"pic/3.jpg");
    getimage(img4,"pic/4.jpg");
    getimage(img5,"pic/5.jpg");
    getimage(img6,"pic/6.jpg");
    getimage(img7,"pic/7.jpg");
    getimage(img8,"pic/8.jpg");
    getimage(img9,"pic/9.jpg");
    getimage(img10,"pic/10.png");
    getimage(img11,"pic/11.png");

    gameInit();
    gameDraw();

    while(1){      //防止闪退
        drawMap();
       /* if(playGame()==0){

            openZero(r,c);
        }*/
        if(playGame()==-1){    //点到雷

            music2.OpenFile("fail.mp3");
            music2.Play();

            drawMap();
            music1.Stop();
            MessageBox(NULL,"\t\tGame over!\n\n\t\t是否继续游戏?","提示",3);

            break;
        }
        if(ROW*COL-NUM==blank){
            music1.Stop();
            music3.OpenFile("win.mp3");
            music3.Play();
            MessageBox(NULL,"\t Congratulate,You win!\n\n\t是否继续游戏?","提示",4);
            break;
        }

        //closegraph();
    }
    return 0;
}

三、我所用到的ege函数

	头文件:#include <graphics.h>
   
    定义界面:
	intigraphy(size,size);    // 界面
	
    鼠标:
     mouse_msg msg={0};     //定义一个鼠标消息
      msg=getmouse();  //获取鼠标消息信息
      mousemsg();       // 有鼠标消息
      msg.is_down();      // 鼠标按下
      msg.is_left();     //  鼠标左键
	  msg.is_right();     //  鼠标右键


	  图片:
	  PIMAGE img0;     //定义图片  
	  img0=newimage();			

      getimage(img0,"pic/0.jpg");    // 获取图片

     putimage(SIZE,SIZE,img0);    // 载入图片

    音乐:
	 ege::MUSIC music1;    //定义音乐
     music2.OpenFile("fail.mp3");    // 打开音乐所在的文件
     music2.Play();    // 播放音乐
     music1.Pause();    // 暂停音乐
     music1.Stop();      //停止音乐



    弹框(游戏获胜或失败后弹出):
    MessageBox(NULL,"\t\tGame over!\n\n\t\t是否继续游戏?","提示",3);

参考链接:ege图形库函数

  • 3
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值