五子棋 C语言

五子棋游戏程序(较高难度+有加分)(设计分值:20-30分)
应用C语言编写程序,可以在计算机上实现二人对弈五子棋功能。
功能要求:
(1)欢迎界面生成、游戏界面生成;
(2)光标移动和落子显示;
(3)判断胜负;
(4)综合应用结构体、数组、按键处理和图形编程等编程方法。
§10.2算法设计
在这里插入图片描述
§10.4程序分析

#include<stdio.h>
#include<windows.h>
#include<conio.h>
int qipan[21][21];
int color=0;//0表示黑棋(圆圈),1表示白棋
int iTemp = 0,jTemp = 0,countTemp = 0;
int colorFlag = 0;
void print()
{
	int i,j;
	for(i=1;i<=20;i++)
        {
            //第一行
            if(i==1)
            {
                //第一列
                if(qipan[i-1][0]==1)
                    printf("●");
                if(qipan[i-1][0]==0)
                    printf("○");
                if(qipan[i-1][0]==2)
                    printf("┌ ");

                //第2-19列
                for(j=2;j<=19;j++)
                {
                    if(qipan[i-1][j-1]==1)
                        printf("●");
                    if(qipan[i-1][j-1]==0)
                        printf("○");
                    if(qipan[i-1][j-1]==2)
                        printf("┬ ");
                }

                //第20列
                if(qipan[i-1][j-1]==1)
                    printf("●");
                if(qipan[i-1][j-1]==0)
                    printf("○");
                if(qipan[i-1][j-1]==2)
                    printf("┐ ");

                    printf("\n");
            }

            //第2-19行
            if(i<=19 && i>=2)
            {
                //第一列
                if(qipan[i-1][0]==1)
                    printf("●");
                if(qipan[i-1][0]==0)
                    printf("○");
                if(qipan[i-1][0]==2)
                    printf("├ ");

                //第2-19列
                for(j=2;j<=19;j++)
                {
                    if(qipan[i-1][j-1]==1)
                        printf("●");
                    if(qipan[i-1][j-1]==0)
                        printf("○");
                    if(qipan[i-1][j-1]==2)
                        printf("┼ ");
                }

                //第20列
                if(qipan[i-1][j-1]==1)
                    printf("●");
                if(qipan[i-1][j-1]==0)
                    printf("○");
                if(qipan[i-1][j-1]==2)
                    printf("┤ ");

                    printf("\n");
            }

            //第20行
            if(i==20)
            {
                if(qipan[i-1][0]==1)
                    printf("●");
                if(qipan[i-1][0]==0)
                    printf("○");
                if(qipan[i-1][0]==2)
                    printf("└ ");

                for(j=2;j<=19;j++)
                {
                    if(qipan[i-1][j-1]==1)
                        printf("●");
                    if(qipan[i-1][j-1]==0)
                        printf("○");
                    if(qipan[i-1][j-1]==2)
                        printf("┴ ");
                }

                if(qipan[i-1][j-1]==1)
                    printf("●");
                if(qipan[i-1][j-1]==0)
                    printf("○");
                if(qipan[i-1][j-1]==2)
                    printf("┘ ");

                    printf("\n");
            }

        }
}
void gotoxy(HANDLE hout,int x,int y)
{
	COORD pos;
	pos.X=x;
	pos.Y=y;
	SetConsoleCursorPosition(hout,pos);
}
void win()
{
	int i,j; 
	for(i=0;i<20;i++)
        {
            for(j=0;j<20;j++)
            {
                //如果检测到该有棋子,则检查与该棋子有关的是否可以赢
                if(2 != qipan[i][j] )
                {
                    colorFlag = qipan[i][j];
                    countTemp = 1;
                    iTemp = i;
                    jTemp = j;

                    //该棋子横向上是否可以赢
                    while((++jTemp<20 )&&(countTemp!=5 ))
                    {
                        if(colorFlag == qipan[i][jTemp])
                        {
                            countTemp++;
                            if(countTemp==5)
                            {
                                if(colorFlag==0)
                                {
                                    printf("黑棋赢了!\a\n");
                                }
                                else if(colorFlag==1)
                                {
                                    printf("白棋赢了!\a\n");
                                }
                                exit(0);
                            }
                        }
                        else
                        {
                            countTemp = 0;
                            break;
                        }
                    }

                    //纵向可以赢
                    iTemp = i;
                    jTemp = j;
                    countTemp = 1;
                    while((++iTemp<20 )&&(countTemp!=5))
                    {
                        if(colorFlag==qipan[iTemp][j])
                        {
                            countTemp++;
                            if( countTemp==5)
                            {
                                if(colorFlag==0)
                                {
                                    printf("黑棋赢了!\a\n");
                                }
                                else if(colorFlag==1)
                                {
                                    printf("白棋赢了!\a\n");
                                }
                                exit(0);
                            }
                        }
                        else
                        {
                            countTemp= 0;
                            break;
                        }

                    }

                    //斜向,从左上到右下方向检查
                    iTemp = i;
                    jTemp = j;
                    countTemp = 1;
                    while((++iTemp<20 )&&(++jTemp<20 )&&(countTemp!=5))
                    {
                        if(colorFlag == qipan[iTemp][jTemp])
                        {
                            countTemp++;
                            if(countTemp==5)
                            {
                                if(colorFlag==0)
                                {
                                    printf("黑棋赢了!\a\n");
                                }
                                else if(colorFlag ==1)
                                {
                                    printf("白棋赢了!\a\n");
                                }
                                exit(0);
                            }
                        }
                        else
                        {
                            countTemp = 0;
                            break;
                        }
                    }

                    //斜向,从右上到左下方向检查
                    iTemp = i;
                    jTemp = j;
                    countTemp = 1;
                    while((++iTemp>=0 )&&(--jTemp>=0)&&(countTemp!=5))
                    {
                        if(colorFlag == qipan[iTemp][jTemp])
                        {
                            countTemp++;
                            if(countTemp==5)
                            {
                                if(colorFlag==0)
                                {
                                    printf("黑棋赢了!\a\n");
                                }
                                else if(colorFlag==1)
                                {
                                    printf("白棋赢了!\a\n");
                                }
                                exit(0);
                            }
                        }
                        else
                        {
                            countTemp = 0;
                            break;
                        }
                    }

                }
			}
		}

}
void getxy(HANDLE hout,int*i,int*j)
{
	int ch;
	int m,n;
	do
	{
		ch=0;
		if (kbhit())
		{
			ch=getch();//getch() 接受任意键的输入,不用按回车就返回,返回值是输入值的ascll码
		}
		switch(ch)
		{
		case 72:  *i-=1; break;//上 
		case 80:  *i+=1; break;//下
		case 75:  *j-=1; break;//左
		case 77:  *j+=1; break;//右
		}
		if (*i<0) *i=20+*i;
		if (*i>19) *i=20-*i;
		if (*j<0) *j=20+*j;
		if (*j>19) *j=20-*j;
		m=*j;n=*i;
		gotoxy(hout,m*2,n);

	}while (ch!=13);
}
int main()
{
	HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);
    int i=0,j=0;
    int iTemp = 0,jTemp = 0,countTemp = 0;
    int colorFlag = 0;
    char op;

    for(i=0;i<21;i++)
        for(j=0;j<21;j++)
            qipan[i][j]=2;
    while(1)
    { 
		gotoxy(hout,0,0);
		print();
		
		gotoxy(hout,49,1);
			if (!color) 
		{
			
			printf("黑棋下\n");
		}
		else
		{
			printf("白棋下\n");
		}
		gotoxy(hout,41,2);
		i=0;
		j=0;
		getxy(hout,&i,&j);
		i++;
		j++;
        

        if((2 != qipan[i-1][j-1]))
        {
            gotoxy(hout,41,2);
			printf("提示:该位置已经有棋子了! \a              \n");
            fflush(stdin);
            continue;
        }
      
        qipan[i-1][j-1]=color;//将该位置棋子属性给棋盘
		color=(color+1)%2;//获取棋盘棋子属性
        //根据棋盘对应位置属性,绘制最新状态的棋盘
        gotoxy(hout,0,0);
		print();
		win();
		system("cls");

    }
	return 0;
}

