前言
众所周知,五子棋是一种两人对弈的棋类游戏,老少皆宜,很适合周末、假期、或是电脑课和信奥班摸鱼的时候玩,但是大佬们写的五子棋有些难肝出来
没事,我会教大家写一个最简单最抽象的五子棋,技术有限,加上很久没更了会有点水,写得不是很好,见谅
废话不多送,开始教程
教程
不想看教程可以直接跳到后文的完整程序去看
1.初始变量(棋盘、轮到哪个玩家出棋等)
1.在main()函数外定义全局变量棋盘,我这里的棋盘是15路的,大家可根据自己的喜好决定棋盘大小
还有玩家、玩家出棋的x、y坐标、当前局棋盘上共有多少棋子
程序:
int a[16][16]; //15路的棋盘,大家可根据自己的喜好决定棋盘大小
int p=1,x,y,sum=0;
2.玩家输入出棋位置判断
棋盘中,需要判断玩家出棋的位置是否超出x、y坐标,若超出则提示错误,并返回继续输入;若未超出,但该位置以有棋,则一样的报错返回输入;直到输入的坐标正确
程序:
bool n=0;
do{
printf("请玩家%d输入出棋的y、x坐标:",p);
cin>>x>>y;
if((1<=x&&x<=15)&&(1<=y&&y<=15)){
if(a[y][x]==0){
a[y][x]=p;
sum++;
printf("\n%d号玩家已出棋\n",p);
n=1;
}
else{
printf("该位置已有棋\n\n\n");
n=0;
}
}
else{
printf("输入错误,请重新输入\n\n\n");
n=0;
}
}
while(n==0);
3.输出棋盘
循环输出棋盘(此处程序输出的棋子用数字代表,若要字符代表棋子可直接看后文的优化)
程序:
printf("棋盘状况:\n");
for(int i=1;i<=15;i+=1){
for(int j=1;j<=15;++j) cout<<a[i][j]<<" ";
cout<<endl;
}
printf("\n\n\n");
4.是否有玩家连成五子判断
遍历整个棋子,先找横排再找竖排,然后是对角线,若找到连着的五子则提示该玩家胜利,并跳出循环;
若没有连成五子,则切换下一个玩家
当然,大家可以优化一下,直接以这回玩家出棋的位置为中心遍历,这里就不写了,留给大家思考的余地
程序:
for(int i=1;i<=11;++i){
for(int j=1;j<=15;++j){
if((a[j][i]==a[j+1][i]&&a[j][i]==a[j+2][i]&&a[j][i]==a[j+3][i]&&a[j][i]==a[j+4][i])&&a[j][i]!=0){
printf("%d号玩家胜利!\n\n\n",p);system("pause");
return 0;
}
}
}
for(int i=1;i<=11;++i){
for(int j=1;j<=11;++j){
if((a[i][j]==a[i+1][j+1]&&a[i][j]==a[i+2][j+2]&&a[i][j]==a[i+3][j+3]&&a[i][j]==a[i+4][j+4])&&a[i][j]!=0){
printf("%d号玩家胜利!\n\n\n",p);system("pause");
return 0;
}
}
}
for(int i=15;i>=5;--i){
for(int j=1;j<=11;++j){
if((a[i][j]==a[i-1][j+1]&&a[i][j]==a[i-2][j+2]&&a[i][j]==a[i-3][j+3]&&a[i][j]==a[i-4][j+4])&&a[i][j]!=0){
printf("%d号玩家胜利!\n\n\n",p);system("pause");
return 0;
}
}
}
if(p==1) p=2;
else if(p==2) p=1;
5.平局
当棋盘上没有空位,即sum=225时,则跳出循环,提示平局
程序:
if(sum==225) printf("平局\n\n");
system("pause");
return 0;
完整程序
以下是完整程序:
#include<bits/stdc++.h>
using namespace std;
int a[16][16];
int p=1,x,y,sum=0;
int main(){
while(sum<=225){
bool n=0;
do{
printf("请玩家%d输入出棋的y、x坐标:",p);
cin>>x>>y;
if((1<=x&&x<=15)&&(1<=y&&y<=15)){
if(a[y][x]==0){
a[y][x]=p;
sum++;
printf("\n%d号玩家已出棋\n",p);
n=1;
}
else{
printf("该位置已有棋\n\n\n");
n=0;
}
}
else{
printf("输入错误,请重新输入\n\n\n");
n=0;
}
}
while(n==0);
printf("棋盘状况:\n");
for(int i=1;i<=15;i+=1){
for(int j=1;j<=15;++j) cout<<s[a[i][j]]<<" ";
cout<<endl;
}
printf("\n\n\n");
for(int i=1;i<=11;++i){
for(int j=1;j<=15;++j){
if((a[i][j]==a[i][j+1]&&a[i][j]==a[i][j+2]&&a[i][j]==a[i][j+3]&&a[i][j]==a[i][j+4])&&a[i][j]!=0){
printf("%d号玩家胜利!\n\n\n",p);
system("pause");
return 0;
}
}
}
for(int i=1;i<=11;++i){
for(int j=1;j<=15;++j){
if((a[j][i]==a[j+1][i]&&a[j][i]==a[j+2][i]&&a[j][i]==a[j+3][i]&&a[j][i]==a[j+4][i])&&a[j][i]!=0){
printf("%d号玩家胜利!\n\n\n",p);
system("pause");
return 0;
}
}
}
for(int i=1;i<=11;++i){
for(int j=1;j<=11;++j){
if((a[i][j]==a[i+1][j+1]&&a[i][j]==a[i+2][j+2]&&a[i][j]==a[i+3][j+3]&&a[i][j]==a[i+4][j+4])&&a[i][j]!=0){
printf("%d号玩家胜利!\n\n\n",p);
system("pause");
return 0;
}
}
}
for(int i=15;i>=5;--i){
for(int j=1;j<=11;++j){
if((a[i][j]==a[i-1][j+1]&&a[i][j]==a[i-2][j+2]&&a[i][j]==a[i-3][j+3]&&a[i][j]==a[i-4][j+4])&&a[i][j]!=0){
printf("%d号玩家胜利!\n\n\n",p);
system("pause");
return 0;
}
}
}
if(p==1) p=2;
else if(p==2) p=1;
FLAG:
if(star==0) break;
}
if(sum==225&&star==1) printf("平局\n\n");
system("pause");
return 0;
}
优化
1.用字符代表棋子
定义全局变量,也可以定义成自己想输出的字符
string s[3]={"0 ","●","○"};
棋盘输出很简单,只需改为以下程序即可
printf("棋盘状况:\n");
for(int i=1;i<=15;i+=1){
for(int j=1;j<=15;++j) cout<<s[a[i][j]];
cout<<endl;
}
printf("\n\n\n");
结束语
希望这个教程能对大家有帮助,文章到此结束,谢谢大家