双人五子棋(C++游戏)游戏代码在最底下

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

五子棋容易上手,老少皆宜,而且趣味横生,引人入胜。它不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

称谓

五子棋,日文亦有连五子、五子连、串珠、五目、五目碰、五格、五石、五法、五联、京棋等多种称谓;英文则称之为FIR(Five In A Row的缩写)、Gomoku(日语“五目”的罗马拼音)、Gobang、connect 5、mo-rphion等;捷克文piskvorky,韩文omok等等。

许多国家的人对五子棋都有不同的爱称,例如,韩国人把五子棋称为“情侣棋”,表示情人之间下五子棋有利于增加情感的交流;欧洲人称其为“绅士棋”,代表下五子棋的君子风度胜似绅士;日本人则称其为“中老年棋”,说明五子棋适合中老年人的生理特点和思维方式。

历史沿革

发展

  • 日本

关于五子棋的起源,史料上并无明确记载。相传,在“尧造围棋”之前,五子棋就已经流行于民间。大约在南北朝时期,五子棋随围棋传入高丽(今朝鲜),后又传至日本。 [7] 

起初,五子棋主要在日本的皇宫贵族间流行,到元禄(1688—1703)末期已盛行于民间。明治3年(1899),《万朝报》经过公开征名,取意《汉书·律历志上》中“日月如合璧,五星如连珠”将五子棋正式命名为“连珠”。

  • 欧洲

20世纪初,传统五子棋及连珠从日本传入欧洲。五子棋英译为“Five In A Row”(缩写为FIR),汉语拼音“wǔ zǐ qí”,同时根据日语的罗马拼音,把“五目、五目碰”英译为“Gomoku、Gobang”,“连珠”英译为“Renju”。

1958年以及1979年,瑞典和前苏联分别成立了连珠联盟。1988年,日本、前苏联以及瑞典三个国家的连珠组织在瑞典成立国际连珠联盟(Renju International Federation,简称RIF)。

20世纪90年代欧洲一些国家给传统五子棋引入“交换”等规则后,经过发展逐渐形成一系列的Gomoku新规则。中欧一些国家成立了Gomoku组织,并和六子棋共同成立了国际联盟(GCIF)。

21世纪初,在举办世界连珠(renju)锦标赛的同时也举办了世界Gomoku锦标赛(GT)及六子棋国际公开赛(CT)。

2009年8月,在捷克共和国(Czech Republic)帕尔杜比采市(Pardubice)举行了第11届世界连珠锦标赛和第3届世界Gomoku锦标赛。

  • 中国

五子棋虽起源于中国,但长久以来五子棋在中国一直没有得到发展。

2001年,国家体育总局批准中国棋院试办全国性五子棋比赛(更准确地说,这里的“五子棋”应该被称为“连珠五子棋”或“连珠棋”)。

2002年8月2—4日,中国棋院举办了首届全国五子棋个人邀请赛,此后每年举办一次。

2003年,国家体育总局批准了中国棋院审定的《中国五子棋竞赛规则》(试行)和《中国五子棋段级位制》(试行)。

2006年2月,国家体育总局对五子棋正式立项,作为围棋下的一个二级项目。全国各地相继成立了新的五子棋俱乐部。

2007年5月和10月,中国棋院先后举办了首届全国五子棋团体锦标赛和首届全国五子棋个人锦标赛。

2008年6月和12月,中国棋院先后举办了第二届全国五子棋团体锦标赛和第二届全国五子棋个人锦标赛。

2009年5月和10月,中国棋院先后举办了第三届全国五子棋团体锦标赛和第三届全国五子棋个人锦标赛。

2009年11月,首届全国智力运动会将五子棋作为正式比赛项目 [1]  。

2010年6月14日,国家体育总局棋牌运动管理中心举办了全国五子棋公开赛。

2010年11月至2011年5月,中国移动首届全国棋牌网络争霸赛设有五子棋 [2]  。

2011年11月8日至18日,在湖北省武汉市举办了第二届全国智力运动会,五子棋增设女子团体项目,湖北籍棋手喜获双冠。 [4] 

2011年11月至2012年11月,全国网络智力运动会

2013年4月1日,正式启动第二届全国网络智力运动会。

