**

五子棋

**

#include <iostream>
#include <string>
#include <conio.h>
#include <windows.h>
#include "mmsystem.h"  //BGM 函数 头文件
#pragma comment(lib, "winmm.lib")
#define pure "●"
#define dark "○"HANDLE hOutput;//句柄
COORD coord = { 0,0 }; //控制台屏幕上的坐标(结构体)
std::string qiPan[15][15];//数组_棋盘
bool isBlack{ false };//当前是否是黑子下棋
bool gameOver{ true };//判断游戏是否结束/*
* 控制字体颜色
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 10 = 淡绿色
3 = 浅绿色 11 = 淡浅绿色
4 = 红色 12 = 淡红色
5 = 紫色 13 = 淡紫色
6 = 黄色 14 = 淡黄色
7 = 白色 15 = 亮白色
*/
void COLOR_PRINT(const char* s, int front_color, int back_color)
{HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//获取当前窗口句柄SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | front_color);//BACKGROUND_INTENSITY | back_color * 16(修改文字背景颜色)printf(s);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | 7);
}//刷新棋盘
void RecordedQiPan(const int x, const int y, bool isDown)
{SetConsoleCursorPosition(hOutput, coord);//获取当前窗口 光标位置std::cout << "         五子棋游戏\n";COLOR_PRINT("游戏规则:\n", 14, 0);COLOR_PRINT("W,A,S,D控制下棋光标移动\nEnter确认下棋\n", 11, 0);//输出不同颜色的字符串std::cout << "--------------------------------\n";if (isDown)//是否是下子操作{qiPan[x][y] = isBlack ? dark : pure;//判断当前下子是黑棋还是白棋 true 就标注○,false就是●}for (int i = 0; i < 15; i++)//刷新棋盘达到下子,位置变化,和创建棋盘功能{for (int j = 0; j < 15; j++){if (gameOver || (qiPan[i][j] != dark && qiPan[i][j] != pure)){qiPan[i][j] = "十";} if (!isDown && x == i && y == j)//这里有两个坐标系,ij 的棋盘坐标系 和XY是★的坐标或者是下子的坐标{COLOR_PRINT("★", 12, 0);//当棋盘坐标系 和 窗口坐标系处于同一位置 也就是中心时 标记★光标的位置continue;}std::cout << qiPan[i][j];}std::cout << "\n";  //棋盘一排输出结束,换行}printf_s("当前%s方下子\n", isBlack ? dark : pure);   //提示玩家当前是黑子还是白子下棋 std::cout << "--------------------------------\n";COLOR_PRINT("注:游戏前请把控制台字体为新宋体,大小为36\n", 4, 0);
}
//检查放置棋子的合法性
bool CheckQiPan(int& x, int& y)
{if (x < 0 || x >= 15 || y < 0 || y >= 15){if (x < 0){x = 0;}else if (x >= 15){x = 14;}else if (y < 0){y = 0;}else if (y >= 15){y = 14;}return true;}//强制规定了棋盘范围  XY 不能越界 0-14,也就是下棋光标范围if (qiPan[x][y] != dark && qiPan[x][y] != pure){return true;}return false;
}//判断 棋盘上的XY 位置是不是可以落子,可以返回真,//下棋光标移动
void Move(int& x, int& y)
{int a;//当前输入的字符bool isOk{ false };  //当前位置是否可以落子的变量do{isOk = CheckQiPan(x, y);//调用函数 利用返回值确定当前位置是不是可以落子RecordedQiPan(x, y, false);//刷新★的位置a = _getch(); //获取用户输入switch (a){case 87:case 119:x -= 1;break;case 65:case 97:y -= 1;break;case 83:case 115:x += 1;break;case 68:case 100:y += 1;break;} //用户输入 上下左右 后 光标像后移动一个位置} while (a != 13 || !isOk);//ascii码表13表示enter  用户输入enter并且当前位置可以下棋,循环结束
}//五子棋输赢规则
void Rule()
{for (int i = 0; i < 15; i++){int county = 0;  //定义好计数 XY的变量int countx = 0;for (int j = 0; j < 15; j++){if (qiPan[i][j] == (isBlack ? dark : pure)) //一行的每一列  横的{county++;if (county == 5){gameOver = true;return;}}else{county = 0;}if (qiPan[j][i] == (isBlack ? dark : pure))//一列的每一行  竖的{countx++;if (countx == 5){gameOver = true;return;}if (j + 4 < 15 && i + 4 < 15){bool isWin{ true };for (int k = 1; k <= 4; k++){isWin = qiPan[j + k][i + k] == (isBlack ? dark : pure);//判断斜列if (!isWin){break;}}if (isWin){gameOver = true;return;}}if (j - 4 >= 0 && i + 4 < 15){bool isWin{ true };for (int k = 1; k <= 4; k++){isWin = qiPan[j - k][i + k] == (isBlack ? dark : pure);//判断斜列if (!isWin){break;}}if (isWin){gameOver = true;return;}}}else{countx = 0;}}}
}//游戏开始
void Play()
{void Init();int x = 7;int y = 7;while (!gameOver){isBlack = !isBlack;Move(x, y);RecordedQiPan(x, y, true);y += 1;CheckQiPan(x, y);Rule();}printf_s("游戏结束,%s方胜\n", isBlack ? dark : pure);COLOR_PRINT("按任意键重新游戏", 10, 0);std::cout << "按任意键重新游戏";_getch();system("cls");Init();
}//初始化游戏
void Init()
{RecordedQiPan(NULL, NULL, false);isBlack = false;gameOver = false;Play();
}int main() {PlaySound(TEXT("BGM.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);//设置背景音乐..hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//得到当前窗口句柄COORD size = { 50, 28 };//设置 窗口结构体大小SetConsoleScreenBufferSize(hOutput, size); // 重新设置缓冲区大小SMALL_RECT rc = { 0,0, 50 - 1, 28 - 1 }; // 重置窗口位置和大小/*typedef struct _SMALL_RECT {SHORT Left;SHORT Top;SHORT Right;SHORT Bottom;} SMALL_RECT, * PSMALL_RECT;*/  //结构体示例 原型SetConsoleWindowInfo(hOutput, true, &rc);//设置控制台窗口大小和位置CONSOLE_CURSOR_INFO CursorInfo;/*typedef struct _CONSOLE_CURSOR_INFO {DWORD  dwSize;BOOL   bVisible;} CONSOLE_CURSOR_INFO, * PCONSOLE_CURSOR_INFO;*/GetConsoleCursorInfo(hOutput, &CursorInfo);//获取控制台光标信息CursorInfo.bVisible = false; //隐藏控制台光标SetConsoleCursorInfo(hOutput, &CursorInfo);//设置控制台光标状态Init();//调用初始化函数,又调用开始游戏函数//递归调用
}

具体工程源代码:https://download.csdn.net/download/qq_19300307/13065320

C++控制台五子棋(带背景音乐)相关推荐

  1. 基于Python的Pygame带背景音乐的五子棋游戏的设计与实现

    源码获取:https://www.bilibili.com/video/BV1Ne4y1g7dC/ 基于Python的Pygame带背景音乐的五子棋游戏的设计与实现 用户需求分析 通过软件功能的分析, ...

  2. 小程序源码:端午送粽子祝福微信小程序源码下载支持打赏模式带背景音乐

    端午节的时候很火的一款小程序 给亲朋好友送祝福也是一款引流非常不错的一款小程序 支持打赏小程序模式实现盈利模式 当然了,有能力的小伙伴也可以魔改一下做成别的小程序也是可以的 该小程序无需服务器和域名, ...

  3. 用html3d静态相册带音乐,3D立体动态相册(带背景音乐)HTML+CSS脚本

    3D立体动态相册(带背景音乐)HTML+CSS脚本.程序员硬核送礼方式... 动画效果 截图效果: 照片准备: 命名为1.2.3.-- 音乐: 将文件依次放在各自文件夹中: CSS文本,命名:inde ...

  4. HTML网页设计期末课程大作业 :汽车网页——宝马轿车 6页 带背景音乐 学生网页设计作业HTML+CSS+JavaScript学生网页课程设计期末作业下载

    HTML网页设计期末课程大作业 :汽车网页--宝马轿车 6页 带背景音乐 学生网页设计作业HTML+CSS+JavaScript学生网页课程设计期末作业下载 临近期末, 你还在为HTML网页设计结课作 ...

  5. 《疯狂Java讲义(第4版)》-----第4章【控制台五子棋】

    特此说明:本文参考<疯狂Java实战演义> 开发游戏:控制台五子棋 开发工具:记事本 五子棋流程分析 需求分析 这个游戏比较简单,我们要完成人机下棋,需要棋盘类.棋子类和游戏类.棋盘和棋子 ...

  6. 使用HTML实现带背景音乐的网页

    代码如下: < ! doctype html> <html> <head> <meta charset="utf-8"> <t ...

  7. HTML5+CSS大作业——节日圣诞节(5页)节日带背景音乐带视频(5页)带登录

    HTML5+CSS大作业--节日圣诞节(5页)节日带背景音乐带视频(5页)带登录 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. ...

  8. HTML网页设计制作大作业(div+css——节日圣诞节(5页)节日带背景音乐带视频(5页)带登录

    HTML5+CSS大作业--节日圣诞节(5页)节日带背景音乐带视频(5页)带登录 常见网页设计作业题材有 个人. 美食. 公司. 学校. 旅游. 电商. 宠物. 电器. 茶叶. 家居. 酒店. 舞蹈. ...

  9. c++控制台五子棋(简单)

    c++控制台五子棋 今天有半个小时的时间闲来无聊,就想起最开始写程序的时候写的五子棋,就想写写看.用的VS2010,实现起来也比较简单. 首先先构思棋盘,首先得标注棋牌边缘设计,随便设计了一个13 × ...

  10. Android stdio制作轮播图式带背景音乐的引导页

    转载请注明原作者和原文链接 一款app如果要想吸引别人眼球,那么在第一次启动时展示出精美的引导页就是必不可少的,本次将会介绍如何制作滑动轮播图式带背景音乐的引导页. 先来看看引导页成果展示↓ 移动开发 ...

最新文章

  1. 11.1 问题描述及流程-机器学习笔记-斯坦福吴恩达教授
  2. 动态规划--电路布线(circuit layout)
  3. nginx基本数据结构ngx_module_t,ngx_module_s
  4. MySQL数据库优化技巧(二)
  5. CentOS/Linux 解决 SSH 连接慢
  6. 2017年前端最受欢迎调查报告:ES 6,React和Sublime Text依然霸主
  7. 网页设计图片向上浮动_果冻公开课第六课:5分钟理解浮动布局
  8. 1.2低级线程处理API
  9. nsis检测vc2013运行环境vcredist_x86.exe是否已经安装
  10. KeepLive for Android 安卓保活组件
  11. 计算机更换桌面图片,桌面图片高清怎么换?桌面图片怎么美化?
  12. .9图片处理报错Error: java.lang.RuntimeException: Crunching Cruncher ic_coupon2.9.png failed, see logs
  13. 怎么在我们的App中集成条码扫描功能?
  14. linux 网卡RX丢包,解决网卡丢包问题,以及丢包问题解决后系统网络还是慢的问题...
  15. 【20CSPS提高组】动物园
  16. html5普通文本框代码,html 文本框代码
  17. 零基础如何学习计算机语言
  18. 第八章 SQL修改数据库
  19. DAVSE VCC-H10004K超高清会议摄像机
  20. 2022年Python笔试选择题及答案(秋招)

热门文章

  1. Python实用技巧 使用pillow库批量修改文件夹下所有PNG图片透明度
  2. w3c html 检验器,如何在W3C验证器中验证HTML时获取徽章?
  3. 线性系统实验:化学方程式配平 与 天体轨道参数估计
  4. iOS SwiftUI ☞ UIKit框架的封装使用
  5. 全国计算机三级网络技术题,全国计算机三级网络技术大题技巧
  6. php 字符串转日期格式
  7. typeScript构建失败:Non-string value passed to `ts.resolveTypeReferenceDirective`
  8. 怎么关闭vivo系统自检_MIUI11系统已发布,你怎么能不会这个一键关闭广告的功能呢!...
  9. java获得当天的0点和最后时刻
  10. python 化学_rdkit 化学反应分子式高级功能