實戰項目教你一步步寫完五子棋

前言

首先感謝您能打開我的文章,希望您能看完,有不對或者可以改進的地方,留言在下面,再次感謝。把之前寫的的一個五子棋遊戲共享出來,希望大家喜歡。自己把學習過程的一些方法和筆記,以及針對出現的各種錯誤解決方法共享在博客裏面。雖然自己很菜,但我還是會一如既往的分享,努力變的優秀,會一直努力不斷地改進。希望對您有幫助。

開發工具

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格式的,看代碼的時候橫屏看效果好點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章