C++实现简单五子棋游戏

五子棋是世界智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏,是世界智力运动会竞技项目之一,通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。

规则

(1)对局双方各执一色棋子。
(2)空棋盘开局。
(3)黑先、白后,交替下子,每次只能下一子。
(4)棋子下在棋盘的空白点上,棋子下定后,不得向其它点移动,不得从棋盘上拿掉或拿起另落别处。
(5)黑方的第一枚棋子可下在棋盘任意交叉点上。
(6)轮流下子是双方的权利,但允许任何一方放弃下子权(即:PASS权)

五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。整个对局过程中黑方有禁手,白方无禁手。黑方禁手有三三禁手、四四禁手和长连禁手三种。

实现方案

通过缩小棋盘来抑制五子棋先行的优势,在这里使用15路棋盘。

(1)提供3个选择模式

(2)输入坐标(注意横纵坐标之间需要空格)

(3)输入非法坐标

(4)判断输赢

  • 判断行是否满足条件
  • 判断列是否满足条件
  • 判断主对角线是否满足条件
  • 判断副对角线是否满足条件

之后可选择yes再来一局,也可以选择no退出游戏。

源代码如下:

#define _CRT_SECURE_NO_WARNINGS 1

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

using namespace std;

const int N = 15; //15*15的棋盘
const char ChessBoard = ' '; //棋盘标志
const char flag1 = 'o'; //玩家1或电脑标志
const char flag2 = 'x'; //玩家2标志

typedef struct Position{ //坐标
 int row; //行
 int col; //列
}Position;

class GoBang{ //五子棋类
public:
 GoBang(){
 InitChessBoard(); //初始化棋盘
 }
 void Play(){ //下棋
 Position Play1; //玩家1或电脑
 Position Play2; //玩家2
 while (1){
 int mode = ChoiceMode();
 while (1){
 if (mode == 1){ //电脑VS玩家
 ComputerChess(Play1, flag1); //电脑走
 if (GetVictory(Play1, 0, flag1)){ //0代表电脑,为真则表示电脑获胜
 break;
 }
 PlayChess(Play2, 2, flag2); //玩家2走
 if (GetVictory(Play2, 2, flag2)){ //2代表玩家2
 break;
 }
 }
 else{ //玩家1VS玩家2
 PlayChess(Play1, 1, flag1); //玩家1走
 if (GetVictory(Play1, 1, flag1)){ //玩家1赢
 break;
 }
 PlayChess(Play2, 2, flag2); //玩家2走
 if (GetVictory(Play2, 2, flag2)){ //玩家2赢
 break;
 }
 }
 }
 cout << "======再来一局=======" << endl;
 cout << "yes or no :";
 char s[] = "yes";
 cin >> s;
 if (strcmp(s, "no") == 0){
 break;
 }
 }
 }

protected:
 void InitChessBoard(){ //初始化棋盘
 for (int i = 0; i < N + 1; ++i){
 for (int j = 0; j < N + 1; ++j){
 _ChessBoard[i][j] = ChessBoard;
 }
 }
 }

 int ChoiceMode(){ //选择模式
 system("cls");
 //系统调用,清屏
 InitChessBoard(); //重新初始化棋盘
 cout << "*************************************************" << endl;
 cout << "******************0、退出************************" << endl;
 cout << "******************1、电脑VS玩家******************" << endl;
 cout << "******************2、玩家VS玩家******************" << endl;
 cout << "*************************************************" << endl;
 while (1){
 int i = 0;
 cout << "请选择模式:";
 cin >> i;
 if (i == 0){ //退出
 exit(1);
 }
 if (i == 1 || i == 2){
 return i;
 }
 else{
 cout << "非法输入,请重新输入!" << endl;
 }
 }
 }

 void PrintChessBoard(){ //打印棋盘
 printf(" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n");
 printf(" |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");
 for (int i = 1; i < N + 1; ++i)
 {
 printf("%2d ", i);
 printf("| %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c | %c |\n", _ChessBoard[i][1], _ChessBoard[i][2], _ChessBoard[i][3], _ChessBoard[i][4], _ChessBoard[i][5], _ChessBoard[i][6], _ChessBoard[i][7], _ChessBoard[i][8], _ChessBoard[i][9], _ChessBoard[i][10], _ChessBoard[i][11], _ChessBoard[i][12], _ChessBoard[i][13], _ChessBoard[i][14], _ChessBoard[i][15]);
 printf(" |---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|\n");
 }
 cout << endl;
 }

