用C语言实现三字棋

用C语言实现三字棋,其根本就是在一个二维数组里的各种操作,在这个项目里面,我们要自己定义一个头文件:
#ifndef __GAME_H__
#define __GAME_H__

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>

#define ROW 3//设置行
#define COL 3//设置列

void InitBoard(char arr[ROW][COL], int row, int col);
void Dispiay(char arr[ROW][COL], int row, int col);
void PiayerMove(char arr[ROW][COL], int row, int col);
void ComputerMove(char arr[ROW][COL], int row, int col);
char IsWin(char arr[ROW][COL], int row, int col);

#endif

项目框架:

#include"game.h"

void menu()//声明菜单
{
	printf("***************************\n");
	printf("*****      0. exit    *****\n");
	printf("*****      1. piay    *****\n");
	printf("***************************\n");
}
void game()
{
	int ret = 0; 
	char arr[ROW][COL] = {0};//定义棋盘,即二维数组
	InitBoard(arr, ROW, COL);//初始化棋盘
	Dispiay(arr, ROW, COL);//打印棋盘
	while(1)//循环下棋过程
	{
		PiayerMove(arr, ROW, COL);//玩家走
		ret = IsWin(arr, ROW, COL);//判断输赢
		Dispiay(arr, ROW, COL);//打印移动之后的棋盘
		if(ret != 'j')
			break;
	        ComputerMove(arr, ROW, COL);//电脑走
		ret = IsWin(arr, ROW, COL);//判断输赢
		Dispiay(arr, ROW, COL);
		if(ret != 'j')
			break;
	}
	if(ret == 'x')
		printf("玩家赢\n");
	else if(ret == '0')
		printf("电脑赢\n");
	else
		printf("平局\n");
}

//1.玩家赢  'x'
//2.电脑赢  '0'
//3.平局    'p'
//4.继续游戏  'j'
int main()
{
	int input = 0;
	srand((unsigned)time(NULL));
	do
	{
		menu();
		printf("请选择:->");
		scanf("%d", &input);
		switch(input)
		{
		case 0:
			printf("退出游戏\n");
			break;
		case 1:
			game();
			break;
		default:
			printf("输入错误,请重新输入\n");
			break;
		}
	}while(input);
	return 0;
}

具体实现:

#include"game.h"

void InitBoard(char arr[ROW][COL], int row, int col)//初始化棋盘,使每个元素都为空格
{
	int i = 0;
	int j = 0;
	for(i = 0; i < row; i++)
	{
		for(j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void Dispiay(char arr[ROW][COL], int row, int col)//打印棋盘
{
	int i = 0;
	int j = 0;
	for(i = 0; i < row; i++)
	{
		int j = 0;
		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 PiayerMove(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("玩家走->\n");
	while(1)
	{
		printf("请输入坐标:");
	    scanf("%d%d", &x, &y);
	    if(x>=1 && x<=row && y>=1 && y<=col)
		{
			if(arr[x-1][y-1] == ' ')
			{
				arr[x-1][y-1] = 'X';
				break;
			}
			else
			{
				printf("坐标被占用\n");
			}
		}
		else
		{
			printf("坐标不合法,请重新输入:\n");
		}
	}
}

void ComputerMove(char arr[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑走->\n");
	while(1)
	{
		x = rand()%ROW;
	    y = rand()%COL;
	    if(arr[x][y] == ' ')
		{
			arr[x][y] = '0';
			break;
		}
	}
}

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


char IsWin(char arr[ROW][COL], int row, int col)//判断输赢
{
	int i = 0;
	for(i = 0; i < row; i++)
	{
		if(arr[i][0]==arr[i][1] && arr[i][0] == arr[i][2] && arr[i][0] != ' ')
			return arr[i][0];
	}
	for(i = 0; i < col; i++)
	{
		if(arr[0][i]==arr[1][i] && arr[0][i] == arr[2][i] && arr[0][i] != ' ')
			return arr[0][i];
	}
	if(arr[0][0]==arr[1][1] && arr[1][1]==arr[2][2] && arr[0][0] != ' ')
		return arr[1][1];
	if(arr[0][2]==arr[1][1] && arr[1][1]==arr[2][0] && arr[1][1] != ' ')
		return arr[1][1];
	if(IsFull(arr, row, col))
		return 'p';//平局
	return 'j';//继续
}



猜你喜欢

转载自blog.csdn.net/yikaozhudapao/article/details/80287480