三子棋(可修改成五子棋)

C语言写的三子棋,可用VS2013编译通过,学习C语言半年时间,第一次写一个小游戏项目,中间bug调试了一两个小时,一度想要放弃,最后发现问题,成功写出来,嘿嘿嘿。
```c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>				//玩家1 操作游戏的人 落子:‘x’
#include <stdlib.h>				//玩家2 电脑         落子:‘O’
#include <time.h>
#define MAX_ROW 3				//Magic number
#define MAX_COL 3
void Init(char chessBoard[MAX_ROW][MAX_COL]){ 
	int row, col;
	for (row = 0; row < MAX_ROW; row++){
		for (col = 0; col < MAX_COL; col++){
			chessBoard[row][col] = ' ';
		}
	}
	srand((unsigned int)time(0));
}
void Print(char chessBoard[MAX_ROW][MAX_COL]){
	printf("+---+---+---+\n");
	int row, col;
	for (row = 0; row < MAX_ROW; row++){
		for (col = 0; col < MAX_COL; col++){
			printf("| %c ",chessBoard[row][col]); //%c代表打印一个字符
		}
		printf("|");
		printf("\n+---+---+---+\n");
	}
}
void PlayerMove(char chessBoard[MAX_ROW][MAX_COL]){
	printf("玩家落子!\n");
	while (1){
		printf("请输入您要落子的位置:");
		int row = 0;
		int col = 0;
		scanf("%d %d", &row, &col);
		if (row < 0 || col < 0 
			|| row >= MAX_ROW 
			|| col >= MAX_COL)
		{
			printf("输入不合法,请输入小于3的值!\n");
			continue;
		}
		if (chessBoard[row][col] != ' '){
			printf("该位置已有子!\n");
			continue;
		}
		chessBoard[row][col] = 'X';
		break;
	}
}
void ComputerMove(char chessBoard[MAX_ROW][MAX_COL]){
	printf("电脑落子!\n");
	while (1){
		int row = rand() % MAX_ROW;			//产生随机数
		int col = rand() % MAX_COL;
		if (chessBoard[row][col] != ' ') //此处有子
			continue;
		chessBoard[row][col] = 'O';
		break;
	}
}
int Isfull(char chessBoard[MAX_ROW][MAX_COL]){
	for (int row = 0; row < MAX_ROW; row++){
		for (int col = 0; col < MAX_COL; col++){
			if (chessBoard[row][col] == ' '){
				return 0;
			}
		}
	}
	return 1;
}
char Check(char chessBoard[MAX_ROW][MAX_COL])
{		//判断游戏是否结束,若结束返回哪一方赢了
	int row, col;
	//1.检查3行
	for (row = 0; row < MAX_ROW; row++){
		if (chessBoard[row][0] != ' '
			&& chessBoard[row][0] == chessBoard[row][1]
			&& chessBoard[row][0] == chessBoard[row][2])
			return chessBoard[row][0];
	}
		//2.检查3列
	for (col = 0; col < MAX_COL; col++){
		if (chessBoard[0][col] != ' '
			&& chessBoard[0][col] == chessBoard[1][col]
			&& chessBoard[0][col] == chessBoard[2][col])
			return chessBoard[0][col];
	}
			//3.检查两个对角线
			if (chessBoard[0][0] != ' '				//右对角线
				&& chessBoard[0][0] == chessBoard[1] [1]
				&& chessBoard[0][0] == chessBoard[2][2])
				return chessBoard[0][0];
			if (chessBoard[0][2] != ' '				//左对角线
				&& chessBoard[0][2] == chessBoard[1][1]
				&& chessBoard[0][2] == chessBoard[2][0])
				return chessBoard[0][2];
			if (Isfull(chessBoard)){
				return 'Q';
			}
				return ' ';
}
void Game()
{
	char chessBoard[MAX_ROW][MAX_COL]; //二维数组表示棋盘
	Init(chessBoard);
	char winner = ' ';
	while (1)		//7.循环2-6
	{               
		//2.打印棋盘(第一次打印的是空白棋盘)
		Print(chessBoard);
		//3.玩家落子(通过输入座标的方式确定位置)
		PlayerMove(chessBoard);
		//4.判断一下游戏是否结束
		winner = Check(chessBoard);
		if (winner != ' ')
			break;
		//5.电脑落子(瞎落子)
		ComputerMove(chessBoard);
		//6.判断一下游戏是否结束
		winner = Check(chessBoard);
		if (winner != ' ')
			break;
	}
	Print(chessBoard);
			if (winner == 'O')
			{
				printf("太菜了,电脑都下不过!\n");
			}else if (winner == 'X')
			{
				printf("恭喜你获胜!\n");
			}else{
				printf("太菜了,和电脑五五开\n");
			}
}
int Menu()
{						//交互界面
	printf("==============================================\n");
	printf("欢迎来到三子棋游戏!\n");
	printf("1.开始游戏\n");
	printf("0.退出游戏\n");
	printf("==============================================\n");
	printf("请输入您的选择:");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}
int main()
{
	while (1)
	{
		int choice = Menu();
		if (choice == 1){
			Game();
		}else if (choice == 0){
			printf("goodbye!\n");
			break;
		}else{
			printf("您的输入有误!\n");
		}
	}
	system("pause");
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章