C语言实现三子棋游戏。

第一次写这么长的C语言代码,超级喜欢这样的游戏代码,难的不是写出来,难的是让写的电脑打败自己,这也算是智能代码吧。
在创建棋盘和判断输赢上做到了动态, 虽然对对手电脑的智商做了优化,但是优化的代码写的很粗糙,希望自己以后可以写出来更好的代码。

代码如下:

game.h  (头文件代码)

#include <stdio.h>
#define ROW 3
#define COL 3
#define COUNT 3

void init(char arr,int row ,int col);  //初始化数组(棋盘)

void print(char arr,int row,int col);  //打印棋盘

void playergame(char arr,int row,int col,int x,int y);  //玩家选坐标

void computergame(char arr,int row,int col); //电脑选坐标

int IsWin(char arr,int row,int col);  //判断输赢

int Tie(char arr,int row,int col);   //平局

test.c  (主函数代码)

#include "game.h"


int main()
{
	
	char arr[ROW][COL] = {0};
		while(1)
	{
		int num = 0;
		init(arr,ROW,COL);   //初始化数组(棋盘)
		printf("*******************\n");
		printf("****   1.paly  ****\n");
		printf("****   0.exit  ****\n");
		printf("*******************\n");
		printf("请输入选项:\n");
		scanf("%d",&num);
		switch(num)
		{
		case 1:
			while(1)
			{
				int r = 0,c = 0;
				print(arr,ROW,COL);
				printf("请玩家输入坐标:\n");
				scanf("%d %d",&r,&c);
				playergame(arr,ROW,COL,r,c);    //玩家选坐标
				if(IsWin(arr,ROW,COL) == 1)   //判断输赢
				{
					print(arr,ROW,COL); //打印棋盘
					printf("玩家赢!\n");
					break;
				}
				if(Tie(arr,ROW,COL) == 0)   //平局 
				{
					print(arr,ROW,COL); //打印棋盘
					printf("平局!\n");
					break;
				}
				if(arr[r-1][c-1] != 'X')
				{
					continue;
				}
				print(arr,ROW,COL); //打印棋盘
				printf("电脑走:\n");
				computergame(arr,ROW,COL,r,c);  //电脑选坐标
				if(IsWin(arr,ROW,COL) == 0)   //判断输赢
				{
					print(arr,ROW,COL); //打印棋盘
					printf("电脑赢!\n");
					break;
				}
				if(Tie(arr,ROW,COL) == 0)  //平局 
				{
					print(arr,ROW,COL); //打印棋盘
					printf("平局!\n");
					break;
				}
			}
			break;
		case 0:
			return 0;
		default:printf("输入错误,请重新输入:\n");
		}
	}
	return 0;
}

game.h  (外函数代码)

#include "game.h"
#include <time.h>
#include <stdlib.h>



