【C语言-28】三子棋小游戏代码讲解大放送~~~~~~

目录

 

解题思路:

代码分析:

主函数代码:

菜单函数代码:

游戏函数代码框架:

初始化棋盘函数:

打印棋盘函数:

玩家落子函数:

进行胜负判断函数:

判断棋盘满否函数:

函数头文件:

代码整体示例:

运行结果显示:


解题思路:

  1. 首先有一个三行三列的九宫格棋盘,由玩家和电脑交替落子,最后先三颗棋子的一方连成一线则获胜;                                                  
  2. 首先,棋盘表示,创建一个字符型三行三列的二维数组;(x表示玩家落子,0表示电脑落子,' '表示未落子)
  • 游戏开始时,进行棋盘初始化:把所有的元素设为空格' ';
  • 提示玩家落子:让玩家输入一个坐标;
  • 判断胜负:
  • 未分胜负,电脑落子(基于随机数的方式生成一个坐标);
  • 判断胜负:

代码分析:

主函数代码:

  1. 首先,主函数进入程序;    
  2. 定义一个菜单,输入1则进入游戏;
  3. 输入0则结束游戏;
  4. 输入其他数字则做警示提醒;
  5. 代码如下:
  6.  
  7. 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;
    }

    菜单函数代码:

  8.  定义一个菜单函数,进行打印游戏界面;
  9.  1代表开始游戏;
  10.  0代表结束游戏;
  11.  通过scanf函数获取用户输入数字,在主函数内的选择语句中进行执行下一步;
  12. 代码如下:
  13.  
    int Menu() {
    	printf("====================\n");
    
    	printf("   1.开始游戏\n");
    
    	printf("   0.结束游戏\n");
    
    	printf("====================\n");
    
    	printf("请输入你的选择: ");
    
    	int choice = 0;
    
    	scanf("%d", &choice);
    
    	return choice;
    }

    游戏函数代码框架:

  14.  初始化棋盘函数;
  15.  打印棋盘printf();
  16. 玩家落子PlayerMove();
  17. 检测胜负CheakWinner();
  18.  电脑落子ComputerMove();
  19.   代码主框架如下:
void Game() {
	//1.初始化棋盘,将棋盘每一个坐标点设置为空格;
	Init();

	char Winner = ' ';
	while (1) {

	//2.打印棋盘
	Printf();

	//3.玩家落子

	PlayerMove();

	//4.检测胜负


	Winner = CheckWinner();

	if (Winner != ' ') {

		//胜负已分
		break;
	}

	//5.电脑落子

	ComputerMove();

	//6.检测胜负

	Winner = CheckWinner();

	if (Winner != ' ') {

		//胜负已分

		break;
	}

}
        Printf();

		if (Winner == 'x') {

			printf("恭喜你,你赢了!\n");
		}
		else if (Winner == 'o') {

			printf("你有点笨哦~\n");
		}
		else  if (Winner == 'q') {

			printf("你和电脑不分伯仲!\n");
		}
		else {

			printf("代码好像出现了bug!\n");
		}

}
	

