扫雷游戏适合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
#include //图形库
//#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|
//载入图片
void drawMap(){
for(int i=0;i30(标记) 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
定义界面:
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图形库函数