日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

opencv+c++写的小游戏,泡泡堂超级基础版

發布時間:2024/3/26 c/c++ 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv+c++写的小游戏,泡泡堂超级基础版 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2018.7.3--2018.7.14,這是這幾天的成果,從安裝編譯器,到配置環境,到學習新的編譯器使用,到學習C++,學習opencv,再到寫出整個游戲,經歷了很多,也學會了很多,不怕軟件崩,不怕電腦崩,更要不怕心態崩,要真正的靜下心來面對自己的代碼,面對自己的人物,希望以后真正成為一名程序媛的時候,這些經歷會成為我美好的回憶

1:主函數控制整個程序的運行

#include "stdafx.h"
#include"Game.h"
#include"BackMusic.h"

int main()

{
?? ?CBackMusic music;
?? ?music.PlayMusic();
?? ?CGame game;
?? ?game.Run();
?? ?return 0;
}

2:接下來分別寫人物地圖爆炸背景音樂以及控制游戲各種界面跳轉的游戲類

人物類:

#include "stdafx.h"
#include "Player.h"


CPlayer::CPlayer()
{
?? ?m_ori = 0;
?? ?char name[100];
?? ?for (int i = 0; i < 4; i++)
?? ?{
?? ??? ?sprintf_s(name, "image\\player%d.jpg", i);
?? ??? ?m_img[i] = cvLoadImage(name);
?? ?}
?? ?m_pos.x = 40;
?? ?m_pos.y = 40;
?? ?m_speed = 40;
}


CPlayer::~CPlayer()
{
?? ?for (int i = 0; i < 4; i++)
?? ?{
?? ??? ?cvReleaseImage(&m_img[i]);
?? ?}
}

