C语言实现人机三子棋

用C语言实现三子棋,自己思路是先让以菜单的形式让玩家选择进入游戏或者退出。下棋时玩家以坐标的形式将棋子放在定义的二维数组里,用o表示,电脑用随机函数将棋子放入棋盘,用x表示。每次玩家和电脑放入后都判断是否已经满足规则。

1、首先设计菜单,编写主函数。

#include "game.h"
void menu()  //菜单
{
	printf("###############################\n");
	printf("############1.Play#############\n");
	printf("############2.Exit#############\n");
}
int main()
{
	int c=0;
	do{                //用循环的形式便于玩家选择进入游戏或者退出游戏
		menu();
	    scanf_s("%d", &c);
		switch (c)         //用switch语句来实现进入游戏或者退出游戏

		{
		case 1:
			game();
			break;
		case 2:
			exit(0);
		default:
			printf("Select error!!!\n");
		}
	} while (1);
		system("pause");
	return 0;
}





2.编写头文件,是函数调用方便,程序主体更加整齐

#ifndef __GAME_H_
#define __GAME_H_

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>  
#include <time.h>
#define ROW 3  //数组的行
#define COL 3  //数组的列
void game();
#pragma warning(disable:4996)  

#endif

3.编写游戏函数,程序的灵魂。

#include "game.h"
static void displayBoard(char board[][COL], int row)   //用来显示棋盘的函数
{
	int i = 0;
	for (; i < row; i++)
	{
		printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
		if (i < row - 1)
		{
			printf("---|---|---\n");
		}
	}
}
static void playerMove(char board[][COL], int row)    //玩家放棋子函数
{
	int x, y;
	do{
		printf("Please Enter (x,y)\n");
		scanf("%d%d", &x,&y);
		if (x >= 1 && x <= 3 && y >= 1 && y <= 3)  //防止棋子落入棋盘外
		{
			if (board[x-1][y-1] == ' ')       //判断数组(棋盘)是否为空
			{
				board[x - 1][y - 1] = 'o';    //以o来表示玩家的棋子
				break;
			}
else
			{
				printf("Please Try Another Place\n ");
				break;
			}
		}
		else
		{
			printf("Please Enter Right Place\n");
		}
	} while (1);
}
static void compMove(char board[][COL], int row)  //电脑移动
{
	srand((unsigned long)time(NULL));    //产生一个随机数

	do{
		int x = rand() % ROW;   //使随机数在坐标范围内
		int y = rand() % COL;   //使随机数在坐标范围内
		if (board[x][y] = ' '&&board[x][y]!='o')  //判断此位置是否已经被占
		{
			board[x][y] = 'x';   //用x表示电脑棋子
			break;
		}
	} while (1);
}
static int isfull(char board[][COL], int row)   //判断是棋盘否下满的函数
{
	int i = 0;
	
	for (; i < ROW; i++)
	{
		int j = 0;
		for (; j < COL; j++)
		{
			if (board[i][j] == ' ')  //棋盘内有空格则表示未下满
			{
				return 0;
			}
		}
	}
	return 1;
}
static char isWin(char board[][COL], int row)   //判断是否赢了的函数
{
	int i = 0;
	for (; i < ROW; i++)   //判断行是否够三个
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0]!=' ')
		{
			return board[i][1];   //返回够三个的棋子
		}
	}
	for (; i < COL; i++)   //判断列是否够三个
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
		{
			return board[1][i];
		}
	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0]!=' ')  //判断右对角线是否够三个
	{
		return board[0][0];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[2][0]!=' ')   //判断左对角线是否够三个
	{
		return board[2][0];
	}
	if (isfull(board, row))
	{
		return 't';   //如果平局,返回t
	}
	return ' ';
}
void game()
{
	char board[ROW][COL];
	memset(board, ' ', ROW*COL);   //将数组全部初始化为空格
	char ret;
	do{
		system("CLS");          //清屏操作
		displayBoard(board, COL);    //显示棋盘
		playerMove(board, COL);   //玩家移动
		system("CLS");     //继续清屏操作,使面板整洁
		displayBoard(board, COL);  //继续显示棋盘
		ret = isWin(board, COL);    //是否产生结果
		if (ret!=' ')
		{
			break;
		}
		compMove(board, COL);
		system("CLS");
		displayBoard(board, COL);
		ret = isWin(board, COL);
	} while (ret==' ');
	if (ret == 'o')    //返回值为o则表示玩家赢了
	{
		printf("nice,you win\n");
	}
	else if (ret == 'x')   //返回值为x则表示电脑赢了
	{
		printf("you lose,try again\n");
	}
	else if (ret == 't')   //返回值为t则表示棋盘下满未产生输赢,平局
	{
		printf("平局\n");
	}
}

运行程序,其中x为电脑下的棋子,o为玩家下的棋子,很惭愧输给了电脑,哈哈

 
 



猜你喜欢

转载自blog.csdn.net/shadowh8/article/details/80021517