初始化棋盘函数:

  1. 创建一个二维数组 表示棋盘;
  2.  初始化棋盘,棋盘每个坐标位置为空格;
  3. 代码示例:
  4. //创建一个二维数组表示棋盘
    char chess_board[MAX_ROW][MAX_COL];
    
    void Init() {
    
    	for (int row = 0; row < MAX_ROW; ++row) {
    
    		for (int col = 0; col < MAX_COL; ++col) {
    
    			chess_board[row][col] = ' ';
    
    		}
    	   }
    	}

    打印棋盘函数:

  5.  
  6. 代码示例:
  7. void Printf() {
    
    	for (int row = 0; row < MAX_ROW; ++row) {
    
    		printf("| %c | %c | %c |\n", chess_board[row][0], 
                    chess_board[row][1], chess_board[row][2]);
    
    		if (row != MAX_ROW - 1) {
    
    			printf("|---|---|---|\n");
    		}
    
    	}
    	
    }
    

    玩家落子函数:

  8.  提示玩家落子,玩家输入落子坐标;
  9. 对玩家选择的坐标进行合理性判断;
  10.  如果玩家坐标不属于数组内下标,则不合理;
  11.  如果玩家输入坐标值已经被占用则不合理;
  12.  如果合理,则在坐标处放置'x';
  13.  代码示例:
  14. void PlayerMove() {
    
    	printf("玩家落子!\n");
    
    	while(1){
    	      printf("请输入落子位置坐标(row,col):  ");
    
    	      int row = 0;
    	      int col = 0;
    	      scanf("%d %d", &row, &col);
    
    	     //检查用户输入的坐标是否合理
    
    	      if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
    
    			  printf("您输入的坐标不合理,请重新输入!\n");
    
    			  continue;
    	      }
    		  if (chess_board[row][col] != ' '){
    
    		  printf("您要落子的地方已经被占用了!情重新输入!\n");
    
    		  continue;
    
    		  }
    		  chess_board[row][col] = 'x';
    
    		  break;
    	}
    	printf("玩家落子完毕!\n");
    
    }

    进行胜负判断函数:

  15.  返回值表示胜利者,表示玩家胜利,o表示电脑胜利,q表示和棋,' '未分出胜负;
     
  16.  检查所有行是否连成一线;检查所有列是否连成一线;检查所有对角线是否连成一线;
  17.  包含一个棋盘是否满的函数:
  18.  
  19. 代码示例:
//返回值表示胜利者
//x表示玩家胜利
//o表示电脑胜利
//q表示和棋
//' '未分出胜负
char  CheckWinner() {
	//检查所有行是否连成一线,
	for (int row = 0; row < MAX_ROW; ++row) {

		if (chess_board[row][0] == chess_board[row][1] && chess_board[row][0] == chess_board[row][2]) {
			return chess_board[row][0];
		}
	}



	//检查所有列是否连成一线

	for (int col = 0; col < MAX_COL; ++col) {

		if (chess_board[0][col] == chess_board[1][col] && chess_board[0][col] == chess_board[2][col]) {


			return chess_board[0][col];

		}
	}
	//检查所有对角线是否连成一线
	if (chess_board[0][0] == chess_board[1][1] && chess_board[0][0] == chess_board[2][2]) {

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

		return chess_board[0][2];
	}
	//棋盘满并且未分出胜负
	if (IsFull()) {

		return 'q';
	}
	return ' ';
}

判断棋盘满否函数:

  1. 代码示例:
  2. //如果棋盘满了返回1,否则返回0;
    int IsFull() {
    
    	for (int row = 0; row < MAX_ROW; ++row) {
    
    		for (int col = 0; col < MAX_COL; ++col) {
    
    			if (chess_board[row][col] == ' ') {
    
    				//未满
    				return 0;
    			}
    		}
    	}
    	return 1;
    }

    函数头文件:

  3. 代码示例;
  4. #define  _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    //宏定义方式表示行和列,方便扩充,方便修改,提高可读性
    #define MAX_ROW 3
    #define MAX_COL  3
    

    代码整体示例:

#define  _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//宏定义方式表示行和列,方便扩充,方便修改,提高可读性
#define MAX_ROW 3
#define MAX_COL  3


int Menu() {
	printf("====================\n");
	printf("   1.开始游戏\n");
	printf("   0.结束游戏\n");
	printf("====================\n");
	printf("请输入你的选择: ");
	int choice = 0;
	scanf("%d", &choice);
	return choice;
}

//创建一个二维数组表示棋盘
char chess_board[MAX_ROW][MAX_COL];
void Init() {
	for (int row = 0; row < MAX_ROW; ++row) {
		for (int col = 0; col < MAX_COL; ++col) {
			chess_board[row][col] = ' ';
		}
	}
}
void Printf() {
	for (int row = 0; row < MAX_ROW; ++row) {
		printf("| %c | %c | %c |\n", chess_board[row][0], chess_board[row][1], chess_board[row][2]);
		if (row != MAX_ROW - 1) {
			printf("|---|---|---|\n");
		}

	}
	
}

