C++课程设计--五子棋

让人想犯罪 __ 提交于 2019-12-23 00:34:21

课设题目

五子棋对弈游戏程序

功能需求

        实现五子棋对弈游戏程序,要求能实现按照规则的开局、走棋、吃子以及胜负判定功能,包括相应的图形界面以及声音效果。
        如果有简单的人机对战功能可作为加分项

程序运行界面

在这里插入图片描述
在这里插入图片描述

程序源码

#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哈哈~

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!