c语言井字棋人人,人机版and超详细代码

2023-01-10 16:36:59

注意 注意 注意 “文章末尾有完整代码”
刚学完c语言,就想试试写个简单的井字棋,看了好多博主的,能看到的写的都不咋样,要vip的咱也看不到。综合许多博主的。也写出了一个不咋样的代码。不过代码很详细的很适合c新手观看。

头文件,定义全局变量

#include <stdlib.h>
#include <windows.h>
#include <time.h>
int QP[3][3];//为2是显示空,0为圆,1为三角形
int user=0;//0的时候圆出,1的时候三角形出
int win_or_lose=2;//2未分出胜负,1时候三角形胜出,0的时候圆胜出,3时候游戏失败

程序中所有函数

void menu();//主菜单
void renren();//人人模式
void renji();//人机模式
void gotoxy(int x,int y);//控制输出位置
void draw();//画出井字棋表格
void usertype();//判断玩家状态
void renjiusertype();
void dngo();//下棋
void renjidngo();
void update();//更新数据,填充棋子
void winlose();//判断输赢

运行过程

主页面
这里插入图片描述
人人模式
在这里插入图片描述人机模式
在这里插入图片描述
这个函数看起来挺不眼熟的,可以上百度看一下详细解释
他可以实现程序运行窗口坐标化,想在那里输出就直接gotoxy(x,y),窗口的光标就直接跳转到(x,y)

void gotoxy(int x,int y)
{
	COORD pos={x,y};//存储x,y坐标
	HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE);//获取标准设备句柄
	SetConsoleCursorPosition(hout,pos);//将获取到的句柄host,移动到pos

}

画出棋盘为什么我画的棋盘比别人好看(狗头),这些符号都是在word里面复制的

void draw()
{
	gotoxy(46,2);
	printf("井字棋C语言版");
	gotoxy(42,5); printf("┏━━━━━━━━━━━━━━━━━━━━━━━┓");
	gotoxy(42,6); printf("┃       ┃       ┃       ┃");
	gotoxy(42,7); printf("┃       ┃       ┃       ┃");
	gotoxy(42,8); printf("┃       ┃       ┃       ┃");
	gotoxy(42,9); printf("┣━━━━━━━╋━━━━━━━╋━━━━━━━┫");
	gotoxy(42,10);printf("┃       ┃       ┃       ┃");
	gotoxy(42,11);printf("┃       ┃       ┃       ┃");
	gotoxy(42,12);printf("┃       ┃       ┃       ┃");
	gotoxy(42,13);printf("┣━━━━━━━╋━━━━━━━╋━━━━━━━┫");
	gotoxy(42,14);printf("┃       ┃       ┃       ┃");
	gotoxy(42,15);printf("┃       ┃       ┃       ┃");
	gotoxy(42,16);printf("┃       ┃       ┃       ┃");
    gotoxy(42,17);printf("┗━━━━━━━━━━━━━━━━━━━━━━━┛");
}

下棋子了,要注意没输入一次,就要清空原来的数据,还有就是下棋子坐标要认真找,用笔算算可能更快

void dngo()
{  
	
	    int x,y;
	/*清空坐标*/
        Loop:
		gotoxy(72,14);
		printf("请输入x坐标:   ");
		gotoxy(72,15);
		printf("请输入y坐标:   ");
	/*输入坐标*/
		
		gotoxy(72,14);
		printf("请输入x坐标:");
		scanf("%d",&x);
		gotoxy(72,15);
		printf("请输入y坐标  ");
		scanf("%d",&y);
	/*实现用户交换*/
		if(QP[x-1][y-1]==2)//判断棋盘是否为空
		{
			if(user==0)//圆棋下
			{
				QP[x-1][y-1]=0;
			}
			else//三角形棋下
			{
				QP[x-1][y-1]=1;

			}
		}
		else
		{
			goto Loop;
		}
		
		update();

}
void update()
{
	int a,b;
	for(a=0;a<3;a++)
	{
		for(b=0;b<3;b++)
		{
			if(QP[a][b]==0)
			{
				gotoxy(46+b*8,7+a*4);//跳转棋盘位置
				printf("●");
			}
			if(QP[a][b]==1)
			{
				gotoxy(46+b*8,7+a*4);//跳转棋盘位置
				printf("▲");
			}
			
		}
	}
}

实现人人对战,主要就是看win_or_lose=多少, 然后得到输赢就返回主菜单
人机的时候用srand(随机种子)rand(随机函数),简称人工智障