2019年,中共海口市委宣传部、海南省五子棋运动协会承办了全国五子棋锦标赛,于10月3日上午在海南省海口市黄金海景大酒店正式开赛。比赛共吸引来自北京、河北、上海、浙江、河南、山东、江苏、安徽、四川、湖北、广东、海南12个省市148名选手。

2021年,国家体育总局棋牌中心、中国棋院、海南省体育总会主办,海南省五子棋运动协会承办全国五子棋锦标赛。 [5] 

针对先行必胜的改革

随着五子棋的发展,人们逐步发现先行优势非常大,最后得出“先行必胜”的结论。五子棋要成为竞技运动,核心问题是要解决传统五子棋下法中“先行必胜”的问题。

“竞技五子棋”就是参赛双方以棋盘和棋子为介体,进行智力性对抗的竞技体育项目

“交换”思维

“交换”思维有个形象的比喻:一个人切蛋糕,一个人选蛋糕。即:一人开局,另一人选择黑方还是白方。此方法最为公平、最有效率,且最为简洁实用。不过此方法使开局者不走已知的必胜,把棋艺的较量演化为对局者开局的博弈,而“必胜开局”依然存在。

如:欧洲的Swap2、Swap1;中国的Swap3、一手交换规则等。

禁手”思维

禁止以某种手段取胜。为了平衡先后手之间的差距,削弱先手优势,日本连珠提出“禁手”。后来连珠的发展证明禁手并不能平衡先后手之间的差距,依然是“先行必胜”。

“泡沫”原理

像泡沫一样会破灭。如“吃子”五子棋。连成5个后消失,同时拿掉对方一个棋子,自己再补一子。此原理的的特点是:把五子棋金球制改成了“进球制”,同时也最大效率地利用了棋盘和棋子,带来了全新的思维。问题是怎样计算胜负。

“井字游戏”原理

井字游戏又叫圈叉棋,圈叉棋是和棋,原因是空间很小。

通过缩小棋盘来抑制五子棋先行的优势。如:15路棋盘,13路棋盘等等。问题是多大的棋盘才能是和棋,知道和棋后还能成为竞技运动吗。

跷跷板”原理

五子棋始终是先行领先一子。如果双方轮流领先一子呢

台湾教授发明的六子棋,就如“跷跷板”一样。先行先下一子,然后双方轮流下两子,先连成6子者胜利。六子棋为第11届奥林匹亚计算机游戏程序竞赛项目,验证其公平性与复杂性。

“连珠棋”原理

禁手”思维+“交换”思维+“井字游戏”原理=连珠

如:RIF规则、Sakata规则、Yamaguchi规则Tarannikov规则等。

以上内容来自百度网盘

———————————————————————————————————————————

五子棋游戏的代码:

