C语言的一个五子棋小游戏的实现

#include<stdio.h>
#include<windows.h>
#define ROW 14
#define COL 14

void gotoxy(int x,int y)//形参
{
	HANDLE hOut;
	COORD pos= {x,y};
	// 光标的起始位(第1列,第3行) 0是第1列 2是第3行
	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOut, pos);
	//printf("定位光标位置搜索(%d,%d)\n",pos.X,pos.Y);
}

/*
函数名:paintGameUI()
函数功能:绘制棋盘
函数参数:无
函数返回值:无
*/
void paintGameUI()  //打印游戏棋盘  使用ROW COL在上面宏定义可以改变//棋盘大小
{
	int i=0;
	int j=0;
	printf("┌ ");	 //顶部
	for(i=0;i<COL;i++)
	{
        printf("┬ ");
	}
	printf("┐\n");
	//中间
	for(j=0;j<ROW;j++)
	{
		printf("├ ");
		for(i=0;i<COL;i++)
		{
			printf("┼ ");	
		}
		printf("┤\n");
	}
	//底部
	printf("└ ");
	for(i=0;i<COL;i++)
	{
        printf("┴ ");
	}
	printf("┘\n");
}

void playgame()
{
	int arr[ROW][COL]={0}; // 初始化 0-没有棋子 1用户下棋黑 2电脑下棋白
	int x,y;      //用户输入的行 列
	int row,col;  //落子的位置
	int i,j; //  规则   判断输赢 遍历二维数组
	paintGameUI();     //	绘制棋盘
	while(1)//确保多次 确保用户电脑有效落子多次
	{
		while(1)    //      保证用户能够有效落子一次 用户下棋
		{
			gotoxy(0,16);//打印文字 0距离左边 16距离顶部
			printf("                        ");  //覆盖掉用户之前所输,//让用户可以再输
			gotoxy(0,16); //打印文字 0距离左边 16距离顶部
			
			printf("请输入下棋的位置,例如:(2 3):");
			scanf("%d %d",&x,&y);
			row = x-1;  //行 距离顶部的长度 数组是0开始的
			col =y-1;  //列 距离左边的长度 下棋的位置
			if(arr[row][col]==0)   //下棋位置是否是棋子
			{   
				gotoxy(col*2,row); 
				printf("●");//用户下棋
				//修改二维数组的值
				arr[row][col]=1; //用户下棋
				for(i=0;i<ROW;i++)    
				{	
					for(j=0;j<COL;j++)   
					{
						//横着五个都是1  列变
						if( arr[i][j]==arr[i][j+1]&&arr[i][j]==arr[i][j+2]&& 
							arr[i][j]==arr[i][j+3]&&arr[i][j]==arr[i][j+4]&&j+4<=COL&&arr [i][j]==1)
						{
							gotoxy(0,18);
							printf("用户赢了\n");
							return ;    
							
						}//竖着五个都是1 行变
						else if(arr[i][j]==arr[i+1][j]&&arr[i][j]==arr[i+2][j]&& 
							arr[i][j]==arr[i+3][j]&&arr[i][j]==arr[i+4][j]&&i+4<=ROW&&arr [i][j]==1)
						{
							gotoxy(0,18);
							printf("用户赢了\n");
							return ;   
						}	
					}
				}
				break;    //轮到对方下棋	
			}
			else if(arr[row][col]==1||arr[row][col]==2)  //用户下棋1 电脑下棋2
			{
				gotoxy(0,17);
				printf("请重新输入坐标");
			}	
		}
		while(1) //    确保电脑有效落子一次 电脑下棋
		{
			//电脑下棋  电脑随机落子
			row= rand()%14+0;  //二维数组索引0-13  
			col= rand()%14+0;  //电脑随机落子
			//行距离顶部row  列距离左边col
			if(arr[row][col]==0)   //下棋位置是否是棋子 空 电脑可以下棋
			{   
				gotoxy(col*2,row);
				printf("○");//下棋
				//修改二维数组的值
				arr[row][col]=2; //电脑下棋
				for(i=0;i<ROW;i++)     //电脑赢 最好用算法
				{
					for(j=0;j<COL;j++)
					{
						//横着五个都是1  列变
						if( arr[i][j]==arr[i][j+1]&&arr[i][j]==arr[i][j+2]&& 
							arr[i][j]==arr[i][j+3]&&arr[i][j]==arr[i][j+4]&&j+4<=COL&&arr [i][j]==2)
						{
							gotoxy(0,18);
							printf("电脑赢了\n");
							return;
							
						}//竖着五个都是1
						else if(arr[i][j]==arr[i+1][j]&&arr[i][j]==arr[i+2][j]&& 
							arr[i][j]==arr[i+3][j]&&arr[i][j]==arr[i+4][j]&&i+4<=ROW&&arr [i][j]==2)
						{
							gotoxy(0,18);
							printf("电脑赢了\n");
							return; 
						}	
					}
				}
				break;	
			}	
		}	
	}
}

int main()
{
	playgame();	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_56051805/article/details/124103203
今日推荐