§10.5效果截图

1.开始
在这里插入图片描述
2.胜利
在这里插入图片描述
3.已有子
在这里插入图片描述

  • 18
    点赞
  • 137
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
一个很好的五子棋c语言程序代码,最重要的是能运行正确!!! #include #include #include #include #include #define CROSSRU 0xbf /*右上角点*/ #define CROSSLU 0xda /*左上角点*/ #define CROSSLD 0xc0 /*左下角点*/ #define CROSSRD 0xd9 /*右下角点*/ #define CROSSL 0xc3 /*左边*/ #define CROSSR 0xb4 /*右边*/ #define CROSSU 0xc2 /*上边*/ #define CROSSD 0xc1 /*下边*/ #define CROSS 0xc5 /*十字交叉点*/ /*定义棋盘左上角点在屏幕上的位置*/ #define MAPXOFT 5 #define MAPYOFT 2 /*定义1号玩家的操作键键码*/ #define PLAY1UP 0x1157/*上移--'W'*/ #define PLAY1DOWN 0x1f53/*下移--'S'*/ #define PLAY1LEFT 0x1e41/*左移--'A'*/ #define PLAY1RIGHT 0x2044/*右移--'D'*/ #define PLAY1DO 0x3920/*落子--空格键*/ /*定义2号玩家的操作键键码*/ #define PLAY2UP 0x4800/*上移--方向键up*/ #define PLAY2DOWN 0x5000/*下移--方向键down*/ #define PLAY2LEFT 0x4b00/*左移--方向键left*/ #define PLAY2RIGHT 0x4d00/*右移--方向键right*/ #define PLAY2DO 0x1c0d/*落子--回车键Enter*/ /*若想在游戏中途退出, 可按 Esc 键*/ #define ESCAPE 0x011b /*定义棋盘上交叉点的状态, 即该点有无棋子 */ /*若有棋子, 还应能指出是哪个玩家的棋子 */ #define CHESSNULL 0 /*没有棋子*/ #define CHESS1 'O'/*一号玩家的棋子*/ #define CHESS2 'X'/*二号玩家的棋子*/ /*定义按键类别*/ #define KEYEXIT 0/*退出键*/ #define KEYFALLCHESS 1/*落子键*/ #define KEYMOVECURSOR 2/*光标移动键*/ #define KEYINVALID 3/*无效键*/ 下载可看到完整的...
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值