c/c++语言开发共享C语言三子棋一步步实现详程

目录一.创建菜单(在test.c中)二.创建游戏内容1.棋盘的创建和初始化2.打印棋盘3.玩家下棋4.电脑下棋5.判断输赢完整代码1.game.h2.game.c3.test.c游戏思路:1.创建初始

目录
  • 一.创建菜单(在test.c中)
  • 二.创建游戏内容
    • 1.棋盘的创建和初始化
    • 2.打印棋盘
    • 3.玩家下棋
    • 4.电脑下棋
    • 5.判断输赢
  • 完整代码
    • 1.game.h
    • 2.game.c
    • 3.test.c

游戏思路:

1.创建初始游戏界面菜单

2.创建游戏内容:

          初始化棋盘  打印棋盘 设置两方棋子 

          玩家下  电脑下  判断输赢

代码行数较多,这里我们 :

          创建 game.h 头文件来声明函数

          创建 game.c 源文件来定义函数

          创建   test.c   源文件来运行游戏

一.创建菜单(在test.c中)

首先我们来分析,运行程序时,我们要让电脑显示出 是进入游戏还是退出游戏,创建菜单menu

要进行选择,因此选择 switch 语句,并且当玩家进入游戏结束游戏后,还要再来一把,那么就要再一次显示 menu,因此这里是先进行一次的循环,再判断,选择 do…while 语句。