void renren()
{
	int a,b;
	
	for(a=0;a<3;a++)
	{
		for(b=0;b<3;b++)
		{
			QP[a][b]=2;
		}
	}
	draw();
	do
	{
		
		usertype();
		dngo();
		/*实现交换*/
		if(user==0)
		{
			user=1;
		}
		else
		{
			user=0;
		}
	    win_or_lose=2;
		winlose();


	}while(win_or_lose==2);
	if(win_or_lose==0)
	{
		gotoxy(72,22);
		printf("game over");
		gotoxy(72,23);
		printf("圆棋胜利");
		gotoxy(72,24);
		system("pause");
		system("cls");
		menu();
	   

	}
	if(win_or_lose==1)
	{
		gotoxy(72,22);
		printf("game over");
		gotoxy(72,23);
		printf("三角形棋胜利");
		gotoxy(72,24);
		system("pause");
		system("cls");
		menu();
	}
	if(win_or_lose==3)
	{
		gotoxy(72,22);
		printf("game over");
		gotoxy(72,23);
		printf("未分出胜负");
		gotoxy(72,24);
		system("pause");
		system("cls");
		menu();

	}
}

判断胜负函数,这个很直白也特别的多,貌似还有一个小小的bug,注意棋盘下满就和局了

void winlose()
{

	if(QP[0][0]==0 && QP[0][1]==0 && QP[0][2]==0)
	{
		win_or_lose=0;
	}
	else if(QP[0][0]==1 && QP[0][1]==1 && QP[0][2]==1)
	{
		win_or_lose=0;
	}//第一行结束
	if(QP[1][0]==0 && QP[1][1]==0 && QP[1][2]==0)
	{
		win_or_lose=0;
	}
	else if(QP[1][0]==1 && QP[1][1]==1 && QP[1][2]==1)
	{
		win_or_lose=1;
	}//第二行结束
	if(QP[2][0]==0 && QP[2][1]==0 && QP[2][2]==0)
	{
		win_or_lose=0;
	}
	else if(QP[2][0]==1 && QP[2][1]==1 && QP[2][2]==1)
	{
		win_or_lose=1;
	}//第三行结束
	if(QP[0][0]==0 && QP[1][0]==0 && QP[2][0]==0)
	{
		win_or_lose=0;
	}
	else if(QP[0][0]==1 && QP[1][0]==1 && QP[2][0]==1)
	{
		win_or_lose=1;
	}//第一列结束
	if(QP[0][1]==0 && QP[1][1]==0 && QP[2][1]==0)
	{
		win_or_lose=0;
	}
	else if(QP[0][1]==1 && QP[1][1]==1 && QP[2][1]==1)
	{
		win_or_lose=1;
	}//第二列结束
	if(QP[0][2]==0 && QP[1][2]==0 && QP[2][2]==0)
	{
		win_or_lose=0;
	}
	else if(QP[0][2]==1 && QP[1][2]==1 && QP[2][2]==1)
	{
		win_or_lose=1;
	}//第三列结束
	if(QP[0][0]==0 && QP[1][1]==0 && QP[2][2]==0)
	{
		win_or_lose=0;
	}
	else if(QP[0][0]==1 && QP[1][1]==1 && QP[2][2]==1)
	{
		win_or_lose=1;
	}//主对角结束
	if(QP[0][2]==0 && QP[1][1]==0 && QP[2][0]==0)
	{
		win_or_lose=0;
	}
	else if(QP[0][2]==1 && QP[1][1]==1 && QP[2][0]==1)
	{
		win_or_lose=1;
	}//负对角结束[1]
	if(QP[0][0]!=2 && QP[0][1]!=2 && QP[0][2]!=2 && QP[1][2]!=2 && QP[1][2]!=2 && QP[1][0]!=2 && QP[2][0]!=2 && QP[2][1]!=2 && QP[2][2]!=2)
	{
		win_or_lose=3;
	}
}

然后然后就是全部的代码了
是不是又想复制粘贴了


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
int QP[3][3];//为2是显示空,0为圆,1为三角形
int user=0;//0的时候圆出,1的时候三角形出
int win_or_lose=2;//2未分出胜负,1时候三角形胜出,0的时候圆胜出,3时候游戏失败
void menu();//主菜单
void renren();//人人模式
void renji();//人机模式
void gotoxy(int x,int y);//控制输出位置
void draw();//画出井字棋表格
void usertype();//判断玩家状态
void renjiusertype();
void dngo();//下棋
void renjidngo();
void update();//更新数据,填充棋子
void winlose();//判断输赢
int main(void)
{
    
	menu();

}


void renren()
{
	int a,





							
  • 作者:鲁班六号666
  • 原文链接:https://blog.csdn.net/qq_47508717/article/details/115032052
    更新时间:2023-01-10 16:36:59