[收藏]C++简单五子棋

  1 #include<iostream>
  2 #include<iomanip>
  3 using namespace std;
  4
  5 const int X = 21; //棋盘行数
  6 const int Y = 21; //棋盘列数
  7 char p[X][Y];  //定义棋盘
  8 int m = 0;//定义临时点,保存输入坐标
  9 int n = 0;
 10
 11 void display()  //输出棋盘
 12 {
 13     for (int i = 0; i < X; i++)
 14         cout << setw(3) << setfill(‘ ‘) << i;
 15     cout << endl;
 16     for ( int i = 1; i < Y; i++)
 17     {
 18         cout << setw(3) << setfill(‘ ‘) << i;
 19         for (int j = 1; j < X; j++)
 20             cout << setw(3) << setfill(‘ ‘) << p[i][j];
 21         cout << endl;
 22     }
 23
 24 }
 25
 26 void black()  //黑方落子
 27 {
 28     cout << "请黑方输入落子位置:\n"
 29         << "请输入落子的行数:";
 30     cin >> m;
 31     cout << "请输入落子的列数:";
 32     cin >> n;
 33     if (m <= 0 || m >= X || n >= Y || n <= 0)
 34     {
 35         cout << "超出棋盘范围,请重新输入正确坐标!\n";
 36         black();
 37     }
 38     else if ((p[m][n] == 1) || p[m][n] == 2)
 39     {
 40         cout << "该点已有棋子,请重新选取落子点!\n";
 41         black();
 42     }
 43     else
 44         p[m][n] = 1; //黑方用1来表示
 45     system("cls");
 46     display();
 47 }
 48
 49 void red()  //红方落子
 50 {
 51     cout << "请红方输入落子位置:\n"
 52         << "请输入落子的行数:";
 53     cin >> m;
 54     cout << "请输入落子的列数:";
 55     cin >> n;
 56     if (m >= X || m <= 0 || n <= 0 || n >= Y)
 57     {
 58         cout << "超出棋盘范围,请重新输入正确坐标!\n";
 59         red();
 60     }
 61     else if ((p[m][n] == 1) || p[m][n] == 2)
 62     {
 63         cout << "该点已有棋子,请重新选取落子点!\n";
 64         red();
 65     }
 66     else
 67         p[m][n] = 2; //红方用2来表示
 68     system("cls");
 69     display();
 70 }
 71
 72 int evalue()  //只需要判断落子点为中心的九点“米”字是否连续即可
 73 {
 74     int k = 0, r = 0;
 75     /*斜线判断*/
 76     for (k = 3; k < X - 2; k++)  //两条,其中的p[k][r]!=‘-‘是排除空子的情况
 77     {
 78         for (r = 3; r < Y - 2; r++)
 79         {
 80             if (p[k][r] != ‘-‘&&p[k - 2][r - 2] == p[k][r]
 81                 &&p[k - 1][r - 1] == p[k][r] && p[k + 1][r + 1] == p[k][r]
 82                 &&p[k + 2][r + 2] == p[k][r])
 83                 return 1;
 84             else if (p[k][r] != ‘-‘&&p[k + 2][r - 2] == p[k][r]
 85                 && p[k + 1][r - 1] == p[k][r]
 86                 && p[k - 1][r + 1] == p[k][r] && p[k - 2][r + 2] == p[k][r])
 87                 return 1;
 88         }
 89     }
 90     /*横线判断*/
 91     for (k = 1; k < X; k++)  //p[k][r]!=‘-‘是排除空子的情况
 92         for (r = 3; r < Y - 2; r++)
 93             if (p[k][r] != ‘-‘&&p[k][r - 2] == p[k][r]
 94                 && p[k][r - 1] == p[k][r]
 95                 && p[k][r + 1] == p[k][r] && p[k][r + 2] == p[k][r])
 96                 return 1;
 97     /*竖线判断*/
 98     for (k = 3; k < X - 2; k++)  //p[k][r]!=‘-‘是排除空子的情况
 99         for (r = 1; r < Y; r++)
100             if (p[k][r] != ‘-‘&&p[k - 2][r] == p[k][r]
101                 && p[k - 1][r] == p[k][r]
102                 && p[k + 1][r] == p[k][r] && p[k + 2][r] == p[k][r])
103                 return 1;
104     return 0;
105 }
106
107 int main()
108 {
109     memset(p, ‘-‘, 441);  //初始化为‘-’
110     cout << "欢迎使用简易双人对战五子棋游戏\n"
111         << "五子棋棋谱如下:\n";
112     display();
113     while (1)
114     {
115         red();
116         if (evalue())
117         {
118             cout << "红方赢!\n";
119             break;
120         }
121         black();
122         if (evalue())
123         {
124             cout << "黑方赢!\n";
125             break;
126         }
127     }
128     return 0;
129 }

