简易五子棋程序(C语言实现)

前言

这好像是大一时候参加的一个短期课程的最后部分。
理解程序,不建议充当ctrlCV素材。

思路

步骤:

一、画棋盘
  1.数组初始化
  2.pos设置光标,实现换行

二、画棋子,实现循环下棋

三、判断五子连珠

四、游戏结束

源代码

#include
#include
#include
#include

//全局变量:)
char board[20][20];//棋盘
int x,y;//代表的是棋盘(数组)下标为x的行 和 下标为y列的一个交点

//函数的声明:)

void initBoard();//棋盘的初始化
void Pos(int x,int y);//设置光标的位置
void printBoard();//打印棋盘
void startGame();//开始游戏
int checkWin(int x,int y);//判断是不是有人胜出

int showWhoWin()//看看到底是谁赢了

void whitePlayer();//白方玩家
void blackPlayer();//黑方玩家

void printNumber();//打印数字模板

//函数的使用:)

//打印数字模板
void printNumber()
{
    int i;
    Pos(2,0);
    for(i=0;i<20;i++)
    {
        printf("%2d",i);
    }
    for(i=0;i<20;i++)
    {
        Pos(0,1+i);
        printf("%2d",i);
    }
}

//棋盘的初始化
void initBoard()
{
    int i,j;
    for(i=0;i<20;i++)
    {
        for(j=0;j<20;j++)
        {
            board[i][j]='*';
        }
    }
}

//设置光标的位置,从哪里开始输出
void Pos(int x,int y)
{
    COORD pos;
    pos.X=x;
    pos.Y=y;
    
    HANDLE hOutput;//句柄
    //返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄
    hOutput=GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOutput, pos);
}

//打印棋盘
void printBoard()
{
    int j,i;
    printNumber();//打印数字
    for(i=0;i<20;i++)
    {
        Pos(2,1+i);//自动换行的输出功能,代替printf("\n");
        for(j=0;j<20;j++)
        {
            printf("%c",board[i][j]);
        }
    }
}