为了阅读方便,我们分开写,进行函数嵌套调用,如下:

  void menu()  {  	printf("************************n");  	printf("******  1.play  ********n");  	printf("******  0.exit  ********n");  	printf("************************n");  }        void test()  {  	int input;     	do  	{  		printf("请选择>:n");  		menu();                     //调用创建的菜单  		scanf("%d",&input);  		switch (input)  		{  		case 1:  			printf("三子棋n");  			break;  		case 0:  			printf("退出游戏n");  			break;  		default:  			printf("输入错误,请重新输入>:");  			break;  		}  	} while (input);  }        int main()  {  	test();  	return 0;  }

二.创建游戏内容

1.棋盘的创建和初始化

先创建 game() 函数替代 case1 中 printf("三子棋n");

再来分析,三子棋游戏有行列,因此我们想到二维数组三行三列,并且都为空格,在 game 函数中创建棋盘    char board[3][3] = {0};  并且初始化棋盘,initboard(board,3,3); ,这里的初始化棋盘函数我们直接在 game 里调用,在.h里面进行声明,在 game.c 中进行定义:

  game.h     void initboard(char board[3][3], int row, int col);    //初始化棋盘
  game.c     void initboard(char board[3][3], int row, int col)     //初始化棋盘  {  	int i = 0;  	for (i = 0; i < row; i++)  	{  		int j = 0;  		for (j=0;j<col;j++)  		{  			board[i][j] = ' ';  		}  	}  }

这里有一点我们可以优化,若我们要创建五行五列,六行六列时,又要在三个文件里面都改动数组的行列,那能不能一步到位呢?

  game.h     //这里我们在.h里面用宏定义直接进行行列的表达:     #define row 3  #define col 3     void initboard(char board[row][col], int row, int col);    //初始化棋盘
  game.c     void initboard(char board[row][col], int row, int col)     //初始化棋盘  {  	int i = 0;  	for (i = 0; i < row; i++)  	{  		int j = 0;  		for (j=0;j<col;j++)  		{  			board[i][j] = ' ';  		}  	}  }
  test.c     void game()  {  	char board[row][col] = {0};  	initboard(board,row,col);  //初始化棋盘  }

这样我们只需要改变 宏定义的值,打印的棋盘行列便可以直接改变。

2.打印棋盘

在 game 函数中创建打印棋盘函数

  test.c     void game()  {  	char board[row][col] = {0};  	initboard(board,row,col);  //初始化棋盘  	displayboard(board, row, col);  //打印棋盘  }
  game.h     #define row 3  #define col 3  //函数声明  void initboard(char board[row][col], int row, int col);    //初始化棋盘     void displayboard(char board[row][col], int row, int col); //打印棋盘
  game.c     void displayboard(char board[row][col], int row, int col)    //打印棋盘  {  	int i = 0;  	int j = 0;  	for (i = 0; i < row; i++)            //三行  	{  		//打印数据  		for (j = 0; j < col; j++)         //三列数据  		{  			printf(" %c ",board[i][j]);  			if (j < col - 1)               //看图可知打印2个竖分割线 因此是 col-1  				printf("|");  		}  		printf("n");                //换行打印  		//打印分割行  		if (i<row-1)                 //看图知只打印2行分割线 因此是 row-1  		for (j = 0; j < col; j++)     //打印三列  		{  			printf("---");  			if (j < col - 1)           //看图可知打印2个竖分割线 因此是 col-1  			printf("|");  		}  		printf("n");                  //不要忘记换行  	}  }

棋盘如下:

C语言三子棋一步步实现详程

3.玩家下棋

在 game 函数中创建玩家下棋函数

  test.c     void game()  {  	char board[row][col] = {0};  	initboard(board,row,col);  //初始化棋盘  	displayboard(board, row, col);  //打印棋盘  	play_move(board, row, col);   //玩家下棋  	displayboard(board, row, col);  //打印棋盘       走一步打印一次  }
  game.h     #define row 3  #define col 3  //函数声明  void initboard(char board[row][col], int row, int col);    //初始化棋盘     void displayboard(char board[row][col], int row, int col); //打印棋盘     void play_move(char board[row][col], int row, int col);   //玩家下棋

玩家只需看棋盘输入坐标即可:

注:这里要注意 数组行列下标都是从0开始,因此赋子时行列必须对应的减去1

  game.c     void play_move(char board[row][col], int row, int col)   //玩家下棋  {  	int x = 0;  	int y = 0;  	printf("玩家下棋>:");  	while (1)                                          需要重复下棋,是循环  	{  		scanf("%d %d",&x,&y);  		if (x >= 1 && x <= row &&y >= 1 && y <= col)   //判断输入坐标是否越界  		{  			if (board[x - 1][y - 1] == ' ')             //判断输入坐标是否已经落子  			{  				board[x - 1][y - 1] = '*';               //玩家为'*'  				break;                              //走一步后跳出,防止死循环  			}  			else  				printf("该坐标被占用,请重新输入:n");  		}     		else  		{  			printf("坐标非法,请重新输入:n");  		}  	}  }

4.电脑下棋

在 game 函数中创建电脑下棋函数

  test.c     void game()  {  	char board[row][col] = {0};  	initboard(board,row,col);  //初始化棋盘  	displayboard(board, row, col);  //打印棋盘     	play_move(board, row, col);   //玩家下棋  	displayboard(board, row, col);  //打印棋盘       走一步打印一次     	computer_move(board, row, col);  //电脑下棋  	displayboard(board, row, col);   //走一步打印一次  }        void test()  {  	int input;  	srand((unsigned int)time(null));    //在test函数里设置随机数,srand需在rand之前使用  	do  	{  		printf("请选择>:n");  		menu();  		scanf("%d",&input);  		switch (input)  		{  		case 1:  			game();  			break;  		case 0:  			printf("退出游戏n");  			break;  		default:  			printf("输入错误,请重新输入>:");  			break;  		}  	} while (input);  }
  game.h     #include <time.h>        //设置随机数需要用到时间戳  #include <stdlib.h>      //设置随机数需要用到 srand 和rand      #define row 3  #define col 3  //函数声明  void initboard(char board[row][col], int row, int col);    //初始化棋盘     void displayboard(char board[row][col], int row, int col); //打印棋盘     void play_move(char board[row][col], int row, int col);   //玩家下棋     void computer_move(char board[row][col], int row, int col);  //电脑下棋

用随机数设置电脑落子坐标

  game.c     void computer_move(char board[row][col], int row, int col)    //电脑下棋  {  	printf("电脑下棋:n");     	while (1)                                 //重复下,因此是循环  	{  		int x = rand() % row;    //0~2          //电脑下棋为随机  		int y = rand() % col;    //0~2          //我们只需要设置随机数和随机数的范围  		if (board[x][y] == ' ')  		{  			board[x][y] = '#';                   //设置电脑棋子为'#'  			break;                              //走一步跳出循环,防止死循环  		}  	}  }

注意:玩家和电脑下棋均为循环,因此在调用下棋函数是都应重复调用,则game函数里应为:

  test.c     void game()  {  	char board[row][col] = {0};  	initboard(board,row,col);  //初始化棋盘  	displayboard(board, row, col);  //打印棋盘     	while (1)  	{  		play_move(board, row, col);   //玩家下棋  		displayboard(board, row, col);     		computer_move(board, row, col);  		displayboard(board, row, col);     	}

5.判断输赢

声明函数,并分析游戏结果:三行相同 三列相同 对角线相同  玩家赢或电脑赢 或者是下满棋盘平局。用不同符号表示不同结果:

  game.h     #include <time.h>  #include <stdlib.h>     #define row 3  #define col 3  //函数声明  void initboard(char board[row][col], int row, int col);    //初始化棋盘     void displayboard(char board[row][col], int row, int col); //打印棋盘     void play_move(char board[row][col], int row, int col);   //玩家下棋     void computer_move(char board[row][col], int row, int col);  //电脑下棋     char is_win(char board[row][col], int row, int col);  //判断输赢  玩家赢'*' 电脑赢'#'  平局'q'  继续'c'
  test.c     void game()  {  	char board[row][col] = {0};  	initboard(board,row,col);  //初始化棋盘  	displayboard(board, row, col);  //打印棋盘     	char ret = 0;                                   //创建ret方便函数返回字符  	while (1)  	{  		play_move(board, row, col);   //玩家下棋  		displayboard(board, row, col);     		ret = is_win(board, row, col);              //返回字符并判断     c为继续  		if (ret!='c')  		{  			break;  		}  		computer_move(board, row, col);  		displayboard(board, row, col);     		ret = is_win(board, row, col);               //返回字符并判断     c为继续  		if (ret!='c')  		{  			break;  		}  	}  	if (ret == '*')  	{  		printf("玩家赢n");  	}  	else if (ret == '#')  	{  		printf("电脑赢n");  	}  	else                                    //这里ret='q'  	{  		printf("平局n");  	}  }

函数实现:

  game.c     int is_full(char board[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 (board[i][j] == ' ')  			{  				return 0;  			}  		}  	}  	return 1;                                  //没有空的坐标时返回1  }        char is_win(char board[row][col], int row, int col)   //判断输赢  {  	int i = 0;  	//三行相同  	for (i = 0; i < row; i++)  	{  		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')  		{  			return board[i][1];  		}  	}  	//三列相同  	for (i = 0; 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[1][1] != ' ')  	{  		return board[1][1];  	}     	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')  	{  		return board[1][1];  	}     	//判断平局  	if (1 == is_full(board, row, col))      //当坐标没空子时,且上述条件不成立则等于1  	{  		return 'q';                          //返回'q'  	}  	//继续  	return 'c';  }

这里平局函数is_full,在函数is_win里调用,直接在game.c文件里面, is_win 函数外面定义就行,没有必要放在test.c里面单独调用。

test.c和game.c都需要调用头文件stdio.h,我们将它放入game.h里面,并且test.c和game.c都调用game.h就可以了

完整代码

1.game.h

  #include <stdio.h>  #include <time.h>  #include <stdlib.h>     #define row 3  #define col 3  //函数声明  void initboard(char board[row][col], int row, int col);    //初始化棋盘     void displayboard(char board[row][col], int row, int col); //打印棋盘     void play_move(char board[row][col], int row, int col);   //玩家下棋     void computer_move(char board[row][col], int row, int col);  //电脑下棋     char is_win(char board[row][col], int row, int col);  //判断输赢  玩家赢'*' 电脑赢'#'  平局'q'  继续'c'

2.game.c

  #include "game.h"  //函数实现  void initboard(char board[row][col], int row, int col)     //初始化棋盘  {  	int i = 0;  	for (i = 0; i < row; i++)  	{  		int j = 0;  		for (j=0;j<col;j++)  		{  			board[i][j] = ' ';  		}  	}  }     void displayboard(char board[row][col], int row, int col)    //打印棋盘  {  	int i = 0;  	int j = 0;  	for (i = 0; i < row; i++)  	{  		//数据  		for (j = 0; j < col; j++)  		{  			printf(" %c ",board[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 play_move(char board[row][col], int row, int col)   //玩家下棋  {  	int x = 0;  	int y = 0;  	printf("玩家下棋>:");  	while (1)  	{  		scanf("%d %d",&x,&y);  		if (x >= 1 && x <= row &&y >= 1 && y <= col)  		{  			if (board[x - 1][y - 1] == ' ')  			{  				board[x - 1][y - 1] = '*';  				break;  			}  			else  				printf("该坐标被占用,请重新输入:n");  		}     		else  		{  			printf("坐标非法,请重新输入:n");  		}  	}  }        void computer_move(char board[row][col], int row, int col)    //电脑下棋  {  	printf("电脑下棋:n");     	while (1)  	{  		int x = rand() % row;  		int y = rand() % col;  		if (board[x][y] == ' ')  		{  			board[x][y] = '#';  			break;  		}  	}  }     int is_full(char board[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 (board[i][j] == ' ')  			{  				return 0;  			}  		}  	}  	return 1;  }     char is_win(char board[row][col], int row, int col)   //判断输赢  {  	int i = 0;  	//三行  	for (i = 0; i < row; i++)  	{  		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')  		{  			return board[i][1];  		}  	}  	//三列  	for (i = 0; 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[1][1] != ' ')  	{  		return board[1][1];  	}     	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')  	{  		return board[1][1];  	}     	//判断平局  	if (1 == is_full(board, row, col))  	{  		return 'q';  	}  	//继续  	return 'c';  }

3.test.c

  #include "game.h"           void menu()  {  	printf("************************n");  	printf("******  1.play  ********n");  	printf("******  0.exit  ********n");  	printf("************************n");  }     void game()  {  	char board[row][col] = {0};  	initboard(board,row,col);  //初始化棋盘  	displayboard(board, row, col);  //打印棋盘     	char ret = 0;  	while (1)  	{  		play_move(board, row, col);   //玩家下棋  		displayboard(board, row, col);     		ret = is_win(board, row, col);  		if (ret!='c')  		{  			break;  		}  		computer_move(board, row, col);  		displayboard(board, row, col);     		ret = is_win(board, row, col);  		if (ret!='c')  		{  			break;  		}  	}  	if (ret == '*')  	{  		printf("玩家赢n");  	}  	else if (ret == '#')  	{  		printf("电脑赢n");  	}  	else  	{  		printf("平局n");  	}  }        void test()  {  	int input;  	srand((unsigned int)time(null));  	do  	{  		printf("请选择>:n");  		menu();  		scanf("%d",&input);  		switch (input)  		{  		case 1:  			game();  			break;  		case 0:  			printf("退出游戏n");  			break;  		default:  			printf("输入错误,请重新输入>:");  			break;  		}  	} while (input);  }        int main()  {  	test();  	return 0;  }

游戏效果如下:

C语言三子棋一步步实现详程C语言三子棋一步步实现详程

这样我们简易的三子棋就写完啦,中间还有很多可以优化的地方,之后改进了会发布的!!!!

到此这篇关于c语言三子棋一步步实现详程的文章就介绍到这了,更多相关c语言 三子棋内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享C语言三子棋一步步实现详程,都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/1047461.html

(0)
上一篇 2022年2月12日
下一篇 2022年2月12日

精彩推荐