该五子棋游戏代码基于本人另一篇小游戏井字棋的代码进行独立改进完成的。链接如下:C++小游戏--井字棋--代码
主要改进了对游戏胜负情况判断函数的写法,以及棋子落盘的坐标计算。
具体代码如下(可直接照搬):
#include <iostream>
#include <graphics.h>
#include <string>
//棋盘数组
char board_data[15][15];
char current_piece = 'W';
bool CheckWin(char c) {
// 检查水平方向、垂直方向和两条对角线的连续五子
for (size_t i = 0; i < 15; i++) {
for (size_t j = 0; j < 15; j++) {
// 水平方向
if (j + 4 < 15) {
bool win = true;
for (size_t k = 0; k < 5; k++) {
if (board_data[i][j + k] != c) {
win = false;
break;
}
}
if (win) return true;
}
// 垂直方向
if (i + 4 < 15) {
bool win = true;
for (size_t k = 0; k < 5; k++) {
if (board_data[i + k][j] != c) {
win = false;
break;
}
}
if (win) return true;
}
// 主对角线
if (i + 4 < 15 && j + 4 < 15) {
bool win = true;
for (size_t k = 0; k < 5; k++) {
if (board_data[i + k][j + k] != c) {
win = false;
break;
}
}
if (win) return true;
}
// 副对角线
if (i >= 4 && j + 4 < 15) {
bool win = true;
for (size_t k = 0; k < 5; k++) {
if (board_data[i - k][j + k] != c) {
win = false;
break;
}
}
if (win) return true;
}
}
}
return false;
}
bool CheckDraw() { //判断平局
for (size_t i = 0; i < 15; i++) {
for (size_t j = 0; j < 15; j++) {
if (board_data[i][j] == '-')
return false;
}
}
return true;
}
void DrawBoard() { //绘制棋盘
for(int i=80;i<921;i+=60)//用循环画棋盘线
{
line(80, i, 920, i);
line(i, 80, i, 920);
}
setfillcolor(WHITE);
solidcircle(500, 500, 6);//独立绘制五个定位点
solidcircle(260, 260, 6);
solidcircle(740, 260, 6);
solidcircle(260, 740, 6);
solidcircle(740, 740, 6);
}
void DrawPiece() { //绘制棋子
for (size_t i = 0; i < 15; i++) {
for (size_t j = 0; j < 15; j++) {
switch (board_data[i][j])
{
case 'W':
setfillcolor(WHITE);
solidcircle(60 * j + 80, 60 * i + 80, 20);
break;
case 'B':
setfillcolor(BLACK);
fillcircle(60 * j + 80, 60 * i + 80, 20);
break;
case '-':
break;
}
}
}
}
void DrawTipText() { //绘制信息
static TCHAR str[64];
_stprintf_s(str, _T("当前棋子(W为白子,B为黑子):%c"), current_piece);
settextcolor(RGB(225, 170, 40));
outtextxy(1, 1, str);
}
int main() {
initgraph(1000, 1000);
for (size_t i = 0; i < 15; i++) {
for (size_t j = 0; j < 15; j++) {
board_data[i][j] = '-';
}
}
bool running = true;
ExMessage msg;
BeginBatchDraw();//创建渲染缓冲区
while (running)
{
DWORD start_time = GetTickCount(); //性能优化
while (peekmessage(&msg)) { //接收控制信息
if (msg.message == WM_LBUTTONDOWN)
{
int x = msg.x;
int y = msg.y;
//计算点击的网格位置
int index_x = (x - 50) / 60;
int index_y = (y - 50) / 60;
if (index_x >= 0 && index_x < 15 && index_y >= 0 && index_y < 15) {
if (board_data[index_y][index_x] == '-')
{
board_data[index_y][index_x] = current_piece;
current_piece = (current_piece == 'W') ? 'B' : 'W';
//三目运算符
}
}
}
}
setbkcolor(RGB(119, 69, 19));
cleardevice();//清理画布
DrawBoard();
DrawPiece();
DrawTipText();
FlushBatchDraw();
if (CheckWin('W'))
{
MessageBox(GetHWnd(), _T("白子 win!"), _T("Game Over"), MB_OK);
running = false;
}
else if (CheckWin('B'))
{
MessageBox(GetHWnd(), _T("黑子 win!"), _T("Game Over"), MB_OK);
running = false;
}
else if (CheckDraw())
{
MessageBox(GetHWnd(), _T("Draw!"), _T("Game Over"), MB_OK);
running = false;
}
DWORD end_time = GetTickCount();
DWORD delta_time = end_time - start_time;
if (delta_time < (1000 / 60))
{
Sleep(1000 / 60 - delta_time);//动态休眠,程序保持在60帧的情况下优化内存使用
}
}
EndBatchDraw();
}