//判断是不是有人胜出
int checkWin(int x,int y)
{
    char temp;//保存下棋方的颜色,w b
    int count=1;//统计个数,针对的同一个线(水平线),下棋的时候一下就有了。
    int i=1;//走一格
    int j=1;//和i同时用来代表走斜的
    int whoWin=0;//1代表白方,2代表黑方
    temp=board[x][y];
    //解决水平方向
    //水平 左边
    while(temp==board[x][y-i] && x>=0 && x<=20 && y>=0 && y<=20 && count<5)
    {
        i++;
        count++;
        if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
        {
            if(temp=='白')
            {
                whoWin=1;
            }
            else
            {
                whoWin=2;
            }
        }
    }
    //水平 右边
    i=1;//从右边开始重新计算
    while(temp==board[x][y+i] && x>=0 && x<20 && y>=0 && y<20 && count<5)
    {
        i++;
        count++;
        if(count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
        {
            if(temp=='白')
                whoWin=1;
            else
                whoWin=2;
        }
    }
    //解决垂直方向
    i=1;
    count=1;//清理之前的数据
    //垂直 上方
    while(temp==board[x-i][y] && x>=0 && x<20 && y>=0 && y<20 && count<5)
    {
        i++;
		count++;
		if (count==5)
		{
			if (temp=='白')
			{
				whoWin=1;
			}
			else
			{
				whoWin=2;
			}
		}
    }
    //垂直 下方
    i=1;
    while(temp==board[x+i][y] && x>=0 && x<20 && y>=0 && y<20 && count<5)
    {
        i++;
		count++;
		if (count==5)
		{
			if (temp=='白')
			{
				whoWin=1;
			}
			else
			{
				whoWin=2;
			}
		}
    }
    //解决左上的斜线 上方
    i=1;
    j=1;
    count=1;
    while(temp==board[x-i][y-j] && x>=0 && x<20 && y>=0 && y<20 && count<5)
    {
        i++;
		j++;
		count++;
		if (count==5)
		{
			if (temp=='白')
			{
				whoWin=1;
			}
			else
			{
				whoWin=2;
			}
		}
    }
    //解决左上的斜线 下方
    i=1;
    j=1;
    while(temp==board[x+i][y+j] && x>=0 && x<20 && y>=0 && y<=20 && count<5)
    {
        i++;
		j++;
		count++;
		if (count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
		{
			if (temp =='白')
				whoWin=1;

			else
				whoWin=2;
		}
    }
    //解决右上的斜线 上方
    i=1;
    j=1;
    count=1;
    while(temp==board[x-i][y+j] && x>=0 && x<20 && y>=0 && y<20 && count<5)
    {
        i++;
		j++;
		count++;
		if (count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
		{
			if (temp =='白')
				whoWin=1;

			else
				whoWin=2;
		}
    }
    //解决右上的斜线 下方
    i=1;
    j=1;
    while(temp==board[x+i][y-j] && x>=0 && x<20 && y>=0 && y<20 && count<5)
	{
		i++;
		j++;
		count++;
		if (count==5)//首先count是5才能来判断谁赢了,不然连资格都没有
		{
			if (temp=='白')
				whoWin=1;
			else
				whoWin=2;
		}
	}
    return whoWin;
}

//白方玩家
void whitePlayer()
{
    printf("\n请落白色棋子,按下行与列的坐标,以空格或者逗号隔开:");
    scanf_s("%d%d",&x,&y);
    while(1)//解决一直下错子的问题
    {
        if(board[x][y]=='*' && x>=0 && x<20 && y>=0 && y<20)//下子的地方没有其他子
        {
            board[x][y]='白';
            break;//解决while(1)
        }
        else
        {
            printf("您下子错误\n");
			printf("请白方落子,按下行与列的坐标:");
			scanf_s("%d%d",&x,&y);//坐标的值
        }
    }
    printBoard();
}

//黑方玩家
void blackPlayer()
{
    printBoard();
    printf("\n请落黑色棋子,按下行与列的坐标,以空格或者逗号隔开:");
    scanf_s("%d%d",&x,&y);
    while(1)//解决一直下错子的问题
    {
        if(board[x][y]=='*' && x>=0 && x<20 && y>=0 && y<20)//下子的地方没有其他子
        {
            board[x][y]='黑';
            break;//解决while(1)
        }
        else
        {
            printf("您下子错误\n");
			printf("请黑方落子,按下行与列的坐标:");
        }
        scanf_s("%d%d",&x,&y);//坐标的值
    }
    printBoard();
}

//看看到底是谁赢了
int showWhoWin()
{
    int overLeap=0;//1代表结束
    int leap;//用来接收谁赢了。
    leap=checkWin(x,y);
    if(leap==1)
    {
        overLeap = 1;
		system("cls");
		printBoard();
		printf("\n白方胜利\n");
		system("pause");
    }
    if(leap==2)
    {
        overLeap = 1;
		system("cls");
		printBoard();
		printf("\n黑方胜利\n");
		system("pause");
    }
    return overLeap;
}

//开始游戏
void startGame()
{
    initBoard();
    printBoard();
    while(1)//加入循环,重复下棋。直到有人胜出--暂时先不管
    {
        whitePlayer();
        if(showWhoWin()==1)
            break;
        system("cls");//清理屏幕,使屏幕上的字不重复
        blackPlayer();
        if(showWhoWin()==1)
            break;
        system("cls");
        printBoard();
    }
    system("cls");
	Pos(30, 9); printf("游戏结束,欢迎再来!");
	Pos(30, 16); printf("继续努力!");
	Pos(30, 23); printf("前走三,后走四。");
}

//主函数,程序的入口
int main()
{
    startGame();
    return 0;
}

end

你可能感兴趣的:(C)