课设题目
五子棋对弈游戏程序
功能需求
实现五子棋对弈游戏程序,要求能实现按照规则的开局、走棋、吃子以及胜负判定功能,包括相应的图形界面以及声音效果。
如果有简单的人机对战功能可作为加分项
程序运行界面
程序源码
#include<iostream>
#include<ctime>
#include<stdlib.h>
#include<iomanip>
#include<windows.h>
#include<mmsystem.h>
#include<cmath>
#pragma comment(lib,"winmm.lib")
using namespace std;
inline void red(){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_RED);}
inline void blue(){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE | FOREGROUND_BLUE);}
inline void black(){ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
BACKGROUND_RED | BACKGROUND_GREEN | BACKGROUND_BLUE);}
int main()
{
int flagx=0;
cout<<"请选择对战方式:"<<endl;
cout<<"1.人机对战"<<endl;
cout<<"2.双人对战"<<endl;
cin>>flagx;
// 选择了人机对战方式
if(flagx==1)
{
system("color F0");
PlaySound(".\\说好不哭.wav",NULL,SND_ASYNC | SND_NODEFAULT);
int i,j,x,y,t=1,wan=0,ping=0;//t-颜色 wan-数值为1时结束
char a[15][15];//表层数据
int b[19][19]={0};//里层数据,b的(i+2,j+2)与a的(i,j)对应
int flag=1,o1,o2,o3,o4,o,h;
char ge[15]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e'};//格式辅助
for(i=0;i<15;++i)
{
for(j=0;j<15;++j)
a[i][j]='-';
}
while(ping<200)//总循环
{
cout << "\t\t " ;
for(i=0;i<15;++i) cout << ge[i] << " ";//辅助格式
cout << endl;
for(i=0;i<15;++i)//行展开
{
cout << "\t\t" << ge[i] << " ";
for(j=0;j<15;++j)//列展开
{
if(a[i][j]=='0')
{if(b[i+2][j+2]==1)red();
else blue();}//控制双方颜色,里层数据中红为1,蓝为-1.结合上次循环
cout << a[i][j] << " ";
black();//返回黑色
}
cout << endl;
}
for(i=0;i<15;++i)
{
for(j=0;j<15;++j)
{
if(i<15&&j<11&&abs(b[i+2][j+2]+b[i+2][j+2+1]+b[i+2][j+2+2]+b[i+2][j+2+3]+b[i+2][j+2+4])>4) {wan=1;break;break;}//行间判断连续五个数的里层数据的和的绝对值是否大于4
if(i<11&&j<15&&abs(b[i+2][j+2]+b[i+2+1][j+2]+b[i+2+2][j+2]+b[i+2+3][j+2]+b[i+2+4][j+2])>4) {wan=1;break;break;}//列间
if(i<11&&j<11&&abs(b[i+2][j+2]+b[i+2+1][j+2+1]+b[i+2+2][j+2+2]+b[i+2+3][j+2+3]+b[i+2+4][j+2+4])>4) {wan=1;break;break;}//从左上到右下
if(i<11&&j<11&&abs(b[14-i+2][j+2]+b[13-i+2][j+2+1]+b[12-i+2][j+2+2]+b[11-i+2][j+2+3]+b[10-i+2][j+2+4])>4) {wan=1;break;break;}//从左下到右上
}
}
ping++;
if(wan==1) break;//wan数值为1时结束
flag=1;
while(flag==1)//输入下一步棋
{
if(t==1)//人红
{
red();
cout <<"\t\t\t(x,y)=";
cin >> x >> y;
if(b[x+2][y+2]==0&&x<15&&y<15&&x>-1&&y>-1)
{
flag=0;
a[x][y]='0';
b[x+2][y+2]=t;
black();//返回黑色
t-=2;
}
else cout <<"\t\t\t错误请重新输入:"<< endl;
}
else//电脑蓝
{
blue();
o1=b[x+2][y+2]+b[x+2][y+2+1]+b[x+2][y+2+2]+b[x+2][y+2-1]+b[x+2][y+2-2];
o2=b[x+2][y+2]+b[x+2+1][y+2]+b[x+2+2][y+2]+b[x+2-1][y+2]+b[x+2-2][y+2];
o3=b[x+2][y+2]+b[x+2+1][y+2+1]+b[x+2+2][y+2+2]+b[y+2-1][j+2-1]+b[x+2-2][y+2-2];
o4=b[x+2][y+2]+b[x+2+1][y+2-1]+b[x+2+2][y+2-2]+b[y+2-1][j+2+1]+b[x+2-2][y+2+2];
o=(o1>o2?o1:o2)>(o3>o4?o3:o4)?(o1>o2?o1:o2):(o3>o4?o3:o4);
if(o==o1)
for(h=1;;++h)
{
if(a[x][y+h]=='-'&&y+h<=14) {y=y+h;break;}
if(a[x][y-h]=='-'&&y-h>=0) {y=y-h;break;}
if(y+h>14&&y-h<0)
{
if(x<=8) x++;
else x--;
h=1;
}//此行已满的措施
}
else if(o==o2)
for(h=1;;++h)
{
if(a[x+h][y]=='-'&&x+h<=14) {x=x+h;break;}
if(a[x-h][y]=='-'&&x-h>=0) {x=x-h;break;}
if(x+h>14&&x-h<0)
{
if(y<=8) x++;
else y--;
h=1;
}//此列已满的措施
}
else if(o==o3)
for(h=1;;++h)
{
if(a[x+h][y+h]=='-'&&y+h<=14&&x+h<=14) {x=x+h;y=y+h;break;}
if(a[x-h][y-h]=='-'&&y-h>=0&&x-h>=0) {x=x-h;y=y-h;break;}
if((x+h>14||y+h>14)&&(y-h<0||x-h<0))
{
if(y<=8) y++;
else y--;
h=1;
}//o3已满的措施
}
else
for(h=1;;++h)
{
if(a[x+h][y-h]=='-'&&x+h<=14&&y-h>=0) {x=x+h;y=y-h;break;}
if(a[x-h][y+h]=='-'&&y+h<=14&&x-h>=0) {x=x-h;y=y+h;break;}
if((x+h>14||y-h<0)&&(y+h>14||x-h<0))
{
if(y<=8) y++;
else y--;
h=1;
}//o4已满的措施
}
flag=0;
a[x][y]='0';
b[x+2][y+2]=t;
black();//返回黑色
t+=2;
}
}
system("cls");//清屏
blue();//在人的回合用蓝色输出上一步电脑的操作
cout << "\t\t\t(x,y)=" << x << " " << y << endl;
black();//返回黑色
}//总循环结束
if(b[i+2][j+2]!=1)
{
blue();
cout << "\t\t\YOU WIN!" << endl;
}
else if(b[i+2][j+2]==1)
{
red();
cout << "\t\t\t YOU LOSE!" << endl;
}
else
cout << "平局!" << endl;//平局
}
// 选择了双人对战
else
{
system("color F0");
PlaySound(".\\说好不哭.wav",NULL,SND_ASYNC | SND_NODEFAULT);
int i,j,x,y,t=1,wan=0,ping=0;//t-颜色 wan-数值为1时结束
char a[15][15];//表层数据
int b[19][19]={0};//里层数据,b的(i+2,j+2)与a的(i,j)对应
int flag=1,o1,o2,o3,o4,o,h;
char ge[15]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e'};//格式辅助
for(i=0;i<15;++i)
{
for(j=0;j<15;++j)
a[i][j]='-';
}
while(ping<200)//总循环
{
cout << "\t\t " ;
for(i=0;i<15;++i) cout << ge[i] << " ";//辅助格式
cout << endl;
for(i=0;i<15;++i)//行展开
{
cout << "\t\t" << ge[i] << " ";
for(j=0;j<15;++j)//列展开
{
if(a[i][j]=='0')
{if(b[i+2][j+2]==1)red();
else blue();}//控制双方颜色,里层数据中红为1,蓝为-1.结合上次循环
cout << a[i][j] << " ";
black();//返回黑色
}
cout << endl;
}
for(i=0;i<15;++i)
{
for(j=0;j<15;++j)
{
if(i<15&&j<11&&abs(b[i+2][j+2]+b[i+2][j+2+1]+b[i+2][j+2+2]+b[i+2][j+2+3]+b[i+2][j+2+4])>4) {wan=1;break;break;}//行间判断连续五个数的里层数据的和的绝对值是否大于4
if(i<11&&j<15&&abs(b[i+2][j+2]+b[i+2+1][j+2]+b[i+2+2][j+2]+b[i+2+3][j+2]+b[i+2+4][j+2])>4) {wan=1;break;break;}//列间
if(i<11&&j<11&&abs(b[i+2][j+2]+b[i+2+1][j+2+1]+b[i+2+2][j+2+2]+b[i+2+3][j+2+3]+b[i+2+4][j+2+4])>4) {wan=1;break;break;}//从左上到右下
if(i<11&&j<11&&abs(b[14-i+2][j+2]+b[13-i+2][j+2+1]+b[12-i+2][j+2+2]+b[11-i+2][j+2+3]+b[10-i+2][j+2+4])>4) {wan=1;break;break;}//从左下到右上
}
}
ping++;
if(wan==1) break;//wan数值为1时结束
flag=1;
while(flag==1)//输入下一步棋
{
if(t==1)//人红
{
red();
cout <<"\t\t\t(x,y)=";
cin >> x >> y;
if(b[x+2][y+2]==0&&x<15&&y<15&&x>-1&&y>-1)
{
flag=0;
a[x][y]='0';
b[x+2][y+2]=t;
black();//返回黑色
t-=2;
}
else cout <<"\t\t\t错误请重新输入:"<< endl;
}
else//电脑蓝
{
blue();
cout <<"\t\t\t(x,y)=";
cin >> x >> y;
if(b[x+2][y+2]==0&&x<15&&y<15&&x>-1&&y>-1)
{
flag=0;
a[x][y]='0';
b[x+2][y+2]=t;
black();//返回黑色
t+=2;
}
else cout <<"\t\t\t错误请重新输入:"<< endl;
完整源码
需要完整源码的小伙伴请前往海轰的微信公众号:海轰Pro
回复:海轰
O(∩_∩)O哈哈~
来源:CSDN
作者:海轰
链接:https://blog.csdn.net/weixin_44225182/article/details/103655981