void CPlayer::Move(char key, CGameMap * map)
{
?? ?int x = m_pos.x;
?? ?int y = m_pos.y;
?? ?switch (key)
?? ?{
?? ?case 'W':
?? ?case 'w':
?? ??? ?if (y > 0)
?? ??? ?{
?? ??? ??? ?m_ori = 0;
?? ??? ??? ?y -= m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'S':
?? ?case 's':
?? ??? ?if (y < 600)
?? ??? ?{
?? ??? ??? ?m_ori = 3;
?? ??? ??? ?y += m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'A':
?? ?case 'a':
?? ??? ?if (x > 0)
?? ??? ?{
?? ??? ??? ?m_ori = 2;
?? ??? ??? ?x -= m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'D':
?? ?case 'd':
?? ??? ?if (x <660)
?? ??? ?{
?? ??? ??? ?m_ori = 1;
?? ??? ??? ?x += m_speed;
?? ??? ?}
?? ??? ?break;
?? ?}
?? ?if (map->Judge(x, y))
?? ?{
?? ??? ?m_pos.x = x;
?? ??? ?m_pos.y = y;
?? ?}
}

void CPlayer::Move(char key, CLevelTwoMap * map)
{
?? ?int x = m_pos.x;
?? ?int y = m_pos.y;
?? ?switch (key)
?? ?{
?? ?case 'W':
?? ?case 'w':
?? ??? ?if (y > 0)
?? ??? ?{
?? ??? ??? ?m_ori = 0;
?? ??? ??? ?y -= m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'S':
?? ?case 's':
?? ??? ?if (y < 600)
?? ??? ?{
?? ??? ??? ?m_ori = 3;
?? ??? ??? ?y += m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'A':
?? ?case 'a':
?? ??? ?if (x > 0)
?? ??? ?{
?? ??? ??? ?m_ori = 2;
?? ??? ??? ?x -= m_speed;
?? ??? ?}
?? ??? ?break;
?? ?case 'D':
?? ?case 'd':
?? ??? ?if (x <660)
?? ??? ?{
?? ??? ??? ?m_ori = 1;
?? ??? ??? ?x += m_speed;
?? ??? ?}
?? ??? ?break;
?? ?}
?? ?if (map->Judge(x, y))
?? ?{
?? ??? ?m_pos.x = x;
?? ??? ?m_pos.y = y;
?? ?}
}

void CPlayer::DrawtoBack(IplImage * back)
{
?? ?CTools::DrawtoBack(back, m_img[m_ori], m_pos.x, m_pos.y, 225, 225, 225);
}

地圖類:

#include "stdafx.h"
#include "GameMap.h"


CGameMap::CGameMap()
{
?? ?m_StaticBack = cvLoadImage("image\\back1.jpg", 1);
?? ?m_ShowImg = cvCloneImage(m_StaticBack);
?? ?char name[100];
?? ?for (int i = 0; i < 10; i++)
?? ?{
?? ??? ?sprintf_s(name, "image\\stone%d.jpg", i);
?? ??? ?m_Stone[i] = cvLoadImage(name);
?? ?}
}


CGameMap::~CGameMap()
{
?? ?cvReleaseImage(&m_StaticBack);
?? ?for (int i = 0; i < 10; i++)
?? ?{
?? ??? ?cvReleaseImage(&m_Stone[i]);
?? ?}
}

void CGameMap::ReadMap()
{
?? ?ifstream inf;
?? ?inf.open("image\\map_lever2.txt");
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j < 16; j++)
?? ??? ?{
?? ??? ??? ?inf >> m_Map[i][j];
?? ??? ?}
?? ?}
}

void CGameMap::CreateMap()
{
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j <16; j++)
?? ??? ?{
?? ??? ??? ?int x = i * 40;
?? ??? ??? ?int y = j * 40;
?? ??? ??? ?int k = m_Map[i][j];
?? ??? ??? ?if (k != -1)
?? ??? ??? ??? ?CTools::DrawtoBack(m_StaticBack, m_Stone[k], x, y, 235, 235, 235);//不同圖片貼上去
?? ??? ?}
?? ?}
}

IplImage *CGameMap::GetShowMap()
{
?? ?CreateMap();
?? ?return m_StaticBack;
}

int CGameMap::Judge(int x, int y)
{
?? ?int px = x / 40;
?? ?int py = y / 40;
?? ?if (m_Map[px][py] == -1)
?? ??? ?return 1;
?? ?else
?? ??? ?return 0;
}
爆炸類:

#include "stdafx.h"
#include "Bomb.h"


CBomb::CBomb()
{
?? ?m = 0;
?? ?m_flag = false;
?? ?m_timecount = 40;
?? ?char name[100];
?? ?for (int i = 0; i < 2; i++)
?? ?{
?? ??? ?sprintf_s(name, "image\\crump%d.bmp", i);

?? ??? ?m_bombing[i] = cvLoadImage(name, 1);
?? ?}
?? ?for (int i = 0; i < 5; i++)
?? ?{
?? ??? ?sprintf_s(name, "image\\shockwave-00%d.bmp", i);
?? ??? ?m_bombed[i] = cvLoadImage(name, 1);
?? ?}
}


CBomb::~CBomb()
{
?? ?for (int i = 0; i < 2; i++)
?? ?{
?? ??? ?cvReleaseImage(&m_bombing[i]);
?? ?}
?? ?for (int i = 0; i < 5; i++)
?? ?{
?? ??? ?cvReleaseImage(&m_bombed[i]);
?? ?}
}


int CBomb::JudgeMap(CGameMap *giftmap)
{
?? ?m = 0;
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j < 16; j++)
?? ??? ?{
?? ??? ??? ?if (giftmap->m_Map[i][j] >= 6)
?? ??? ??? ?{
?? ??? ??? ??? ?m = 1;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?return m;
}

int CBomb::JudgeMap2(CLevelTwoMap *giftmap)
{
?? ?m = 0;
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j < 16; j++)
?? ??? ?{
?? ??? ??? ?if (giftmap->m_Map[i][j] >= 6)
?? ??? ??? ?{
?? ??? ??? ??? ?m = 1;
?? ??? ??? ?}
?? ??? ?}
?? ?}
?? ?return m;
}

void CBomb::BombState(IplImage * imgback)
{
?? ?m_timecount--;
?? ?if (m_timecount >= 35)
?? ?{
?? ??? ?m_bombstate = 0;
?? ?}
?? ?else
?? ??? ?if (m_timecount >= 30)
?? ??? ?{
?? ??? ??? ?m_bombstate = 1;
?? ??? ?}
?? ??? ?else
?? ??? ??? ?if (m_timecount <28)
?? ??? ??? ?{
?? ??? ??? ??? ?m_bombstate = 2;
?? ??? ??? ?}
}

