C++实现五子棋游戏
三子棋、五子棋之类的游戏,非常简单,对于初学者来说是一个不错的练手的小项目,以前用C语言写过三子棋游戏。最近在看C++,所以就想到在三子棋的基础上利用C++语言实现五子棋游戏。
主要功能:
有3个模式:0表示退出、1表示电脑vs玩家、2表示玩家vs玩家。
当一局完成之后选择’y’则又会进入选择模式。
源代码(VS2013编译器下写的):
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include <time.h>using namespace std;const int N=15; //15*15的棋盘
const char ChessBoardflag = ' '; //棋盘标志
const char flag1='o'; //玩家1或电脑的棋子标志
const char flag2='X'; //玩家2的棋子标志typedef struct Coordinate //坐标类
{ int x; //代表行int y; //代表列
}Coordinate;class GoBang //五子棋类
{
public:GoBang() //初始化{InitChessBoard();}void Play() //下棋{Coordinate Pos1; // 玩家1或电脑Coordinate Pos2; //玩家2int n = 0;while (1){int mode = ChoiceMode();while (1){if (mode == 1) //电脑vs玩家{ComputerChess(Pos1,flag1); // 电脑下棋if (GetVictory(Pos1, 0, flag1) == 1) //0表示电脑,真表示获胜break;PlayChess(Pos2, 2, flag2); //玩家2下棋if (GetVictory(Pos2, 2, flag2)) //2表示玩家2break;}else //玩家1vs玩家2{PlayChess(Pos1, 1, flag1); // 玩家1下棋if (GetVictory(Pos1, 1, flag1)) //1表示玩家1break;PlayChess(Pos2, 2, flag2); //玩家2下棋if (GetVictory(Pos2, 2, flag2)) //2表示玩家2break;}}cout << "***再来一局***" << endl;cout << "y or n :";char c = 'y';cin >> c;if (c == 'n')break;} }protected:int ChoiceMode() //选择模式{int i = 0;system("cls"); //系统调用,清屏InitChessBoard(); //重新初始化棋盘cout << "***0、退出 1、电脑vs玩家 2、玩家vs玩家***" << endl;while (1){cout << "请选择:";cin >> i;if (i == 0) //选择0退出exit(1);if (i == 1 || i == 2)return i;cout << "输入不合法" << endl;}}void InitChessBoard() //初始化棋盘{for (int i = 0; i < N + 1; ++i) {for (int j = 0; j < N + 1; ++j){_ChessBoard[i][j] = ChessBoardflag;}}}void PrintChessBoard() //打印棋盘,这个函数可以自己调整{system("cls"); //系统调用,清空屏幕for (int i = 0; i < N+1; ++i){for (int j = 0; j < N+1; ++j){if (i == 0) //打印列数字{if (j!=0)printf("%d ", j);elseprintf(" ");}else if (j == 0) //打印行数字printf("%2d ", i);else{if (i < N+1){printf("%c |",_ChessBoard[i][j]);}}}cout << endl;cout << " ";for (int m = 0; m < N; m++){printf("--|");}cout << endl;}}void PlayChess(Coordinate& pos, int player, int flag) //玩家下棋{PrintChessBoard(); //打印棋盘while (1){printf("玩家%d输入坐标:", player);cin >> pos.x >> pos.y;if (JudgeValue(pos) == 1) //坐标合法break;cout << "坐标不合法,重新输入" << endl;}_ChessBoard[pos.x][pos.y] = flag;}void ComputerChess(Coordinate& pos, char flag) //电脑下棋{PrintChessBoard(); //打印棋盘int x = 0;int y = 0;while (1){x = (rand() % N) + 1; //产生1~N的随机数srand((unsigned int) time(NULL));y = (rand() % N) + 1; //产生1~N的随机数srand((unsigned int) time(NULL));if (_ChessBoard[x][y] == ChessBoardflag) //如果这个位置是空的,也就是没有棋子break;}pos.x = x;pos.y = y;_ChessBoard[pos.x][pos.y] = flag;}int JudgeValue(const Coordinate& pos) //判断输入坐标是不是合法{if (pos.x > 0 && pos.x <= N&&pos.y > 0 && pos.y <= N){if (_ChessBoard[pos.x][pos.y] == ChessBoardflag){return 1; //合法}}return 0; //非法}int JudgeVictory(Coordinate pos, char flag) //判断有没有人胜负(底层判断){int begin = 0;int end = 0;int begin1 = 0;int end1 = 0;//判断行是否满足条件(pos.y - 4) > 0 ? begin = (pos.y - 4) : begin = 1;(pos.y + 4) >N ? end = N : end = (pos.y + 4);for (int i = pos.x, j = begin; j + 4 <= end; j++){if (_ChessBoard[i][j] == flag&&_ChessBoard[i][j + 1] == flag&&_ChessBoard[i][j + 2] == flag&&_ChessBoard[i][j + 3] == flag&&_ChessBoard[i][j + 4] == flag)return 1;}//判断列是否满足条件(pos.x - 4) > 0 ? begin = (pos.x - 4) : begin = 1;(pos.x + 4) > N ? end = N : end = (pos.x + 4);for (int j = pos.y, i = begin; i + 4 <= end; i++){if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j] == flag&&_ChessBoard[i + 2][j] == flag&&_ChessBoard[i + 3][j] == flag&&_ChessBoard[i + 4][j] == flag)return 1;}int len = 0;//判断主对角线是否满足条件pos.x > pos.y ? len = pos.y - 1 : len = pos.x - 1;if (len > 4)len = 4;begin = pos.x - len; //横坐标的起始位置begin1 = pos.y - len; //纵坐标的起始位置pos.x > pos.y ? len = (N - pos.x) : len = (N - pos.y);if (len>4)len = 4;end = pos.x + len; //横坐标的结束位置end1 = pos.y + len; //纵坐标的结束位置for (int i = begin, j = begin1; (i + 4 <= end) && (j + 4 <= end1); ++i, ++j){if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j + 1] == flag&&_ChessBoard[i + 2][j + 2] == flag&&_ChessBoard[i + 3][j + 3] == flag&&_ChessBoard[i + 4][j + 4] == flag)return 1;}//判断副对角线是否满足条件(pos.x - 1) >(N - pos.y) ? len = (N - pos.y) : len = pos.x - 1;if (len > 4)len = 4;begin = pos.x - len; //横坐标的起始位置begin1 = pos.y + len; //纵坐标的起始位置(N - pos.x) > (pos.y - 1) ? len = (pos.y - 1) : len = (N - pos.x);if (len>4)len = 4;end = pos.x + len; //横坐标的结束位置end1 = pos.y - len; //纵坐标的结束位置for (int i = begin, j = begin1; (i + 4 <= end) && (j - 4 >= end1); ++i, --j){if (_ChessBoard[i][j] == flag&&_ChessBoard[i + 1][j - 1] == flag&&_ChessBoard[i + 2][j - 2] == flag&&_ChessBoard[i + 3][j - 3] == flag&&_ChessBoard[i + 4][j - 4] == flag)return 1;}for (int i = 1; i < N + 1; ++i) //棋盘有没有下满{for (int j =1; j < N + 1; ++j){if (_ChessBoard[i][j] == ChessBoardflag)return 0; //0表示棋盘没满} }return -1; //和棋}bool GetVictory(Coordinate& pos, int player, int flag) //对JudgeVictory的一层封装,得到具体那个玩家获胜{int n = JudgeVictory(pos, flag); //判断有没有人获胜if (n != 0) //有人获胜,0表示没有人获胜{PrintChessBoard();if (n == 1) //有玩家赢棋{if (player == 0) //0表示电脑获胜,1表示玩家1,2表示玩家2printf("***电脑获胜***\n");elseprintf("***恭喜玩家%d获胜***\n", player);}elseprintf("***双方和棋***\n");return true; //已经有人获胜}return false; //没有人获胜}
private:char _ChessBoard[N+1][N+1];
};
C++实现五子棋游戏相关推荐
- 编写五子棋的完整python代码_python制作简单五子棋游戏
本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下 #五子棋 '" 矩阵做棋盘 16*16 "+" 打印棋盘 for for 游戏是否结束 开 ...
- 基于python的游戏设计与实现-python五子棋游戏的设计与实现
这个python的小案例是五子棋游戏的实现,在这个案例中,我们可以实现五子棋游戏的两个玩家在指定的位置落子,画出落子后的棋盘,并且根据函数判断出输赢的功能. 这个案例的思路如下所示: 首先,根据棋盘的 ...
- c语言五子棋开题报告,基于VC的五子棋游戏的设计与实现(附答辩记录)
基于VC的五子棋游戏的设计与实现(附答辩记录)(包含选题审批表,任务书,开题报告,中期检查报告,毕业论文12300字,程序) 摘 要:以计算机技术和网络技术为核心的现代网络技术已在现实生活和生产中得以 ...
- java五子棋悔棋代码_小猿圈前端编写JS五子棋游戏
前段时间发的飞机大战的游戏很多小伙伴都私聊让再做个游戏,今天小猿圈web前端讲师为大家分享的是JS五子棋的游戏,想玩的小伙伴记得自己运行一下呦. JS五子棋游戏代码: 五子棋 canvas { dis ...
- 编写五子棋的完整python代码_python实现五子棋游戏(pygame版)
本文实例为大家分享了python五子棋游戏的具体代码,供大家参考,具体内容如下 目录 简介 实现过程 结语 简介 使用python实现pygame版的五子棋游戏: 环境:Windows系统+pytho ...
- ege函数库_基于c++ ege图形库实现五子棋游戏
本文分享的五子棋实例,制作基于ege图像库, 首先需要安装配置ege环境 就可以编写小游戏了. 用到的ege库函数不多 , 主要是基于c++的. 先看界面效果: 输入界面:(就是控制台) 游戏胜利界面 ...
- android sdl,Android下SDL2实现五子棋游戏
本文实例介绍了Android下用SDL2实现一个简单的五子棋游戏,分享给大家供大家参考,具体内容如下 1. Five.c // Five.c // SDL2 五子棋 // gcc -mwindows ...
- c语言改u3d游戏,使用Unity3D怎么制作一个五子棋游戏
使用Unity3D怎么制作一个五子棋游戏 发布时间:2021-04-17 17:56:36 来源:亿速云 阅读:106 作者:Leah 本篇文章为大家展示了使用Unity3D怎么制作一个五子棋游戏,内 ...
- python写游戏棋牌游戏_使用python实现简单五子棋游戏
使用python实现简单五子棋游戏 发布时间:2020-08-29 06:12:30 来源:脚本之家 阅读:73 作者:weixin_42874933 用python实现五子棋简单人机模式的练习过程, ...
- 五子棋人机对战_原生JS+Canvas实现五子棋游戏
原生JS+Canvas实现五子棋游戏 效果图 主要功能模块为: 1.人机对战功能 2.悔棋功能 3.撤销悔棋功能 二.代码详解 2.1 人机对战功能实现 从效果图可以看到,棋盘的横竖可以放的位置为15 ...
最新文章
- 13个月才跑通GitHub模型,机器学习科研入门太难了吧
- MySQL中truncate误操作后的数据恢复案例
- python3.6安装版本选择
- exfat 分配单元大小_知到金融理论与实务第一单元章节测试答案
- 如何解决多地开视频会议直播问题?
- 基于Java Socket的文件UpLoad代码(完美版)-用递归解决java的目录树遍历
- AAuto 快速开发win32小程序
- PAT甲级1111 Online Map (30分):[C++题解]两次dijkstra求单源最短路、保存路径、长度最短、时间最短
- 在PowerPoint 2010中将鼠标用作激光笔
- openai-gpt_为什么到处都看到GPT-3?
- 论文浅尝 | ​ADRL:一个基于注意力机制的知识图谱深度强化学习框架
- 进击的小程序:品牌自营GMV同比增长210%,这些行业增速最快……
- IE7 下载EXCEL注意地方
- windows下如何制作和应用数字签名证书 全流程
- 计算机语言日语换成中文,win7系统怎么把语言变成日语
- 训练loss不下降原因总结
- matlab实现图像处理教程,Matlab图像处理入门教程(菜鸟级)
- JAVA————简单的图形绘制界面(教程)
- 人工智能在脑神经科学的应用创新与热点——脑机接口
- 珊瑚海-一站式动态化布局框架
热门文章
- Unity获取组件的几种方式(拖拽法、标签法、名字法)
- 计算机应用大赛动员大会,计算机应用工程系第十二届学生会动员大会
- 验证sqlserver 2000 sp4补丁是否安装成功(安装补丁后可以远程访问)
- java基础题数组_java基础学习——数组笔试题
- Appium swip滑动
- C++ bit field 位域/位段
- 京东如何建设基于云原生架构的监控 - 日志系统?
- AtCoder Beginner Contest 171 D - Replacing
- 电容降压整流电源电路
- APP - 腾讯微信上线“一证通查”功能,还没查的速度看看