C++实现五子棋小游戏
短信预约 -IT技能 免费直播动态提醒
本文实例为大家分享了C++实现五子棋小游戏的具体代码,供大家参考,具体内容如下
思路:先用用system(“color 70”)改变控制台的背景色为灰白色,前景色为黑色,然后用“■”打印棋盘,然后用SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a)改变输出颜色分别为白色和黑色,用字符“●”打印黑棋和白棋。
整个棋盘用一个char类型的二维数组保存,空的地方用‘ ’标识,玩家一下棋的地方用‘x’标识,玩家二下棋的地方用‘o’标识(电脑算作玩家一)。
核心代码模块在于胜负判断,如何在char类型的二维数组中找到五星连珠?
主要思路:每落一子判断一次,从这个子向前数四个向后数四个,在这九个子中从头向后查找,看是否有五个子完全相同,若有这胜利
int judgewiner1(char a, coordinate temp)//判断横排
{
coordinate begin, end;
begin.x = end.x = temp.x;
if (temp.y <= 5)begin.y = 1;
else begin.y = temp.y - 4;
if (temp.y >= N-5)end.y = N-1;
else end.y = temp.y + 4;
for (int i = begin.x, j = begin.y; j <= end.y - 4; ++j)
{
if (chessboard[i][j] == a && chessboard[i][j] == chessboard[i][j + 1] && chessboard[i][j + 1] == chessboard[i][j + 2] && chessboard[i][j + 2] == chessboard[i][j + 3] && chessboard[i][j + 3]== chessboard[i][j + 4])
return 1;
}
return 0;
}
int judgewiner2(char a, coordinate temp)//判断竖排
{
coordinate begin, end;
begin.y = end.y = temp.y;
if (temp.x <= 5)begin.x = 1;
else begin.x = temp.x - 4;
if (temp.x >= N-5)end.x = N-1;
else end.x = temp.x + 4;
for (int i = begin.x,j = begin.y; i <= end.x - 4; ++i)
{
if (chessboard[i][j] == a && chessboard[i][j] == chessboard[i + 1][j] && chessboard[i + 1][j] == chessboard[i + 2][j] && chessboard[i + 2][j] == chessboard[i + 3][j] && chessboard[i + 3][j]== chessboard[i + 4][j])
return 1;
}
return 0;
}
int judgewiner3(char a, coordinate temp)//判断主对角线
{
coordinate begin, end;
if (temp.x <= 5)begin.x = 1;
else begin.x = temp.x - 4;
if (temp.y <= 5)begin.y = 1;
else begin.y = temp.y - 4;
if (temp.x >= N-5)end.x = N-1;
else end.x = temp.x + 4;
if (temp.y >= N-5)end.y = N-1;
else end.y = temp.y + 4;
for (int i = begin.x,j = begin.y; i <= end.x-4&&j <= end.y-4; ++i, ++j)
{
if (chessboard[i][j] == a && chessboard[i][j] == chessboard[i + 1][j + 1] && chessboard[i + 1][j + 1] == chessboard[i + 2][j + 2] && chessboard[i + 2][j + 2] == chessboard[i + 3][j + 3] && chessboard[i + 3][j + 3]==chessboard[i + 4][j + 4])
return 1;
}
return 0;
}
int judgewiner4(char a, coordinate temp)//判断负对角线
{
coordinate begin, end;
if (temp.x<=5)begin.x = 1;
else begin.x = temp.x - 4;
if (temp.y >= N-5)begin.y = N-1;
else begin.y = temp.y + 4;
if (temp.x >= N-5)end.x = N-1;
else end.x = temp.x + 4;
if (temp.y <= 5)end.y = 1;
else end.y = temp.y - 4;
for (int i = begin.x,j = begin.y; i <= end.x - 4 && j >= end.y - 4; ++i, --j)
{
if (chessboard[i][j] == a && chessboard[i][j] == chessboard[i + 1][j - 1] && chessboard[i + 1][j - 1] == chessboard[i + 2][j - 2] && chessboard[i + 2][j - 2] == chessboard[i + 3][j - 3] && chessboard[i + 3][j - 3]==chessboard[i + 4][j - 4])
return 1;
}
return 0;
}
int judgeheqi()//判断和棋
{
for(int i=1;i<N;++i)
for (int j = 1; j < N; ++j)
if (chessboard[i][j] == ' ')return 1;
return -1;
}
下面是完整代码:
//玩家一与电脑用‘x'标识,玩家二用'o'标识
#include<iostream>
#include<vector>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
using namespace::std;
#define N 20
char chessboardflag = ' '; //棋盘标志
void color(int a)//改变颜色的函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}
class coordinate //坐标类
{
public:
int x;
int y;
};
class fivechess
{
public:
void initchessboard()//初始化棋盘
{
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
chessboard[i][j] = chessboardflag;
printchessboard();
}
void printchessboard()//打印棋盘
{
system("cls");
system("color 70");
cout << " 1 2 3 4 5 6 7 8 9 10111213141516171819"<<endl;
for (int i = 1; i < N; ++i) {
for (int j = 0; j < N; ++j)
{
if (j == 0) {
if (i <= 9)cout << i << " ";
else cout << i;
}
else
{
if (chessboard[i][j] == 'x')
{
color(0x70);
cout << "●";
}
else if (chessboard[i][j] == 'o')
{
color(0x7f);
cout << "●";
}
else
{
color(0x74);
cout << "■";
}
}
}
cout << endl;
color(0x70);
}
}
coordinate playchess1() //玩家一下棋
{
cout << "请玩家一输入坐标:" << endl;
int x1, y1;
while (cin >> x1 >> y1)
{
if (x1 > N-1 || y1 > N-1 || x1 < 0 || y1 < 0)
{
cout << "输入超界,请从新输入" << endl;
continue;
}
if (chessboard[x1][y1] == ' ') {
chessboard[x1][y1] = 'x';
break;
}
else
{
cout << "输入错误,请重新输入";
}
}
coordinate temp;
temp.x = x1;
temp.y = y1;
return temp;
}
coordinate playchess2() //玩家二下棋
{
cout << "请玩家2输入坐标:" << endl;
int x2, y2;
while (cin >> x2 >> y2)
{
if (x2 > N-1 || y2 > N-1 || x2 < 0 || y2 < 0)
{
cout << "输入超界,请从新输入" << endl;
continue;
}
if (chessboard[x2][y2] == ' ') {
chessboard[x2][y2] = 'o';
break;
}
else
{
cout << "输入错误,请重新输入";
}
}
coordinate temp;
temp.x = x2;
temp.y = y2;
return temp;
}
coordinate computerplayer()//电脑下棋
{
coordinate temp;
srand((unsigned)time(NULL));
int x1 = 0, y1 = 0;
while ((x1 = (rand() % (N-1)) + 1) && (y1 = (rand() % (N-1)) + 1))
{
if (chessboard[x1][y1] == ' ') {
chessboard[x1][y1] = 'x';
break;
}
else continue;
}
temp.x = x1; temp.y = y1;
return temp;
}
int judgewiner1(char a, coordinate temp)//判断横排
{
coordinate begin, end;
begin.x = end.x = temp.x;
if (temp.y <= 5)begin.y = 1;
else begin.y = temp.y - 4;
if (temp.y >= N-5)end.y = N-1;
else end.y = temp.y + 4;
for (int i = begin.x, j = begin.y; j <= end.y - 4; ++j)
{
if (chessboard[i][j] == a
&& chessboard[i][j] == chessboard[i][j + 1]
&& chessboard[i][j + 1] == chessboard[i][j + 2]
&& chessboard[i][j + 2] == chessboard[i][j + 3]
&& chessboard[i][j + 3] == chessboard[i][j + 4])
return 1;
}
return 0;
}
int judgewiner2(char a, coordinate temp)//判断竖排
{
coordinate begin, end;
begin.y = end.y = temp.y;
if (temp.x <= 5)begin.x = 1;
else begin.x = temp.x - 4;
if (temp.x >= N-5)end.x =N-1;
else end.x = temp.x + 4;
for (int i = begin.x, j = begin.y; i <= end.x - 4; ++i)
{
if (chessboard[i][j] == a
&& chessboard[i][j] == chessboard[i + 1][j]
&& chessboard[i + 1][j] == chessboard[i + 2][j]
&& chessboard[i + 2][j] == chessboard[i + 3][j]
&& chessboard[i + 3][j] == chessboard[i + 4][j])
return 1;
}
return 0;
}
int judgewiner3(char a, coordinate temp)//判断主对角线
{
coordinate begin, end;
if (temp.x <= 5)begin.x = 1;
else begin.x = temp.x - 4;
if (temp.y <= 5)begin.y = 1;
else begin.y = temp.y - 4;
if (temp.x >= N-5)end.x = N-1;
else end.x = temp.x + 4;
if (temp.y >= N-5)end.y = N-1;
else end.y = temp.y + 4;
for (int i = begin.x, j = begin.y; i <= end.x - 4 && j <= end.y - 4; ++i, ++j)
{
if (chessboard[i][j] == a && chessboard[i][j] == chessboard[i + 1][j + 1]
&& chessboard[i + 1][j + 1] == chessboard[i + 2][j + 2]
&& chessboard[i + 2][j + 2] == chessboard[i + 3][j + 3]
&& chessboard[i + 3][j + 3] == chessboard[i + 4][j + 4])
return 1;
}
return 0;
}
int judgewiner4(char a, coordinate temp)//判断负对角线
{
coordinate begin, end;
if (temp.x <= 5)begin.x = 1;
else begin.x = temp.x - 4;
if (temp.y >= N-5)begin.y = N-1;
else begin.y = temp.y + 4;
if (temp.x >= N-5)end.x = N-1;
else end.x = temp.x + 4;
if (temp.y <= 5)end.y = 1;
else end.y = temp.y - 4;
for (int i = begin.x, j = begin.y; i <= end.x - 4 && j >= end.y - 4; ++i, --j)
{
if (chessboard[i][j] == a
&& chessboard[i][j] == chessboard[i + 1][j - 1]
&& chessboard[i + 1][j - 1] == chessboard[i + 2][j - 2]
&& chessboard[i + 2][j - 2] == chessboard[i + 3][j - 3]
&& chessboard[i + 3][j - 3] == chessboard[i + 4][j - 4])
return 1;
}
return 0;
}
int judgeheqi()//判断和棋
{
for (int i = 1; i < N; ++i)
for (int j = 1; j < N; ++j)
if (chessboard[i][j] == ' ')return 1;
return -1;
}
void play()
{
initchessboard();//初始化棋盘
int t;
cout << "请选择模式,人机模式输入1,人人模式输入2。" << endl;
cin >> t;
while (t == 1)
{
int m = judgeheqi();
if (m == -1)
{
cout << "和棋!!!" << endl;
break;
}
coordinate temp1 = computerplayer();//电脑下棋
printchessboard();//打印棋盘
if (judgewiner1('x', temp1) || judgewiner2('x', temp1) || judgewiner3('x', temp1) || judgewiner4('x', temp1))
{
cout << "电脑胜!!!";
break;
}
coordinate temp2 = playchess2();//玩家2下棋
printchessboard();//打印棋盘
if (judgewiner1('o', temp2) || judgewiner2('o', temp2) || judgewiner3('o', temp2) || judgewiner4('o', temp2))
{
cout << "玩家2胜!!!";
break;
}
}
while (t == 2)
{
int m = judgeheqi();
if (m == -1)
{
cout << "和棋!!!" << endl;
break;
}
coordinate temp1 = playchess1();//电脑下棋
printchessboard();//打印棋盘
if (judgewiner1('x', temp1) || judgewiner2('x', temp1) || judgewiner3('x', temp1) || judgewiner4('x', temp1))
{
cout << "玩家1胜!!!";
break;
}
coordinate temp2 = playchess2();//玩家2下棋
printchessboard();//打印棋盘
if (judgewiner1('o', temp2) || judgewiner2('o', temp2) || judgewiner3('o', temp2) || judgewiner4('o', temp2))
{
cout << "玩家2胜!!!";
break;
}
}
}
private:
char chessboard[N][N]; //棋盘
};
int main()
{
fivechess one;
one.play();
return 0;
}
运行结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341