void CBomb::BombChange(IplImage * imgback, CGameMap * map, CGameMap *bombmap)
{
?? ?switch (m_bombstate)
?? ?{
?? ?case 0:
?? ??? ?CTools::DrawBomb(imgback, m_bombing[0], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?break;
?? ?case 1:
?? ??? ?CTools::DrawBomb(imgback, m_bombing[1], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?break;
?? ?case 2:
?? ??? ?CTools::DrawBomb(imgback, m_bombed[004], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[001], m_pos.x, m_pos.y - 40, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[002], m_pos.x + 40, m_pos.y, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[003], m_pos.x, m_pos.y + 40, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[000], m_pos.x - 40, m_pos.y, 0, 0, 255);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x - 40, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x + 40, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y - 40);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y + 40);
?? ??? ?m_flag = false;
?? ??? ?m_timecount = 40;
?? ??? ?break;

?? ?}
}

void CBomb::BombChange2(IplImage * imgback, CLevelTwoMap * map, CLevelTwoMap *bombmap)
{
?? ?switch (m_bombstate)
?? ?{
?? ?case 0:
?? ??? ?CTools::DrawBomb(imgback, m_bombing[0], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?break;
?? ?case 1:
?? ??? ?CTools::DrawBomb(imgback, m_bombing[1], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?break;
?? ?case 2:
?? ??? ?CTools::DrawBomb(imgback, m_bombed[004], m_pos.x, m_pos.y, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[001], m_pos.x, m_pos.y - 40, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[002], m_pos.x + 40, m_pos.y, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[003], m_pos.x, m_pos.y + 40, 0, 0, 255);
?? ??? ?CTools::DrawBomb(imgback, m_bombed[000], m_pos.x - 40, m_pos.y, 0, 0, 255);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x - 40, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x + 40, m_pos.y);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y - 40);
?? ??? ?ClearBomb(bombmap, m_pos.x, m_pos.y + 40);
?? ??? ?m_flag = false;
?? ??? ?m_timecount = 40;
?? ??? ?break;

?? ?}
}

int CBomb::Bombed(int x, int y)
{

?? ?if ((x == m_pos.x&&y == m_pos.y) || (y == m_pos.y - 40 && x == m_pos.x) || (y == m_pos.y + 40 && x == m_pos.x) || (y == m_pos.y&&x == m_pos.x - 40) || (y == m_pos.y&&x == m_pos.x + 40))
?? ??? ?return 1;
?? ?else
?? ??? ?return 0;
}

void CBomb::ClearBomb(CGameMap *bombmap, int x, int y)//清除炸彈,
{
?? ?if (bombmap->m_Map[x / 40][y / 40] != 5)//墻無法被炸掉
?? ?{
?? ??? ?if (bombmap->m_Map[x / 40][y / 40] != -1)
?? ??? ?{
?? ??? ??? ?bombmap->m_Map[x / 40][y / 40] = -1;
?? ??? ?}
?? ?}
}

void CBomb::ClearBomb(CLevelTwoMap *bombmap, int x, int y)
{
?? ?if (bombmap->m_Map[x / 40][y / 40] != 5)
?? ?{
?? ??? ?if (bombmap->m_Map[x / 40][y / 40] != -1)
?? ??? ?{
?? ??? ??? ?bombmap->m_Map[x / 40][y / 40] = -1;
?? ??? ?}
?? ?}
}

以及貼圖時所用的工具類,調用工具類里里面的函數來對圖片進行處理,這里用到了像素宏的處理方法

#include "stdafx.h"
#include "Tools.h"


CTools::CTools()
{
}


CTools::~CTools()
{
}

void CTools::DrawtoBack(IplImage * back, IplImage * img, int x, int y, int blue, int green, int red)
{
?? ?for (int i = 0; i < img->height; i++)
?? ?{
?? ??? ?for (int j = 0; j < img->width; j++)
?? ??? ?{
?? ??? ??? ?int b = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 0);
?? ??? ??? ?int g = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 1);
?? ??? ??? ?int r = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 2);
?? ??? ??? ?if (!((b > blue) && (g > green) && (r > red)))
?? ??? ??? ?{
?? ??? ??? ??? ?CV_IMAGE_ELEM(back, uchar, i + y, (j + x) * 3 + 0) = b;
?? ??? ??? ??? ?CV_IMAGE_ELEM(back, uchar, i + y, (j + x) * 3 + 1) = g;
?? ??? ??? ??? ?CV_IMAGE_ELEM(back, uchar, i + y, (j + x) * 3 + 2) = r;
?? ??? ??? ?}
?? ??? ?}
?? ?}
}

