【C语言】简单实现三子棋

今天我们来完成一个三子棋的小游戏。

游戏要实现:

在3*3的棋盘上进行人机对弈,玩家输入棋盘坐标下棋,电脑通过产生随机数下棋。最终,谁先完成三子相连,就是赢家。

若在棋盘下满还未决出胜负,那就是平局。


为了完成这个游戏,我们要建立三个文件,分别为chessboard.h     chessboard.c    test.c

它们分别完成的任务是相关函数的声明,相关函数的实现,以及主函数。



我们先看chessboard.h完成的部分。

#define _CRT_SECURE_NO_WARNINGS 1


#define rows 3		//定义行数
#define cols 3		//定义列数

void  init_board(char board[rows][cols],int x,int y);		//初始化棋盘
void display_board(char board[rows][cols],int x,int y);		//显示棋盘
void player_move(char board[rows][cols],int x,int y);		//玩家下棋
void computer_move(char board[rows][cols]);			//电脑下棋
char check_win(char board[rows][cols],int x,int y);		//判断输赢






再来看chessboard.c的部分。

#include "chessboard.h"
#include<stdio.h>
#include<stdlib.h>

void  init_board(char board[rows][cols],int x,int y)	//初始化棋盘
{
	int i=0;
	int j=0;
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)
		{
			board[i][j] = ' ';
		}
	}


}

void display_board(char board[rows][cols],int x,int y)		//显示棋盘
{
	int i;
	for(i=0;i<x;i++)
	{
		printf("%c | %c | %c\n",board[i][0],board[i][1],board[i][2]);
		if(i<(x-1))
		{
			printf("---------\n");
		}
	}

}


void player_move(char board[rows][cols],int x,int y)		//玩家下棋,玩家下‘x’
{
	 int a = 0;  
     int b = 0;  
    while (1)  
    {  
        printf("玩家输入坐标:");  
        scanf("%d %d", &a, &b);				  
        if ((a > 0 && a <= x) && (b > 0 && b <= y))      //判断坐标是否合法,玩家输入的是坐标,而不是数组下标
        {  
            if (board[a - 1][b - 1] == ' ')				 //判断此处有没有被下棋
            {  
                board[a - 1][b - 1] = 'x';  
                break;  
            }  
            else  
            {  
              printf("此处已有棋子,不能下在此处.\n");  
            }  
        }  
        else  
        {  
            printf("坐标输入不合法\n");  
        }  
    }  

}

void computer_move(char board[rows][cols])		//电脑下棋,电脑下‘0’
{
	while (1)  
    {   
		int  x = 0;  
		int  y = 0; 
		x = rand() % 3;			//让下标合法,取余后,能下的行数只能为0,1,2
        	y = rand() % 3;			//取余后,能下的列数只能为0,1,2
		
		if (board[x][y] == ' ')  
        {  
            board[x][y] = '0'; 
            break;  
		} 
    }  
}


int board_full(char board[rows][cols],int x,int y)		//检查棋盘是否有空位
{	int i=0,j=0;
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)
		{
			if(board[i][j]==' ')
				return 0;
		}
	}
return 1;
}

char check_win(char board[rows][cols],int x,int y)		//判断输赢
{	
	int i=0,j=0;						//判断玩家的输赢,玩家下的是x, 赢得话就让它返回x
	int ret = board_full(board,rows,cols );

	for(i=0;i<x;i++)
	{	
		if ((board[i][0]==board[i][1]) && (board[i][1]==board[i][2]) && (board[i][0]=='x'))	//判断一行的三个是否相等
		{
		return 'x';
		}
	}
		

	for(j=0;j<y;j++)
	{
		if(( board[0][j]==board[1][j]) && (board[1][j]==board[2][j]) &&(board[0][j]=='x'))	//判断一列的三个是否相等
		{
		return 'x';
		}

	}

	if((board[0][0]==board[1][1]) &&(board[1][1]==board[2][2]) &&(board[0][0]=='x'))	//判断一条对角线的三个是否相等
	{	
	
		return 'x';
	}		
	
		
	
	if((board[0][2]==board[1][1]) && (board[1][1]==board[2][0]) &&(board[0][2]=='x'))	//判断另一条对角线的三个是否相等
	{

		return 'x';
	}
	


	
	for(i=0;i<x;i++)		//判断电脑的输赢,电脑下的是0, 赢得话就让它返回0,
	{	
		if (( board[i][0]==board[i][1]) && (board[i][1]==board[i][2]) && (board[i][0]=='0'))		
		{
	
		return '0';
		}

	}
	for(j=0;j<y;j++)
	{
		if(( board[0][j]==board[1][j]) && (board[1][j]==board[2][j]) &&(board[0][j]=='0'))	
		{
		return '0';
		}
	}

	if(( board[0][0]==board[1][1]) &&( board[1][1]==board[2][2]) &&(board[0][0]=='0'))		
	{
		return '0';
	}		
	
		
	
	if(( board[0][2]==board[1][1]) && (board[1][1]==board[2][0]) &&(board[0][2]=='0'))		
	{
		return '0';
	}

		if(ret==1)		//判断棋盘是否已下满
	{
		return 'm';
	}
	

return  ' ';

}




最后我们来看test.c完成的部分。

#include "chessboard.h"
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>

void menu()
{
	printf("********************************\n");
	printf("**********1->>开始游戏**********\n");
	printf("**********0->>游戏结束**********\n");
	printf("********************************\n");

}
void game()
{	int i=0,j=0;
	char rt = 0;
	char board[rows][cols]={ 0 } ;		//rows 和 cols的值宏定义给出了
	srand((unsigned)time(NULL));		//产生随机值的种子
	init_board(board,rows,cols);
	display_board( board,rows,cols);
	do
	{	
		player_move(board,rows,cols);
		display_board( board,rows,cols);
		if((rt = check_win(board,rows,cols))!=' ')
		{
			break;
		}
		printf("电脑正在下棋......\n");
		Sleep(1000);
		computer_move(board);
		display_board( board,rows,cols);
		rt = check_win(board,rows,cols);
	
	}while(rt==' ');

	if(rt=='0')
	{	printf("电脑赢了!\n");	}
	if(rt=='x')
	{	printf("玩家赢了!\n");	}
	if(rt=='m')
	{	printf("这一场是平局!\n");	}
			
}

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请输入:");
		scanf("%d",&input);
		switch(input)
		{
		case 1:		
			game();		
			break;
		case 0:		
			printf("游戏结束!\n");		
			break;
		default:
			printf("输入有误!!\n");
			break;
		}

	}while(input);

return 0;


}

以上就是三子棋的游戏全部程序。

其中有部分写的不是特别简介,还可以进一步优化。

如果您有什么更好的建议,可以给我留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值