 void ComputerChess(Position& 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] == ChessBoard){ //如果这个位置为空(没有棋子),跳出循环,下棋
 break;
 }
 }
 pos.row = x;
 pos.col = y;
 _ChessBoard[pos.row][pos.col] = flag;
 }

 void PlayChess(Position& pos, int player, char flag){
 PrintChessBoard(); //打印棋盘
 while (1){
 printf("请玩家%d输入坐标:", player);
 cin >> pos.row >> pos.col;
 if (JudgeValue(pos) == 1){ //判断坐标是否合法
 break;
 }
 cout << "坐标不合法,请重新输入:" << endl;
 }
 _ChessBoard[pos.row][pos.col] = flag;
 }

 int JudgeValue(const Position& pos){ //判断坐标的合法性
 //1.在棋盘上
 if (pos.row > 0 && pos.row <= N && pos.col > 0 && pos.col <= N){
 //2.所在位置为空(没有棋子)
 if (_ChessBoard[pos.row][pos.col] == ChessBoard){
 return 1; //合法
 }
 }
 return 0; //非法
 }

 int JudgeVictory(Position pos, char flag){ //判断是否有玩家获胜(底层判断)
 int begin = 0;
 int end = 0;

 //1.判断行是否满足条件
 (pos.col - 4) > 0 ? begin = (pos.col - 4) : begin = 1;
 (pos.col + 4) > N ? end = N : end = (pos.col + 4);
 for (int i = pos.row, 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;
 }
 //2.判断列是否满足条件
 (pos.row - 4) > 0 ? begin = (pos.row - 4) : begin = 1;
 (pos.row + 4) > N ? end = N : end = (pos.row + 4);
 for (int j = pos.col, 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;
 }
 //3.判断主对角线是否满足条件
 int len = 0; //相对长度
 int start = 0;
 int finish = 0;
 pos.row > pos.col ? len = pos.col - 1 : len = pos.row - 1;
 if (len > 4){
 len = 4;
 }
 begin = pos.row - len; //横坐标起始位置
 start = pos.col - len; //纵坐标起始位置

 pos.row > pos.col ? len = N - pos.row : len = N - pos.col;
 if (len > 4){
 len = 4;
 }
 end = pos.row + len; //横坐标结束位置
 finish = pos.col + len; //纵坐标结束位置

 for (int i = begin, j = start; (i + 4 <= end) && (j + 4 <= finish); ++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;
 }
 //4.判断副对角线是否满足条件
 (pos.row - 1) > (N - pos.col) ? len = N - pos.col : len = pos.row - 1;
 if (len > 4){
 len = 4;
 }
 begin = pos.row - len; //横坐标起始位置
 start = pos.col + len; //纵坐标起始位置

 (N - pos.row) > (pos.col - 1) ? len = pos.col - 1 : len = N - pos.row;
 if (len > 4){
 len = 4;
 }
 end = pos.row + len; //横坐标结束位置
 finish = pos.col - len; //纵坐标结束位置
 for (int i = begin, j = start; (i + 4 <= end) && (j - 4 >= finish); ++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 x = 1; x < N + 1; ++x){
 for (int y = 1; y < N + 1; ++y){
 if (_ChessBoard[x][y] == ChessBoard){
 return 0; //未下棋
 }
 }
 }
 return -1; //和局
 }

 bool GetVictory(Position& pos, int player, char flag){ //判断具体哪位玩家赢
 if (JudgeVictory(pos, flag) != 0){ //判断有无人获胜
 if (JudgeVictory(pos, flag) == 1){ //判断是否有人获胜,1表示获胜
 PrintChessBoard(); //打印棋盘
 if (player == 0){
 cout << "电脑获胜!" << endl;
 }
 else{
 printf("恭喜玩家%d获胜!\n", player);
 }
 }
 else{
 printf("和局!\n");
 }
 return true; //有人获胜
 }
 return false; //没人获胜
 }

private:
 char _ChessBoard[N + 1][N + 1]; //棋盘
};

int main(){
 GoBang g;
 g.Play();
 system("pause");
 return 0;
}

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