void init(char arr[ROW][COL],int row ,int col)   //初始化数组(棋盘)
{
	int i = 0, j = 0;
	for(i=0 ;i<row ;i++)
	{
		for(j=0 ;j<col ;j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void print(char arr[ROW][COL],int row,int col)  //打印棋盘
{
	int i = 0, j = 0;
	for(i=0 ;i<row ;i++)
	{
		for(j=0 ;j<col ;j++)
		{
			printf(" %c ",arr[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 playergame(char arr[ROW][COL],int row,int col,int x,int y)  //玩家选坐标
{
	if(x>row || x<1)
	{
		printf("输入的坐标有误,请重新输入;\n");
		return 0;
	}
	if(y>col || y<1)
	{
		printf("输入的坐标有误,请重新输入;\n");
		return 0;
	}
	if(arr[x-1][y-1] != ' ')
	{
		printf("输入的坐标已被填充,请重新输入;\n");
		return 0;
	}
	arr[x-1][y-1] = 'X';
}

void computergame(char arr[ROW][COL],int row,int col)    //电脑选坐标
{
	int ret1 = 0, ret2 = 0;
	int i = 0, j = 0;
	//抢中间
	if(arr[1][1] == ' ')
	{
		arr[1][1] = '0';
		return 0;
	}
	//赢玩家
	for(i=0 ;i<row ;i++)
	{   //赢横行
		if(arr[i][0] == arr[i][1] && arr[i][1] == '0')
		{
			if(arr[i][2] == ' ')
			{
				arr[i][2] = '0';
				return 0;
			}
		}
		if(arr[i][2] == arr[i][1] && arr[i][1] == '0')
		{
			if(arr[i][0] == ' ')
			{
				arr[i][0] = '0';
				return 0;
			}
		}
		if(arr[i][0] == arr[i][2] && arr[i][0] == '0')
		{
			if(arr[i][1] == ' ')
			{
				arr[i][1] = '0';
				return 0;
			}
		}
	}
	for(j=0 ;j<col ;j++)
	{   //赢竖行
		if(arr[0][j] == arr[1][j] && arr[1][j] == '0')
		{
			if(arr[2][j] == ' ')
			{
				arr[2][j] = '0';
				return 0;
			}
		}
		if(arr[1][j] == arr[2][j] && arr[1][j] == '0')
		{
			if(arr[0][j] == ' ')
			{
				arr[0][j] = '0';
				return 0;
			}
		}
		if(arr[0][j] == arr[2][j] && arr[0][j] == '0')
		{
			if(arr[1][j] == ' ')
			{
				arr[1][j] = '0';
				return 0;
			}
		}
	}
	if((arr[0][0] == arr[2][2] && arr[0][0] == '0')||(arr[0][2] == arr[2][0] && arr[0][2] == '0'))
	{ //赢斜行
		if(arr[1][1] == ' ')
		{
			arr[1][1] = '0';
			return 0;
		}
	}
	if(arr[0][0] == arr[1][1] && arr[1][1] == '0')
	{
		if(arr[2][2] == ' ')
		{
			arr[2][2] = '0';
			return 0;
		}
	}
	if(arr[0][2] == arr[1][1] && arr[1][1] == '0')
	{
		if(arr[2][0] == ' ')
		{
			arr[2][0] = '0';
			return 0;
		}
	}
	if(arr[2][2] == arr[1][1] && arr[1][1] == '0')
	{
		if(arr[1][1] == ' ')
		{
			arr[1][1] = '0';
			return 0;
		}
	}
	if(arr[2][0] == arr[1][1] && arr[1][1] == '0')
	{
		if(arr[0][2] == ' ')
		{
			arr[0][2] = '0';
			return 0;
		}
	}
	//堵玩家
	for(i=0 ;i<row ;i++)
	{   //堵横行
		if(arr[i][0] == arr[i][1] && arr[i][1] == 'X')
		{
			if(arr[i][2] == ' ')
			{
				arr[i][2] = '0';
				return 0;
			}
		}
		if(arr[i][2] == arr[i][1] && arr[i][1] == 'X')
		{
			if(arr[i][0] == ' ')
			{
				arr[i][0] = '0';
				return 0;
			}
		}
		if(arr[i][0] == arr[i][2] && arr[i][0] == 'X')
		{
			if(arr[i][1] == ' ')
			{
				arr[i][1] = '0';
				return 0;
			}
		}
	}
	for(j=0 ;j<col ;j++)
	{   //堵竖行
		if(arr[0][j] == arr[1][j] && arr[1][j] == 'X')
		{
			if(arr[2][j] == ' ')
			{
				arr[2][j] = '0';
				return 0;
			}
		}
		if(arr[1][j] == arr[2][j] && arr[1][j] == 'X')
		{
			if(arr[0][j] == ' ')
			{
				arr[0][j] = '0';
				return 0;
			}
		}
		if(arr[0][j] == arr[2][j] && arr[0][j] == 'X')
		{
			if(arr[1][j] == ' ')
			{
				arr[1][j] = '0';
				return 0;
			}
		}
	}
	if((arr[0][0] == arr[2][2] && arr[0][0] == 'X')||(arr[0][2] == arr[2][0] && arr[0][2] == 'X'))
	{ //堵斜行
		if(arr[1][1] == ' ')
		{
			arr[1][1] = '0';
			return 0;
		}
	}
	if(arr[0][0] == arr[1][1] && arr[1][1] == 'X')
	{
		if(arr[2][2] == ' ')
		{
			arr[2][2] = '0';
			return 0;
		}
	}
	if(arr[0][2] == arr[1][1] && arr[1][1] == 'X')
	{
		if(arr[2][0] == ' ')
		{
			arr[2][0] = '0';
			return 0;
		}
	}
	if(arr[2][2] == arr[1][1] && arr[1][1] == 'X')
	{
		if(arr[1][1] == ' ')
		{
			arr[1][1] = '0';
			return 0;
		}
	}
	if(arr[2][0] == arr[1][1] && arr[1][1] == 'X')
	{
		if(arr[0][2] == ' ')
		{
			arr[0][2] = '0';
			return 0;
		}
	}
	while(1)
	{
		ret1 = rand()%col;
		ret2 = rand()%row;
		if(arr[ret1][ret2] == ' ')
		{
			arr[ret1][ret2] = '0';
			return 0;
		}
	}
}

int IsWin(char arr[ROW][COL],int row,int col)   //判断输赢
{
	int tmp = 0,con = 0;
	int i = 0, j = 0;
	//横行
	for(i=0 ;i<row ;i++)
	{
		for(j=0 ;j<col ;j++)
		{
			tmp = 0;
			for(con=0 ;con<COUNT ;con++)
			{
				if(j+con<COL)
				{
					tmp = tmp +arr[i][j+con];
				}
			}
			if(tmp/COUNT == 'X')
			{
				return 1;
			}
			if(tmp/COUNT == '0')
			{
				return 0;
			}
		}
	}
	//竖行
	for(i=0 ;i<row ;i++)
	{
		for(j=0 ;j<col ;j++)
		{
			tmp = 0;
			for(con=0 ;con<COUNT ;con++)
			{
				if(i+con<ROW)
				{
					tmp = tmp +arr[i+con][j];
				}
			}
			if(tmp/COUNT == 'X')
			{
				return 1;
			}
			if(tmp/COUNT == '0')
			{
				return 0;
			}
		}
	}
	//斜行
	for(i=0 ;i<row ;i++)
	{
		for(j=0 ;j<col ;j++)
		{
			tmp = 0;
			for(con=0 ;con<COUNT ;con++)
			{
				if(i+con<ROW && j+con<COL)
				{
					tmp = tmp +arr[i+con][j+con];
				}
			}
			if(tmp/COUNT == 'X')
			{
				return 1;
			}
			if(tmp/COUNT == '0')
			{
				return 0;
			}
		}
	}
	for(i=0 ;i<row ;i++)
	{
		for(j=0 ;j<col ;j++)
		{
			tmp = 0;
			for(con=0 ;con<COUNT ;con++)
			{
				if(i+con<ROW && j-con>=0)
				{
					tmp = tmp +arr[i+con][j-con];
				}
			}
			if(tmp/COUNT == 'X')
			{
				return 1;
			}
			if(tmp/COUNT == '0')
			{
				return 0;
			}
		}
	}
	for(i=0 ;i<row ;i++)
	{
		for(j=0 ;j<col ;j++)
		{
			tmp = 0;
			for(con=0 ;con<COUNT ;con++)
			{
				if(i-con>0 && j+con<=COL)
				{
					tmp = tmp +arr[i-con][j+con];
				}
			}
			if(tmp/COUNT == 'X')
			{
				return 1;
			}
			if(tmp/COUNT == '0')
			{
				return 0;
			}
		}
	}
}

int Tie(char arr[ROW][COL],int row,int col)    //平局
{
	int i = 0, j = 0;
	for(i=0 ;i<row ;i++)
		{
			for(j=0 ;j<col ;j++)
			{
				if(arr[i][j] == ' ')
					return 1;
			}
		}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_39487033/article/details/79775100