纯c语言井字棋程序实现悔棋,人人和人机,极其简单,无任何超纲内容

 

 

 


刚开始学c语言,写的哪里不好希望各位可以告诉,有什么意见也是希望大家多多和我交流,如果对大家有帮助我很开心,可能有点bug但是不影响使用,附源码,纯c没有办法做到很花哨,这个很简朴,和我一样刚刚开始学c的同学可以参考参考,Dev,vc++6.0等老版编译器都可以,vc可能会出警告,但是不影响。

源码:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3

void menu();//绘制菜单

void singlegame();//单人游戏操作 

void doublegame();//双人游戏操作 

void initboard(char board[ROW][COL],int row,int col);//初始化棋盘 

void displayedboard(char board[ROW][COL],int row,int col);//绘制棋盘 

void player(char board[ROW][COL],int row,int col);//玩家操作(单人游戏) 

void player1(char board[ROW][COL],int row,int col);//玩家一 操作(双人游戏) 

void player2(char board[ROW][COL],int row,int col);//玩家二操作(双人游戏) 

void computer(char board[ROW][COL],int row,int col);//cpu操作(电脑操作) 

int win(char board[ROW][COL], int row, int col);//判断获胜条件

void restartgame();//游戏总体 

void single(); //单人游戏程序 

void dou(); //双人游戏程序 

void regret();//悔棋

void Regret();

int Row=0; //坐标记录 

int Col=0; //坐标记录

int R1 = 0; //坐标记录

int C1 = 0; //坐标记录

int R2 = 0; //坐标记录

int C2 = 0; //坐标记录

int j = 2; //条件判断 

int b = 0;

int main()
{
    printf("********欢迎游玩井字棋*********\n\n");
	printf("输入坐标以下棋,以下是坐标格式:\n"); //提示输入规则 
	printf("【1 1】【1 2】【1 3】\n\n");
    printf("【2 1】【2 2】【2 3】\n\n");
    printf("【3 1】【3 2】【3 3】\n\n"); 
	system("color 3f");
	restartgame();
	return 0;
}
void restartgame() //游戏本体函数 
{
	int i; 
	menu();               //选择菜单 
	scanf("%d",&i); 
	switch(i)              //选择单人或者双人游戏 
	{
		case 1:
			single();
			break;
		case 2:
			dou();
			break;
		case 0:
			break;
		default:
			printf("error\n");
			break;
	}
	 
}
void menu()
{
	printf("------------------------------\n\n");
	printf("--------输入1单人游戏---------\n\n--------输入2双人游戏---------\n\n--------输入0结束游戏---------\n\n");
	printf("------------------------------\n\n");
}
void single()
{
	system("cls");
	srand((unsigned int)time(NULL));
	singlegame(); 
}
void dou()  //double 
{
	system("cls");
	srand((unsigned int)time(NULL));
	doublegame();
}
void doublegame()   //多人游戏函数本体
{
	char board[ROW][COL]={' '};
	initboard(board,ROW,COL);
	displayedboard(board,ROW,COL);
	do{if(j==0)
	break;
	player1(board,ROW,COL);
	if(j==0)
	break;
	player2(board,ROW,COL);
	}while(j);
    restartgame();
}
void singlegame()  //单人游戏函数本体 
{
	char board[ROW][COL]={' '};
	initboard(board,ROW,COL);
	displayedboard(board,ROW,COL);
	do{
	player(board,ROW,COL);
	computer(board,ROW,COL);
	}while(j);
    restartgame();
}
void initboard(char board[ROW][COL],int row,int col)   //初始化棋盘 
{
	int i;
	int j;
	for(i=0;i<=row;i++)
	{
		for(j=0;j<=col;j++)
		{
			board[i][j]=' ';
		}
	}
}
void displayedboard(char board[ROW][COL],int row,int col)  //显示棋盘 
{
	int i;
	int j;
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			printf(" %c ",board[i][j]);
			if(j<col-1)
			printf("|");
		}
		printf("\n");
		if(i<row-1)
		{
			for(j=0;j<col;j++)
			{
				printf("---");
				if(j<col-1)
				printf("|");
			}
			printf("\n");
		}
	}
}
void player1(char board[ROW][COL],int row,int col)  //玩家操作 
{
	int x = 0;
	int y = 0;
	j=win(board,ROW,COL);
	printf("先手的回合\n");
	while(1)
	{
		printf("请玩家输入坐标\n");
		scanf("%d %d",&x,&y);
		if(x>=1&&x<=row&&y>=1&&y<=col)
		{
			if(board[x-1][y-1]==' ')
			{
				board[x-1][y-1]='O';
				break;
			}
			else
			{
				printf("该区域无法落棋\n");
			}
			
		}
		else
		{
			printf("错误,请按照坐标输入\n");
		}	
	}
	R1 = x-1;
	C1 = y-1;
	j=win(board,ROW,COL);
	//displayedboard(board,ROW,COL);
	switch(b)
	{	case 0:
		regret(board,x,y);
		break;
		case 1:
		printf("先手win!\n");
		break;
		case 2:
		printf("先手win!\n");
		break;
		default:
		printf("error\n");
		break;
	}
}