小知识解释:

setw和setfill函数(#include<iomanip>)

setw(n)使得输出结果右对齐,左边默认用空格填充,若设置了setfill,则用setfill里面的字符来填充。

如果输出选项少于n,则填充,否则不会填充,自然输出。相关代码解释见"C++小知识积累"

时间: 2024-10-11 06:44:19

[收藏]C++简单五子棋的相关文章

控制台简单五子棋

1 import java.util.Scanner; 2 3 //控制台简单五子棋 4 public class wuziqi { 5 6 //二维数组作为棋盘 7 private static char[][] board=new char[16][16]; 8 //已下棋子数目 9 private static int cnt; 10 //分别代表玩家1,2的棋子 11 private static char[] qizi={'#','@'}; 12 //八方向搜索检测 13 privat

简单五子棋,没有电脑AI

刚学了C#委托,做了个五子棋练习,把前台绘制和后台逻辑分开,前台绘制方法用委托传给后台逻辑. 界面好简单... 先看类图 控制类控制整个游戏的逻辑,包括调用棋盘类的属性初始化棋盘.初始化两个棋手.轮流落子.棋盘里有一个二维数组保存整个棋盘的落子情况,棋手里也有一个二维数组保存自己的落子情况.方向类是为了方便判断输赢的. 下面是代码:注释很详细就不说明了: 主要控制类: 1 using System; 2 using System.Collections.Generic; 3 using Syst

控制台的简单五子棋

只实现了最基本的功能,玩家下棋和电脑随机下棋.缺乏输入检查,重复下棋检查,判断输赢,人工智能算法等等. 待完善. 1 import java.io.BufferedReader; 2 import java.io.InputStreamReader; 3 4 // GoBang(五子棋) 5 class GoBang { 6 // 二维数组来模拟一个棋盘 7 private String[][] board; 8 // 表示棋盘的长.宽度 9 private static int BOARD_S

【收藏】简单方便的自助106短信群发工具

个人或者小规模店家要做短信营销或者短信通知,如何选择一家合适的短信群发平台,需要考虑以下几点. 1. 是否能发出去,到达率高,速度快. 根据短信内容性质不同,如果是广告营销,各个平台都要进行审核.需要提供证件,营业执照等. 这对于很多个人用户而言是没有相关资质的,需要各种繁杂手续和流程,非常麻烦. 2. 价格合适,无起发量限制. 遇到过有的平台一上来就要求先充值500,1000的,甚至连试用都没有. 3. 简单易操作. 操作界面简单方便,容易使用,手机上就可以发送. 找过十多家短信发送平台后,比

简单五子棋

#include<iostream> #include <vector> #include <windows.h> using namespace std; const int Max=19; ///该位置手否已被占用 bool PZ(vector<vector<int> > &aaa,int x,int y ); ///判断胜方 bool SF(vector<vector<int> > &aaa,int

简单五子棋实现

一.定义一个对手Rival类 package com.itwang.gonbang; public class Rival { private String color;//颜色 private String nickName;//昵称 public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } public Stri

C++的简单“五子棋”游戏,只是核心代码,资源代码未添加

ChessBoard.h 1 #ifndef __CHESS_BOARD_H__ 2 #define __CHESS_BOARD_H__ 3 4 #include "DataStruct.h" 5 6 #define COL_WIDTH 45 7 #define ROW_WIDTH 45 8 9 class CChessBoard : public CWnd 10 { 11 private: 12 CBitmap m_bitBlackChess, m_bitWhiteChess; 13

java程序--控制台五子棋

控制台五子棋,具体思路见代码注释. 代码如下: <span style="font-size:18px;">package test; import java.io.IOException; import java.util.Scanner; //控制台简单五子棋 public class GoBang { //二维数组作为棋盘 private static char[][] board=new char[16][16]; //已下棋子数目 private static i

人机五子棋

利用简单的算法实现一个简单五子棋: css代码: *{margin:0;padding: 0}    img{        margin-left: 20px;        height: 630px;        width: 1300px;        position: absolute;    }      canvas{          display: block;          margin:auto;          box-shadow: -2px -2px 2