基于EasyX的五子棋游戲
一、預備知識
1.使用EasyX必須要知道的一些基礎函式
2.選擇結構 if , switch
3.回圈結構 for, while
4.多維陣列 arr1[N], arr2[N][N] , arr3[N][N][N]
5.函式封裝
二、游戲邏輯
想要寫出推箱子,首先要知道推箱子游戲都有哪些元素和規則
1.五子棋元素

1.棋盤 2.黑子 3.白子
有了素材,先來一個加載資源函式Loadimg()
#define SIZE 30
#define BOARD 610
IMAGE img[3];//存放圖片
void Loadimg()
{
loadimage(&img[0],L"./images/0.jpg",BOARD,BOARD);
loadimage(&img[1],L"./images/1.jpg",SIZE,SIZE);
loadimage(&img[2],L"./images/2.jpg",SIZE,SIZE);
}
2.五子棋規則
1.黑子先行,黑白交替落子
2.首先連成五個子 (包括橫著 豎著 和 斜著) 的一方獲勝
3.棋盤下滿未分出勝負則平局
三、游戲設計
知道游戲元素和規則就可以開始設計游戲了
1.地圖設計
地圖用二維陣串列示,棋盤初始化全為0,用1來代表黑子,2來代表白子,寫一個繪制地圖函式Drawmap()
#define NUM 19
int map[NUM][NUM]={0};
void Drawmap()
{
for(int i=0;i<NUM;i++)
{
for(int j=0;j<NUM;j++)
{
if(map[i][j]==1)
putimage(4+i*32,4+j*32,&img[1]);
if(map[i][j]==2)
putimage(4+i*32,4+j*32,&img[2]);
}
}
}
2.點擊設計
上文提到
1.黑子先行,黑白交替落子
定義兩個全域變數black和white,記錄當前子的數目,如果一樣,則下黑子,如果黑子多,則下白子
int black=0,white=0;//棋盤上黑子數和白子數
int ipos,jpos;//滑鼠位置
ExMessage m;//訊息全域變數
void Hitboard()
{
m = getmessage(EM_MOUSE);//得到滑鼠訊息
if(m.message == WM_LBUTTONDOWN)
{//如果滑鼠左鍵按下
ipos=(m.x-4)/32;//換算滑鼠位置
jpos=(m.y-4)/32;
if(map[ipos][jpos]==0 && black==white)
{//如果點的地方沒子,且黑子和白子一樣多
map[ipos][jpos]=1;
black++;//下黑子
}
else if(map[ipos][jpos]==0 && black>white)
{//如果點的地方沒子,且黑子比白子多
map[ipos][jpos]=2;
white++;//下白子
}
}
}
3.結束設計
上文提到
2.首先連成五個子 (包括橫著 豎著 和 斜著) 的一方獲勝
3.棋盤下滿未分出勝負則平局
由于黑子和白子對于判斷勝負來說是等效的,寫一個帶參函式,來根據引數a不同,判斷黑白子的獲勝情況,引數a=1時,判斷黑子,a=2時,判斷白子
int Gameover(int a)
{
for(int i=0;i<NUM;i++)
{
for(int j=0;j<NUM;j++)//注意避免陣列越界
{
if(j+4<NUM && map[i][j]==a && map[i][j+1]==a && map[i][j+2]==a && map[i][j+3]==a && map[i][j+4]==a)
return 1;//判斷一行是否有五連子
else if(i+4<NUM && map[i][j]==a && map[i+1][j]==a && map[i+2][j]==a && map[i+3][j]==a && map[i+4][j]==a)
return 1;//判斷一列是否有五連子
else if(i+4<NUM && j+4<NUM && map[i][j]==a && map[i+1][j+1]==a && map[i+2][j+2]==a && map[i+3][j+3]==a && map[i+4][j+4]==a)
return 1;//判斷右下是否有五連子
else if(i+4<NUM && j+4<NUM && map[i+4][j]==a && map[i+3][j+1]==a && map[i+2][j+2]==a && map[i+1][j+3]==a && map[i][j+4]==a)
return 1;//判斷左下是否有五連子
}
}
return 0;//沒有五連子
}
再寫一個判斷平局的函式Tie()
int Tie()
{//判斷是否平局
for(int i=0;i<NUM;i++)
{
for(int j=0;j<NUM;j++)
{
if(map[i][j]==0)//如果地圖上還有空格
return 0;
}
}
return 1;//地圖上沒空格
}
4.整體設計
下面把上面的函陣列合起來就是推箱子游戲,再來點音樂
#include<easyx.h>//圖形庫
#include<mmsystem.h>//音樂
#pragma comment(lib,"winmm.lib")//庫檔案
int main()
{
initgraph(BOARD,BOARD);//創建視窗
Loadimg(); //加載圖片資源
putimage(0,0,&img[0]);//顯示棋盤
//回圈播放背景音樂
mciSendString(L"open ./images/bg.mp3 ", 0, 0, 0);
mciSendString(_T("play ./images/bg.mp3 repeat"), 0, 0, 0);
while(true){
Hitboard();//落子
Drawmap();//更新地圖
if(Gameover(1))
{//判斷黑子是否獲勝
PlaySound(L"./images/success.wav", nullptr, SND_FILENAME | SND_ASYNC);
MessageBox(NULL,_T("黑子獲勝!"),_T("游戲提示"),MB_OK | MB_SYSTEMMODAL) ;
break;
}
if(Gameover(2))
{//判斷白子是否獲勝
PlaySound(L"./images/success.wav", nullptr, SND_FILENAME | SND_ASYNC);
MessageBox(NULL,_T("白子獲勝!"),_T("游戲提示"),MB_OK | MB_SYSTEMMODAL) ;
break;
}
if(Tie())
{//如果游戲平局
PlaySound(L"./images/over.wav", nullptr, SND_FILENAME | SND_ASYNC);
MessageBox(NULL,_T("平局,旗鼓相當的對手!"),_T("游戲提示"),MB_OK | MB_SYSTEMMODAL) ;
break;
}
}
system("pause");
return 0;
}
把上面所有代碼復制到一個cpp檔案里,再把素材改好命名放到images檔案夾里,images檔案夾在cpp檔案旁邊,就可以編譯運行了!
圖片音樂素材及可執行程式都在我的資源中,需要的可以進行下載
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291949.html
標籤:其他
上一篇:NFT推動全球加密藝術浪潮
下一篇:基于EasyX的貪吃蛇游戲