void CTools::DrawBomb(IplImage * imgback, IplImage * img, int x, int y, int blue, int green, int red)
{
?? ?if (img != NULL) {
?? ??? ?for (int i = 0; i < img->height; i++)
?? ??? ?{
?? ??? ??? ?for (int j = 0; j < img->width; j++)
?? ??? ??? ?{
?? ??? ??? ??? ?int b = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 0);
?? ??? ??? ??? ?int g = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 1);
?? ??? ??? ??? ?int r = CV_IMAGE_ELEM(img, uchar, i, j * 3 + 2);
?? ??? ??? ??? ?if (CV_IMAGE_ELEM(img, uchar, i, j * 3 + 2) < 255)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?CV_IMAGE_ELEM(imgback, uchar, y + i, (j + x) * 3) = b;
?? ??? ??? ??? ??? ?CV_IMAGE_ELEM(imgback, uchar, y + i, (j + x) * 3 + 1) = g;
?? ??? ??? ??? ??? ?CV_IMAGE_ELEM(imgback, uchar, y + i, (j + x) * 3 + 2) = r;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ?}
}
背景音樂類:可以專門播放背景音樂,其實可以設置不同的關卡或者爆炸呀什么不同的音樂,但是這里初學的時候不知道怎么弄,因此整個游戲就一個音樂

#include "stdafx.h"
#include "BackMusic.h"


CBackMusic::CBackMusic()
{
}


CBackMusic::~CBackMusic()
{
}

void CBackMusic::PlayMusic()
{
?? ?PlaySound(TEXT("image\\back.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
}
如果需要設置另外的關卡,只需要將你需要變換的地圖呀人物呀以及輸贏方式變換一下重新寫一個類或者直接繼承就行了,這里初學的時候,加上時間緊迫,設置關卡就設置了兩關,并且只是修改了相關的地圖,其他的都沒有變,以后有時間有想法再來改進

#include "stdafx.h"
#include "LevelTwoMap.h"


CLevelTwoMap::CLevelTwoMap()
{
?? ?m_StaticBack = cvLoadImage("image\\back1.jpg", 1);
?? ?m_ShowImg = cvCloneImage(m_StaticBack);
?? ?char name[100];
?? ?for (int i = 0; i < 10; i++)
?? ?{
?? ??? ?sprintf_s(name, "image\\obstacle%d.jpg", i);
?? ??? ?m_obstacle[i] = cvLoadImage(name);
?? ?}
}


CLevelTwoMap::~CLevelTwoMap()
{
?? ?cvReleaseImage(&m_StaticBack);
?? ?for (int i = 0; i < 10; i++)
?? ?{
?? ??? ?cvReleaseImage(&m_obstacle[i]);
?? ?}
}

void CLevelTwoMap::ReadMap()
{
?? ?ifstream inf;
?? ?inf.open("image\\map_lever1.txt");
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j < 16; j++)
?? ??? ?{
?? ??? ??? ?inf >> m_Map[i][j];
?? ??? ?}
?? ?}
}

void CLevelTwoMap::CreateMap()
{
?? ?for (int i = 0; i < 16; i++)
?? ?{
?? ??? ?for (int j = 0; j <16; j++)
?? ??? ?{
?? ??? ??? ?int x = i * 40;
?? ??? ??? ?int y = j * 40;
?? ??? ??? ?int k = m_Map[i][j];
?? ??? ??? ?if (k != -1)
?? ??? ??? ??? ?CTools::DrawtoBack(m_StaticBack, m_obstacle[k], x, y, 235, 235, 235);//不同圖片貼上去
?? ??? ?}
?? ?}
}

IplImage * CLevelTwoMap::GetShowMap()
{
?? ?CreateMap();
?? ?return m_StaticBack;
}