void PlayerMove() {
	printf("玩家落子!\n");
	while(1){
	      printf("请输入落子位置坐标(row,col):  ");
	      int row = 0;
	      int col = 0;
	      scanf("%d %d", &row, &col);
	     //检查用户输入的坐标是否合理
	      if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) {
			  printf("您输入的坐标不合理,请重新输入!\n");
			  continue;
	      }
		  if (chess_board[row][col] != ' '){
		  printf("您要落子的地方已经被占用了!情重新输入!\n");
		  continue;

		  }
		  chess_board[row][col] = 'x';
		  break;
	}
	printf("玩家落子完毕!\n");

}


void ComputerMove() {
	//设置随机种子
	//获取当前时间戳,时间戳:从1970 年1月1号0时0分开始为基准时刻,到当前时间的秒数
	srand((unsigned int)time(0));

	printf("电脑落子\n");
	while (1) {
		int row = rand() % 3;
		int col = rand() % 3;
		if (chess_board[row][col] != ' ') {
			continue;
		}
		chess_board[row][col] = 'o';
		break;

	}
	printf("电脑落子完毕!\n");
}


//如果棋盘满了返回1,否则返回0;
int IsFull() {
	for (int row = 0; row < MAX_ROW; ++row) {
		for (int col = 0; col < MAX_COL; ++col) {
			if (chess_board[row][col] == ' ') {
				//未满
				return 0;
			}
		}
	}
	return 1;
}

//返回值表示胜利者
//x表示玩家胜利
//o表示电脑胜利
//q表示和棋
//' '未分出胜负
char  CheckWinner() {
	//检查所有行是否连成一线,
	for (int row = 0; row < MAX_ROW; ++row) {
		if (chess_board[row][0] == chess_board[row][1] && chess_board[row][0] == chess_board[row][2]) {
			return chess_board[row][0];
		}
	}



	//检查所有列是否连成一线
	for (int col = 0; col < MAX_COL; ++col) {
		if (chess_board[0][col] == chess_board[1][col] && chess_board[0][col] == chess_board[2][col]) {

			return chess_board[0][col];
		}
	}
	//检查所有对角线是否连成一线
	if (chess_board[0][0] == chess_board[1][1] && chess_board[0][0] == chess_board[2][2]) {
		return chess_board[0][0];
	}
	if (chess_board[0][2] == chess_board[1][1] && chess_board[0][2] == chess_board[2][1]) {
		return chess_board[0][2];
	}
	//棋盘满并且未分出胜负
	if (IsFull()) {
		return 'q';
	}
	return ' ';
}




void Game() {
	//1.初始化棋盘,将棋盘每一个坐标点设置为空格;
	Init();
	char Winner = ' ';
	while (1) {
		//2.打印棋盘
		Printf();
		//3.玩家落子
		PlayerMove();
		//4.检测胜负

		Winner = CheckWinner();
		if (Winner != ' ') {
			//胜负已分
			break;
		}

		//5.电脑落子
		ComputerMove();
		//6.检测胜负
		Winner = CheckWinner();
		if (Winner != ' ') {

			//胜负已分
			break;
		}

	}
	Printf();

		if (Winner == 'x') {
			printf("恭喜你,你赢了!\n");
		}
		else if (Winner == 'o') {
			printf("你有点笨哦~\n");
		}
		else  if (Winner == 'q') {
			printf("你和电脑不分伯仲!\n");
		}
		else {
			printf("代码好像出现了bug!\n");
		}

}
	
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;
}

运行结果显示:

  1.  
  2.  
  3.  
  4.  
  5.  

猜你喜欢

转载自blog.csdn.net/weixin_44749767/article/details/89143785