void player2(char board[ROW][COL],int row,int col)  //玩家操作
{
	int x = 0;
	int y = 0;
	int a = 0;
	j=win(board,ROW,COL);
	printf("后手的回合\n");
	while(1)
	{
		printf("请玩家输入坐标\n");
		scanf("%d %d",&x,&y);
		if(x>=1&&x<=row&&y>=1&&y<=col)
		{
			if(board[x-1][y-1]==' ')
			{
				board[x-1][y-1]='X';
				break;
			}
			else
			{
				printf("该区域无法落棋\n");
			}
			
		}
		else
		{
			printf("错误,请按照坐标输入\n");
		}	
	}
	R2 = x-1;
	C2 = y-1;
	//displayedboard(board,ROW,COL);
	j=win(board,ROW,COL);
	switch(b)
	{	case 0:
		regret(board,x,y);
		break;
		case 1:
		printf("先手win!\n");
		break;
		case 2:
		printf("先手win!\n");
		break;
		default:
		printf("error\n");
		break;
	}
}

void player(char board[ROW][COL],int row,int col)   //玩家操作
{
	int x = 0;
	int y = 0;
	printf("先手的回合\n");
	while(1)
	{
		printf("请玩家输入坐标\n");
		scanf("%d %d",&x,&y);
		if(x>=1&&x<=row&&y>=1&&y<=col)
		{
			if(board[x-1][y-1]==' ')
			{
				board[x-1][y-1]='O';
				break;
			}
			else
			{
				printf("该区域无法落棋\n");
			}
			
		}
		else
		{
			printf("错误,请按照坐标输入\n");
		}	
	}
	Row = x-1;
	Col = y-1;
	j=win(board,ROW,COL);
}
void computer(char board[ROW][COL],int row,int col)   //电脑操作
{
	int x=0;
	int y=0;
	int i=0;
	if(j!=0)
	{
	printf("后手的回合\n");
	while(1)
	{
		
		x = rand() % row;
		y = rand() % col;
		if(board[x][y]==' ')
		{
		board[x][y]='X';
		break;
	    }
	}
	}
	//displayedboard(board,ROW,COL);
	j=win(board,ROW,COL);
	switch(b)
	{	case 0:
		regret(board,x,y);
		break;
		case 1:
		printf("先手win!\n");
		break;
		case 2:
		printf("后手win!\n");
		break;
		default:
		printf("error\n");
		break;
	}
	//regret(board,x,y);
	
	
	displayedboard(board,ROW,COL);
	
}

int win(char board[ROW][COL], int row, int col)  //获胜判断 
{
	
	int i = 0;
	int j = 0;
	int t = 0;
	int c = 0;
	for (i = 0; i < col; i++)
	{
		//横三行
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
			{
			if(board[i][1]=='O')
			b=1;
			else
			b=2;
			return 0;
		}
	}
	for (j = 0; j < row; j++)
	{
		//竖三列
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
			{
			if(board[1][j]=='O')
			{
			c=1;
			b=1;
			}
			else
			b=2;
			return 0;
		}
	}
	//斜两列
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		{
		if(board[1][1]=='O')
	{
			c=1;
			b=1;
			}
		else
		b=2;
		return 0;
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
		{
		if(board[1][1]=='O')
		{
			c=1;
			b=1;
			
			}
		else
		b=2;
		return 0;
	}
	//判断是否棋盘满
	for(i=0;i<row;i++)
	{
		for(j=0;j<col;j++)
		{
			if(board[i][j]!=' ')
			t++;
		}
	}
	if(t==8)
	{
		printf("游戏以经平局\n");
		return 0;
	}
	if(t!=8)
	{
		printf("下一回合\n");
		return 1;
	}
}
void regret(char board[ROW][COL],int row,int col) //悔棋函数 
{
	char a;
	displayedboard(board,ROW,COL);
	printf("如果您想要悔棋请按空格,不想请按enter键继续\n");
	//scanf("%d",&a);
	a = _getch();
	if(a==' ')
	{
		board[row][col]=' ';
		board[Row][Col]=' ';
	}
}
void Regret(char board[ROW][COL])    //悔棋函数 
{
	char a  = 0;
	displayedboard(board,ROW,COL);
	printf("如果您想要悔棋请按空格,不想请按enter键继续\n");
	a = _getch();
	if(a==' ')
	{
		board[R1][C1]=' ';
		board[R2][C2]=' ';
	}
}

作者Dld

时间2023/2/20/23.45

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值