前言
首先感謝您能打開我的文章,希望您能看完,有不對或者可以改進的地方,留言在下面,再次感謝。把之前寫的的一個五子棋遊戲共享出來,希望大家喜歡。自己把學習過程的一些方法和筆記,以及針對出現的各種錯誤解決方法共享在博客裏面。雖然自己很菜,但我還是會一如既往的分享,努力變的優秀,會一直努力不斷地改進。希望對您有幫助。
開發工具
VS2013
easyx圖形庫 官網下載
效果展示
流程圖
構建框架
#include<easyx.h>
#include<stdio.h>
void drawMenu()//菜單
{
}
void init()//初始化
{
}
void draw()//繪製
{
}
bool is_win()//遊戲是否結束
{
}
void play_game()//玩家交互
{
}
void run_game()//開始遊戲
{
init();//初始化
while (true)
{
play_game();//玩遊戲
draw();//繪製
if (is_win())//判斷一下是否結束
{
//重新開始或者跳出
}
}
}
int main()
{
drawMenu();//菜單
run_game();
system("pause");
return 0;
}
邏輯關係
先繪製菜單,然後繪製棋盤
畫棋子
使用循環語句結合判斷語句實現五子棋效果
for (int i = 0; i < N; i++)//N行
for (int j = 0; j < N; j++)//N列
if (chess[i][j] == 0)
continue;
if (chess[i][j] == 1)//畫黑棋
setfillcolor(BLACK);
if (chess[i][j] == 2)//畫白棋
setfillcolor(WHITE);
solidcircle(size*(j+1), size*(i+1), size / 4);//棋子大小
獲取鼠標點擊事件
MOUSEMSG msg = GetMouseMsg();
msg.uMsg == WM_LBUTTONDOWN//鼠標操作左鍵按下
計算鼠標點擊的位置
設置棋盤數據
勝利判斷:黑棋或者白棋,出現五個棋子連在一起即勝利。
從玩家點擊事件上確定點擊的位置
從每次的點擊位置進行判斷
勝利後重新開始遊戲
x軸是左向右的,y軸是從上往下的。在數學中(x,y)
而在計算機中數組arr[i][j] i的值放在第一位。
源代碼
#include<stdio.h>
#include<stdlib.h>
#include<easyx.h>//圖形庫頭文件
#include<mciapi.h>//音樂播放頭文件
#pragma comment(lib,"winmm.lib")
#define N 15 //格子數目15*15
int length = 500;//棋盤大小
float size;//每一個格子大小
int chess[N][N];//棋位置
bool is_init;//是否初始化
bool is_black;//是否黑棋
bool is_gameover;//是否遊戲結束
void drawMenu()//菜單
{
initgraph(500, 500);//菜單窗口大小 500 500
setbkcolor(WHITE);//背景顏色
cleardevice();//屏幕填充成背景色
setfillcolor(BLUE);//填充顏色
settextstyle(25, 0, L"宋體");//字體樣式
setbkmode(TRANSPARENT);//樣式
fillrectangle(190, 100, 310, 150);//在指定位置畫矩形
fillrectangle(190, 100 + 60, 310, 150 + 60);
outtextxy(190+ 10, 100 + 13, L"開始遊戲");//在指定位置輸出文字
outtextxy(190 + 10, 100 + 13 + 60, L"退出遊戲");
settextcolor(RED);//字體顏色
outtextxy(130, 280, L"追夢五子棋遊戲v1.2.0版本");
MOUSEMSG m;//鼠標事件
while (1)
{
m = GetMouseMsg();
if (m.x >= 190 && m.x <= 310 && m.y >= 100 && m.y <= 150)
{
setlinecolor(BLACK);
rectangle(190 - 5, 100 - 5, 310 + 5, 150 + 5);
if (m.uMsg == WM_LBUTTONDOWN)//鼠標左鍵按下
{
break;
}
}
else if (m.x >= 190 && m.x <= 310 && m.y >= 160 && m.y <= 210)
{
setlinecolor(BLACK);
rectangle(190 - 5, 160 - 5, 310 + 5, 210 + 5);
if (m.uMsg == WM_LBUTTONDOWN)
{
exit(0);
}
}
else
{
setlinecolor(WHITE);
rectangle(190 - 5, 100 - 5, 310 + 5, 150 + 5);
rectangle(190 - 5, 160 - 5, 310 + 5, 210 + 5);
}
}
closegraph();
}
void init()//初始化
{
initgraph(length, length);
if (!is_init)//是否初始化
{
memset(chess, 0, sizeof(chess));
}
is_init= true;
memset(chess, 0, sizeof(chess));
size = (float)length / (N + 1);
is_black = true;
is_gameover = false;
}
void draw_chess()//畫棋子
{
for (int i = 0; i < N; i++)//N行
{
for (int j = 0; j < N; j++)//N列
{
if (chess[i][j] == 0)
{
continue;
}
if (chess[i][j] == 1)//黑棋
{
setfillcolor(BLACK);
}
if (chess[i][j] == 2)//白棋
{
setfillcolor(WHITE);
}
solidcircle(size*(j+1), size*(i+1), size / 4);//棋子大小
}
}
}
void draw_background()//畫棋盤
{
setbkcolor(BLUE);//棋子顏色
cleardevice();//屏幕填充成背景色
setlinecolor(BLACK);//線條顏色
settextcolor(RED);//數字顏色
for (int i = 1; i <= N; i++)//畫線
{
line(size, size*i, length - size, size*i);//橫線
line(size*i, size, size*i, length - size);//豎線
TCHAR nums[3];
wsprintf(nums, _T("%d"), i);
outtextxy(size - size / 2, size*i - size / 8, nums);
outtextxy(size*i - size / 8, size - size / 2, nums);
}
//繪製圓點
setfillcolor(0x0);
int m = 3;
fillcircle(size*m, size*m, size / 8);
fillcircle(size*m, size*(N - m + 1), size / 8);
fillcircle(size*(N - m + 1), size*m, size / 8);
fillcircle(size*(N - m + 1), size*(N - m + 1), size / 8);
fillcircle(size*(N / 2 + 1), size*(N / 2 + 1), size / 8);
}
void draw()//批量加載繪製
{
BeginBatchDraw();
draw_background();
draw_chess();
EndBatchDraw();
}
bool is_win(int x,int y)//是否勝利
{
if (chess[y][x] == 0)
{
return false;
}
int dir[][2] = { { 0, 1 }, { 1, 0 }, { 1, 1 }, { 1, -1 } };
for (int i = 0; i < 4; i++)
{
int contion = 1;
bool f1 = true, f2 = true;
for (int j = 1; j < 5; j++)
{
int dx = x + dir[i][1] * j;
int dy = y + dir[i][0] * j;
int rx = x - dir[i][1] * j;
int ry = y - dir[i][0] * j;
if (dx >= 0 && dx < N&&dy >= 0 && dy < N&&chess[dy][dx] == chess[y][x])
{
contion++;
}
else
{
f1=false;
}
if (rx >= 0 && ry < N&&rx < N&&ry >= 0 && chess[y][x] == chess[ry][rx])
{
contion++;
}
else
{
f2=false;
}
}
if (contion >= 5)
{
return true;
}
}
return false;
}
void play_game()//遊戲過程 玩家交互
{
MOUSEMSG msg = GetMouseMsg();
if (msg.uMsg == WM_LBUTTONDOWN)//鼠標操作左鍵按下
{
int x = (msg.x-size/2) / size;
int y = (msg.y-size/2) / size;
if (chess[y][x] == 0 && x >= 0 && x < N&&y >= 0 && y < N)
{
chess[y][x]=is_black ? 1 : 2;
if (is_win(x, y))
{
is_gameover = true;
return;
}
is_black = !is_black;
}
}
}
void run_game()//開始遊戲
{
init();
while (true)
{
play_game();
draw();
if (is_gameover)
{
if (is_black)//黑棋勝利
{
MessageBox(GetHWnd(), _T("黑棋勝利"), _T("遊戲結束"), 0);
}
else
{
MessageBox(GetHWnd(), _T("白棋勝利"), _T("遊戲結束"), 0);
}
init();
}
}
}
int main()//主函數
{
mciSendString(L"open txz.mp3", 0, 0, 0);//打開音樂
mciSendString(L"play txz.mp3", 0, 0, 0);//播放音樂
drawMenu();//菜單
run_game();//遊戲過程
system("pause");
return 0;
}
導入圖標
導入一下這個圖標
第一步
第二步
總結
完成五子棋遊戲,需要安裝圖形庫,以及它裏面的相關知識,思路理清楚啦,寫起來就容易多了。注意最後導入圖標是.ico格式的,看代碼的時候橫屏看效果好點。