int CLevelTwoMap::Judge(int x, int y)
{
?? ?int px = x / 40;
?? ?int py = y / 40;
?? ?if (m_Map[px][py] == -1)
?? ??? ?return 1;
?? ?else
?? ??? ?return 0;
}
最后就是最重要的Game類,控制整個游戲的運行,其中穿插了時間的計算,但是沒有想到辦法把時間顯示在游戲界面上,以后想到了再說,其實核心控制游戲進行,想法還是挺簡單的,遺憾的是鼠標事件沒有加上去,其實學歷,但是加上去的時候始終有錯,所以就放棄了,等以后能熟練運用鼠標事件函數再來解決這個問題,畢竟游戲都離不開鼠標,GAme類看起來還是很簡單的,小衛星那個一下就可以想通,整個游戲也是比較簡單的,比較適合真的那種新手看

#include "stdafx.h"
#include "Game.h"


CGame::CGame()
{
?? ?m_state = 0;
?? ?m_mapob.ReadMap ();
?? ?m_mapob.GetShowMap();
?? ?cvNamedWindow("QQ candy", 1);
}


CGame::~CGame()
{
?? ?cvDestroyWindow("QQ candy");
?? ?cvReleaseImage(&m_showimg);
}

void CGame::Run()
{
?? ?Welcome();
?? ?while (1)
?? ?{
?? ??? ?switch (m_state)
?? ??? ?{
?? ??? ?case 1:
?? ??? ??? ?Help();
?? ??? ??? ?break;
?? ??? ?case 2:
?? ??? ??? ?Choice();
?? ??? ??? ?break;
?? ??? ?case 3:
?? ??? ??? ?Win();
?? ??? ??? ?break;
?? ??? ?case 4:
?? ??? ??? ?Lose();
?? ??? ??? ?break;
?? ??? ?case 5:
?? ??? ??? ?Level1();
?? ??? ??? ?break;
?? ??? ?case 6:
?? ??? ??? ?Level2();
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?break;
?? ??? ?}
?? ?}
}

void CGame::Welcome()
{
?? ?m_mapob.GetShowMap();
?? ?m_showimg = cvLoadImage("image\\welcome.jpg");
?? ?cvNamedWindow("QQ candy");
?? ?cvShowImage("QQ candy", m_showimg);
?? ?char key = cvWaitKey(0);
?? ?if (key == ' ')
?? ?{
?? ??? ?m_state = 2;
?? ?}
?? ?if (key == 'H' || key == 'h')
?? ?{
?? ??? ?m_state = 1;
?? ?}
?? ?if (key == 'Q' || key == 'q')
?? ?{
?? ??? ?m_state = 8;
?? ?}
?? ?cvReleaseImage(&m_showimg);
?? ?cvDestroyWindow("QQ candy");
}

void CGame::Choice()
{
?? ?m_choice = cvLoadImage("image\\choice.jpg", 1);
?? ?cvShowImage("QQ candy", m_choice);
?? ?char key = cvWaitKey(0);
?? ?if (key == 'F' || key == 'f')
?? ?{
?? ??? ?m_state = 5;
?? ?}
?? ?if (key == 'S' || key == 's')
?? ?{
?? ??? ?m_state = 6;
?? ?}
}