#include<iostream>
#include<conio.h>
#include<Windows.h>
using namespace std;
int n[31][31];
int a, b;
bool gameover = false;
int win = 0;
int q;
char er;
void shuchu() {
cout << " ";
for(int z = 65; z <= q + 64; z++) {
er = z;
er = char(er);
cout << er << " ";
}
cout << endl;
for(int i = 1; i <= q; i++) {
if(i <= 9) {
cout << " "<< i;
}
if(i > 9) {
cout << i;
}
for(int j = 1; j <= q; j++) {
if(n[i][j] == 0) {
if(i == 1 && j == 1) {
cout << "┌";
continue;
}
if(i == 1 && j == q) {
cout << "┐";
continue;
}
if(i == q && j == 1) {
cout << "└";
continue;
}
if(i == q && j == q) {
cout << "┘";
continue;
}
if(i == 1) {
cout << "┬";
continue;
}
if(i == q) {
cout << "┴";
continue;
}
if(j == 1) {
cout << "├";
continue;
}
if(j == q) {
cout << "┤";
continue;
}
cout << "┼";
continue;
}
if(n[i][j] == 1) {
cout << "○" ;
continue;
}
if(n[i][j] == 2) {
cout << "●";
continue;
}
}
cout << " " << i;
cout << endl;
}
cout << " ";
for(int z = 65; z <= q + 64; z++) {
er = z;
er = char(er);
cout << er << " ";
}
cout << endl;
}
void doublep() {
int y = 1;
cout << "五子棋(双人游戏)A,B,C,D....各代表1,2,3,4...." <<endl;
cout << "输入0,0离开游戏(双方均同意)" << endl;
cout << "请选择棋盘大小:"<<endl;
cout << "小(9*9)<S> 中(15*15)<M> 大(21*21)<B> 自定义(5-26)<Y>" << endl;
char ss;
cin >> ss;
if(ss == 'S') {
q = 9;
}
if(ss == 'M') {
q = 15;
}
if(ss == 'B') {
q = 21;
}
if(ss == 'Y') {
cout << "请输入棋盘大小" << endl << "输入";
cin >> q;
if(q > 26 || q < 5) {
cout << "你还皮???" << endl;
return;
}
}
if(ss != 'S' && ss != 'M' && ss != 'B' && ss != 'Y') {
cout << "你还皮???";
return;
}
cout << "你选择了"<< q << "乘" << q << "大小的棋盘" <<endl;
cout << " ";
for(int z = 65; z <= q + 64; z++) {
er = z;
er = char(er);
cout << er << " ";
}
cout << endl;
for(int i = 1; i <= q; i++) {
if(i <= 9) {
cout << " " << i;
}
if(i > 9) {
cout << i;
}
for(int j = 1; j <= q; j++) {
if(n[i][j] == 0) {
if(i == 1 && j == 1) {
cout << "┌";
continue;
}
if(i == 1 && j == q) {
cout << "┐";
continue;
}
if(i == q && j == 1) {
cout << "└";
continue;
}
if(i == q && j == q) {
cout << "┘";
continue;
}
if(i == 1) {
cout << "┬";
continue;
}
if(i == q) {
cout << "┴";
continue;
}
if(j == 1) {
cout << "├";
continue;
}
if(j == q) {
cout << "┤";
continue;
}
cout << "┼";
continue;
}
if(n[i][j] == 1) {
cout << "○" ;
continue;
}
if(n[i][j] == 2) {
cout << "●";
continue;
}
}
cout << " " << i;
cout << endl;
}
cout << " ";
for(int z = 65; z <= q + 64; z++) {
er = z;
er = char(er);
cout << er << " ";
}
cout << endl;
while(gameover == false) {
if(y % 2 == 1) {
cout << "黑方下棋,输入放下棋子的坐标(横+竖),坐标均为数字" << endl;
cin >> a >> b;
if(a == 0 && b == 0) {
cout << "请问白方是否同意?" << endl << "同意<Y> 不同意<其他字符>" << endl;
char fg;
cin >> fg;
if(fg == 'Y') {
cout << "Bye!" << endl;
return;
} else {
cout << "白方不同意,请重新输入。" << endl;
continue;
}
}
if(a > q || b > q) {
cout << "对不起,输出超限,请重新输入。" << endl;
continue;
}
if(a < 1 || b < 1) {
cout << "对不起,输出超限,请重新输入。" << endl;
continue;
}
if(n[a][b] == 1 || n[a][b] == 2) {
cout << "对不起,此格子已有棋子,请重新输入。" << endl;
continue;
}
n[a][b] = 1;
shuchu();
}
if(y % 2 == 0) {
cout << "白方下棋,输入放下棋子的坐标(横+竖),坐标均为数字" << endl;
cin >> a >> b;
if(a == 0 && b == 0) {
cout << "请问黑方是否同意?" << endl << "同意<Y> 不同意<其他字符>" << endl;
char fg;
cin >> fg;
if(fg == 'Y') {
cout << "Bye!" << endl;
return;
} else {
cout << "黑方不同意,请重新输入。" << endl;
continue;
}
}
if(a > q || b > q) {
cout << "对不起,输出超限,请重新输入。" << endl;
continue;
}
if(a < 1 || b < 1) {
cout << "对不起,输出超限,请重新输入。" << endl;
continue;
}
if(n[a][b] == 1 || n[a][b] == 2) {
cout << "对不起,此格子已有棋子,请重新输入。" << endl;
continue;
}
n[a][b] = 2;
shuchu();
}
if(y == q * q) {
win = 3;
gameover = true;
}
for(int i = 1; i <= q; i++) {
for(int j = 1; j <= q; j++) {
if(n[i][j] == 1 && n[i + 1][j] == 1 && n[i + 2][j] == 1 && n[i + 3][j] == 1 && n[i + 4][j] == 1) {
win = 1;
gameover = true;
}
if(n[i][j] == 2 && n[i + 1][j] == 2 && n[i + 2][j] == 2 && n[i + 3][j] == 2 && n[i + 4][j] == 2) {
win = 2;
gameover = true;
}
if(n[i][j] == 2 && n[i][j + 1] == 2 && n[i][j + 2] == 2 && n[i][j + 3] == 2 && n[i][j + 4] == 2) {
win = 2;
gameover = true;
}
if(n[i][j] == 1 && n[i][j + 1] == 1 && n[i][j + 2] == 1 && n[i][j + 3] == 1 && n[i][j + 4] == 1) {
win = 1;
gameover = true;
}
if(n[i][j] == 1 && n[i + 1][j + 1] == 1 && n[i + 2][j + 2] == 1 && n[i + 3][j + 3] == 1 && n[i + 4][j + 4] == 1) {
win = 1;
gameover = true;
}
if(n[i][j] == 2 && n[i + 1][j + 1] == 2 && n[i + 2][j + 2] == 2 && n[i + 3][j + 3] == 2 && n[i + 4][j + 4] == 2) {
win = 2;
gameover = true;
}
if(n[i][j] == 2 && n[i + 1][j + 1] == 2 && n[i + 2][j + 2] == 2 && n[i + 3][j + 3] == 2 && n[i + 4][j + 4] == 2) {
win = 2;
gameover = true;
}
if(n[i][j] == 2 && n[i - 1][j + 1] == 2 && n[i - 2][j + 2] == 2 && n[i - 3][j + 3] == 2 && n[i - 4][j + 4] == 2) {
win = 2;
gameover = true;
}
if(n[i][j] == 1 && n[i - 1][j + 1] == 1 && n[i - 2][j + 2] == 1 && n[i - 3][j + 3] == 1 && n[i - 4][j + 4] == 1) {
win = 1;
gameover = true;
}
}
}
y++;
}
if(win == 1) {
cout << "恭喜黑方获胜!";
return;
}
if(win == 2) {
cout << "恭喜白方获胜!";
return;
}
if(win == 3) {
cout << "平局!";
return;
}
}
void singlep() {
cout << "五子棋(单人游戏,与电脑对抗)A,B,C各代表10,11,12" <<endl;
cout << "输入0,0离开游戏" << endl;
cout << " 1 2 3 4 5 6 7 8 9 A B C " << endl;
for(int i = 1; i <= 12; i++) {
if(i <= 9) {
cout << i << " ";
}
if(i > 9) {
cout << i;
}
for(int j = 1; j <= 12; j++) {
n[i][j] = 0;
if(n[i][j] == 0) {
if(i == 1 && j == 1) {
cout << "┌";
continue;
}
if(i == 1 && j == 12) {
cout << "┐";
continue;
}
if(i == 12 && j == 1) {
cout << "└";
continue;
}
if(i == 12 && j == 12) {
cout << "┘";
continue;
}
if(i == 1) {
cout << "┬";
continue;
}
if(i == 12) {
cout << "┴";
continue;
}
if(j == 1) {
cout << "├";
continue;
}
if(j == 12) {
cout << "┤";
continue;
}
cout << "┼";
continue;
}
if(n[i][j] == 1) {
cout << "○" ;
continue;
}
if(n[i][j] == 2) {
cout << "●";
continue;
}
}
cout << endl;
}
while(gameover == false) {
cout << "你是黑方";
}
}
int main() {
char tu;
cout << "五子棋~~" << endl;
cout << "双人模式" << endl;
cout << "输入任意键开始游戏";
getch();
system("cls");
doublep();
}

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的 C++ 双人射击小游戏代码示例,使用了 Windows API 和 Winsock2 库来实现网络连接。注意:本代码仅供学习参考,不保证完全正确和稳定,使用时请自行测试和修改。 ```cpp // 双人射击小游戏代码示例 #include <iostream> #include <windows.h> #include <winsock2.h> using namespace std; const int PORT = 9000; const int BUF_SIZE = 1024; // 定义玩家类 class Player { public: Player(int x, int y) : posX(x), posY(y) {} int posX; int posY; void move(int dx, int dy) { posX += dx; posY += dy; } }; // 初始化 Winsock2 库 void initWinsock() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { cerr << "WSAStartup failed." << endl; exit(1); } } // 创建服务器端套接字 SOCKET createServerSocket() { SOCKET serverSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (serverSocket == INVALID_SOCKET) { cerr << "Failed to create socket." << endl; exit(1); } // 绑定端口号 sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.s_addr = INADDR_ANY; if (bind(serverSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { cerr << "Failed to bind socket." << endl; closesocket(serverSocket); WSACleanup(); exit(1); } // 监听连接请求 if (listen(serverSocket, SOMAXCONN) == SOCKET_ERROR) { cerr << "Failed to listen to socket." << endl; closesocket(serverSocket); WSACleanup(); exit(1); } return serverSocket; } // 创建客户端套接字 SOCKET createClientSocket(const char* ipAddr) { SOCKET clientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (clientSocket == INVALID_SOCKET) { cerr << "Failed to create socket." << endl; exit(1); } // 连接服务器 sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); if (inet_pton(AF_INET, ipAddr, &serverAddr.sin_addr) != 1) { cerr << "Invalid IP address." << endl; closesocket(clientSocket); WSACleanup(); exit(1); } if (connect(clientSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)) == SOCKET_ERROR) { cerr << "Failed to connect to server." << endl; closesocket(clientSocket); WSACleanup(); exit(1); } return clientSocket; } // 发送数据 void sendData(SOCKET socket, const char* data, int len) { int sentBytes = 0; while (sentBytes < len) { int ret = send(socket, data + sentBytes, len - sentBytes, 0); if (ret == SOCKET_ERROR) { cerr << "Failed to send data." << endl; closesocket(socket); WSACleanup(); exit(1); } sentBytes += ret; } } // 接收数据 int recvData(SOCKET socket, char* buf) { int recvBytes = recv(socket, buf, BUF_SIZE, 0); if (recvBytes == SOCKET_ERROR) { cerr << "Failed to receive data." << endl; closesocket(socket); WSACleanup(); exit(1); } buf[recvBytes] = '\0'; return recvBytes; } // 主函数 int main() { // 初始化 Winsock2 库 initWinsock(); // 创建玩家 Player player1(0, 0); Player player2(10, 10); // 创建服务器端套接字 SOCKET serverSocket = createServerSocket(); cout << "Waiting for player 2 to connect..." << endl; // 接受连接请求 SOCKET clientSocket = accept(serverSocket, NULL, NULL); if (clientSocket == INVALID_SOCKET) { cerr << "Failed to accept connection." << endl; closesocket(serverSocket); WSACleanup(); exit(1); } cout << "Player 2 connected." << endl; // 创建客户端套接字 char ipAddr[BUF_SIZE]; cout << "Please enter the IP address of player 1: "; cin >> ipAddr; SOCKET player1Socket = createClientSocket(ipAddr); cout << "Connected to player 1." << endl; // 进入游戏循环 while (true) { // 向对方发送自己的位置 char buf[BUF_SIZE]; sprintf_s(buf, "%d %d", player1.posX, player1.posY); sendData(player2Socket, buf, strlen(buf)); sprintf_s(buf, "%d %d", player2.posX, player2.posY); sendData(player1Socket, buf, strlen(buf)); // 接受对方的位置 int recvBytes = recvData(player2Socket, buf); int posX, posY; sscanf_s(buf, "%d %d", &posX, &posY); player2.move(posX - player2.posX, posY - player2.posY); recvBytes = recvData(player1Socket, buf); sscanf_s(buf, "%d %d", &posX, &posY); player1.move(posX - player1.posX, posY - player1.posY); // 显示当前状态 system("cls"); cout << "Player 1: (" << player1.posX << ", " << player1.posY << ")" << endl; cout << "Player 2: (" << player2.posX << ", " << player2.posY << ")" << endl; // 处理输入 if (GetAsyncKeyState(VK_UP) & 0x8000) { player1.move(0, -1); } if (GetAsyncKeyState(VK_DOWN) & 0x8000) { player1.move(0, 1); } if (GetAsyncKeyState(VK_LEFT) & 0x8000) { player1.move(-1, 0); } if (GetAsyncKeyState(VK_RIGHT) & 0x8000) { player1.move(1, 0); } if (GetAsyncKeyState(VK_SPACE) & 0x8000) { // 射击 } // 延时 Sleep(50); } // 关闭套接字和 Winsock2 库 closesocket(player1Socket); closesocket(player2Socket); closesocket(serverSocket); WSACleanup(); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值