javascript经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++面向对象实现五子棋小游戏

    尽量将面向对象的思想融入进程序中 ChessBoard.h //ChessBoard.h #pragma once #define ROW 15 #define COL 15 #include<iostream> using namespace std; class ChessBoard//棋盘类 { public: char m_cSquare[ROW][COL]; public: ChessBoard(); void show(); }; ChessBoard.cpp //ChessBoa

  • C++实现五子棋小程序

    这是一个用C++写的五子棋的小程序,关于A若是占据了已经下了的位置处理的不好.改动 hight,与width ,与q[][] 可以将棋盘扩大. #include<iostream> #include<vector> using namespace std; class qipan { public: qipan() {} ~qipan() {}; //向上下左右,斜的方向 char left(int x, int y) {//检查是否合适 if (x >= 1 &&a

  • C++简单五子棋的AI设计实现

    本文实例为大家分享了C++五子棋的AI设计实现代码,供大家参考,具体内容如下 设计思路:通过接口获取信息来确定颜色,通过set_chess函数来确定落点. 对每个点位给出两种颜色棋子的打分,分别存在两个15*15的数组里,数组下标代表点的位置. 确定最大值所在数组之后,遍历该数组找出所有最大值对应的位置,然后对这些位置统计另一种颜色的棋子的分数,再选取一次最大值,从而确定要落点的位置. 打分函数的设计:在四个方向分别统计然后相加.对于某一个方向的分数统计,则分为正反两个方向进行,统计的时候如果有

  • C++实现五子棋游戏

    三子棋.五子棋之类的游戏,非常简单,对于初学者来说是一个不错的练手的小项目,以前用C语言写过三子棋游戏.最近在看C++,所以就想到在三子棋的基础上利用C++语言实现五子棋游戏. 主要功能: 有3个模式:0表示退出.1表示电脑vs玩家.2表示玩家vs玩家. 当一局完成之后选择'y'则又会进入选择模式. 源代码(VS2013编译器下写的): #include<iostream> #include<stdio.h> #include<stdlib.h> #include &l

  • 基于C++实现五子棋AI算法思想

    今天我想要分享一下我做五子棋AI的思路.因为在做这个之前,我没有接触过任何像这种类似的东西.通过这一次,我也算是有所了解,我的思路也是来自很多网络上的博客,看了很多,最终总结出了自己的这样一个. 那我的五子棋是15*15的大小(一般也就是这样的一个大小).我的AI算法要求每一次落子之后都要去计算每一个空暇的位置的"分值",简单的说,我们需要一个存放棋子的数组,表示是否存放了棋子,还要一个计算每一个空格的数组来记录"分数",这个分数是后期AI用来运算的基础,也是你AI

  • 使用C++ MFC编写一个简单的五子棋游戏程序

    MFC简介: MFC(MicrosoftFoundationClasses)是微软基础类库的简称,是微软公司实现的一个c++类库,主要封装了大部分的windows API函数. MFC除了是一个类库以外,还是一个框架,在vc++里新建一个MFC的工程,开发环境会自动帮你产生许多文件,同时它使用了mfcxx.dll.xx是版本,它封装了mfc内核,所以你在你的代码看不到原本的SDK编程中的消息循环等等东西,因为MFC框架帮你封装好了,这样你就可以专心的考虑你程序的逻辑,而不是这些每次编程都要重复的

  • 基于c++ ege图形库实现五子棋游戏

    本文分享的五子棋实例,制作基于ege图像库, 首先需要安装配置ege环境 就可以编写小游戏了. 用到的ege库函数不多 , 主要是基于c++的. 先看界面效果: 输入界面:(就是控制台) 游戏胜利界面: 文档如下: 关于五子棋的构思: 实现人人对战的五子棋游戏.使用面向对象的c++ 和 ege库实现. ege的安装过程不在说明 , 在添加编译链接时去掉 -mwindows 选项. dev c++ 的运行环境设置为 TDM-GCC 4.8.1.32-bit Debug 为保险起见,编译时选择菜单栏

  • C++程序设计-五子棋

    前言:很多刚刚接触编程的人都不知道怎么下手编写程序,特别是学习了新的知识点,不知道有什么用,那么本文将以简单的存储结构及简单的运算,条件语句,分支语句,循环语句结合,带来一个双人对战版五子棋,这是一个简单的模型,实现了五子棋最最基本的功能,还有好多地方需要补全,如边界问题,设计问题,游戏逻辑问题,希望读者阅读后能够注意,通过自己的努力来完善它,还能扩展各种功能,如悔棋,网络对战等,有时候写程序和小生命一样,慢慢会成长,而我们作为"父母"的看到自己的小宝宝成为有用之才,过程之欣喜特别棒!

  • C++语言设计实现五子棋

    本文为大家分享了C++五子棋的设计思路和设计实现,供大家参考,具体内容如下 算法思路: 在结束了对C++的学习之后,准备自己编制一些简单的练习程序.目前初步设想是编制一个人机对战的简易五子棋软件. 以下为个人设计思考的过程. 首先,进行问题分析与设计.计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始.比赛结束后初始化棋盘,询问是否继续比赛或退出.后续可加入复盘.悔棋等功能.整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象. 棋盘类的设计. 数据存

  • C++实现简易五子棋游戏

    C++实现的简易五子棋游戏,供大家参考,具体内容如下 三个函数: void menu():                    //菜单 int fun1(char a[21][43]):   //白旗 int fun2(char a[21][43]):   //黑棋 通过二维数组来实现棋盘与棋子. 构建棋盘: 直接通过一个二维字符数组来实现棋盘,只需cout即可.比较直观,但判断条件时过于繁杂.也可以使用二维整型数组,通过不同的整数来表示不同的字符,简化判断.cout时只需根据数组元素的类型

随机推荐