void CGame::Help()
{
?? ?m_helpimg = cvLoadImage("image\\help.jpg", 1);
?? ?cvShowImage("QQ candy", m_helpimg);
?? ?char key = cvWaitKey(0);
?? ?if (key == ' ')
?? ?{
?? ??? ?m_state = 2;
?? ?}
}
void CGame::Level1()
{
?? ?time_t start, end;
?? ?double cost;
?? ?time(&start);
?? ?m_mapob.ReadMap();
?? ?m_mapob.GetShowMap();
?? ?m_player.m_pos.x = 40;
?? ?m_player.m_pos.y = 40;
?? ?while (1)
?? ?{
?? ??? ?time(&end);
?? ??? ?cost = difftime(end, start);
?? ??? ?printf("%f\n", cost);
?? ??? ?if (cost > 60)
?? ??? ?{
?? ??? ??? ?m_state = 4;
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?UpdateMap();
?? ??? ?m_bomb.m = m_bomb.JudgeMap(&m_mapob);
?? ??? ?if (m_bomb.m == 0)
?? ??? ?{
?? ??? ??? ?m_state = 3;
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?cvCopy(m_mapob.m_StaticBack, m_mapob.m_ShowImg);
?? ??? ?char key = cvWaitKey(50);
?? ??? ?if (key == ' ' && !m_bomb.m_flag)
?? ??? ?{
?? ??? ??? ?m_bomb.m_pos.y = m_player.m_pos.y;
?? ??? ??? ?m_bomb.m_pos.x = m_player.m_pos.x;
?? ??? ??? ?m_bomb.m_flag = true;
?? ??? ?}
?? ??? ?if (m_bomb.m_flag)
?? ??? ?{
?? ??? ??? ?m_bomb.BombState(m_mapob.m_ShowImg);
?? ??? ??? ?m_bomb.BombChange(m_mapob.m_ShowImg, &m_mapob, &m_mapob);
?? ??? ??? ?if (!m_bomb.m_flag)
?? ??? ??? ?{
?? ??? ??? ??? ?if (m_bomb.Bombed(m_player.m_pos.x, m_player.m_pos.y))
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?m_state = 4;
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ??? ?m_player.Move(key, &m_mapob);
?? ??? ?m_player.DrawtoBack(m_mapob.m_ShowImg);
?? ??? ?cvShowImage("QQ candy", m_mapob.m_ShowImg);
?? ?}
}

void CGame::Level2()
{
?? ?time_t start, end;
?? ?double cost;
?? ?time(&start);
?? ?m_mapob2.ReadMap();
?? ?m_mapob2.GetShowMap();
?? ?m_player.m_pos.x = 40;
?? ?m_player.m_pos.y = 40;
?? ?while (1)
?? ?{
?? ??? ?time(&end);
?? ??? ?cost = difftime(end, start);
?? ??? ?if (cost > 60)
?? ??? ?{
?? ??? ??? ?m_state = 4;
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?UpdateMap2();
?? ??? ?m_bomb.m = m_bomb.JudgeMap2(&m_mapob2);
?? ??? ?if (m_bomb.m == 0)
?? ??? ?{
?? ??? ??? ?m_state = 3;
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?cvCopy(m_mapob2.m_StaticBack, m_mapob2.m_ShowImg);
?? ??? ?char key = cvWaitKey(50);
?? ??? ?if (key == ' ' && !m_bomb.m_flag)
?? ??? ?{
?? ??? ??? ?m_bomb.m_pos.y = m_player.m_pos.y;
?? ??? ??? ?m_bomb.m_pos.x = m_player.m_pos.x;
?? ??? ??? ?m_bomb.m_flag = true;
?? ??? ?}
?? ??? ?if (m_bomb.m_flag)
?? ??? ?{
?? ??? ??? ?m_bomb.BombState(m_mapob2.m_ShowImg);
?? ??? ??? ?m_bomb.BombChange2(m_mapob2.m_ShowImg, &m_mapob2, &m_mapob2);
?? ??? ??? ?if (!m_bomb.m_flag)
?? ??? ??? ?{
?? ??? ??? ??? ?if (m_bomb.Bombed(m_player.m_pos.x, m_player.m_pos.y))
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?m_state = 4;
?? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ??? ?m_player.Move(key, &m_mapob2);
?? ??? ?m_player.DrawtoBack(m_mapob2.m_ShowImg);
?? ??? ?cvShowImage("QQ candy", m_mapob2.m_ShowImg);
?? ?}
}

void CGame::Win()
{
?? ?m_win = cvLoadImage("image\\win.jpg", 1);
?? ?cvShowImage("QQ candy", m_win);
?? ?cvWaitKey(0);
?? ?Welcome();
}

void CGame::Lose()
{
?? ?m_lost = cvLoadImage("image\\lost.jpg", 1);
?? ?cvShowImage("QQ candy", m_lost);
?? ?cvWaitKey(0);
?? ?Welcome();
}

void CGame::UpdateMap()
{
?? ?m_mapob.m_StaticBack = cvLoadImage("image\\back1.jpg", 1);
?? ?m_mapob.m_StaticBack = m_mapob.GetShowMap();
}

void CGame::UpdateMap2()
{
?? ?m_mapob2.m_StaticBack = cvLoadImage("image\\back1.jpg", 1);
?? ?m_mapob2.m_StaticBack = m_mapob2.GetShowMap();
}

真正的適合新手的,這是我寫的第一個比較成型的游戲,雖然很簡單,過程也很艱難,感謝朋友的陪伴以及幫助和鼓勵,10天的成果,對于一個沒有學過C++和opencv的人而言,已經足夠了,希望以后能好好改進,做出更好的游戲來。

?

總結

以上是生活随笔為你收集整理的opencv+c++写的小游戏,泡泡堂超级基础版的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。