【C语言教程】如何制作三子棋游戏详解

所需工具:

C++

聪明的大脑

勤劳的双手

 

注意:本站只提供教程,不提供任何成品+工具+软件链接,仅限用于学习和研究,禁止商业用途,未经允许禁止转载/分享等

 

教程如下

三子棋代码的实现需要一个简单的思路做指引,所以我们先来做一下思路的整理,代码的实现主要分为以下几个步骤:

1.初始化数组
2.显示数组
3.电脑走
4.玩家走
5.判断输赢

所以,先写出源文件game.h,如下。

 	#ifndef __GAME_H__
 	#define __GAME_H__
 	 
 	 
 	#define ROWS 3 //定义行
 	#define COLS 3 //定义列
 	 
 	//初始化数组
 	void init_board(char board[ROWS][COLS], int rows, int cols);
 	//显示数组
 	void display_board(char board[ROWS][COLS], int rows, int cols);
 	//电脑走
 	void computer_move(char board[ROWS][COLS], int rows, int cols);
 	//玩家走
 	void player_move(char board[ROWS][COLS], int rows, int cols);
 	//判断输赢
 	char check_win(char board[ROWS][COLS], int rows, int cols);
 	 
 	 
 	#endif//__GAME_H__

接下来再写出主体的main函数,使这个三子棋的大体先做出来。以下为main.c函数。要实现的主要为选择界面以及大体的顺序。

 	#define _CRT_SECURE_NO_WARNINGS
 	 
 	#include"game.h"
 	#include<stdio.h>
 	#include<stdlib.h>
 	#include<time.h>
 	 
 	void menu()
 	{
 	     printf("*******************************\n");
 	     printf("*****1.paly 2.exit *********\n");
 	     printf("*******************************\n");
 	}
 	 
 	void game()
 	{
 	     char ret = 0;
 	     char board[ROWS][COLS] = { 0 };
 	     init_board(board, ROWS, COLS);
 	 
 	     while (1)
 	     {
 	     printf("电脑走:\n");
 	     computer_move(board, ROWS, COLS);
 	     display_board(board, ROWS, COLS);
 	     ret = check_win(board, ROWS, COLS);
 	     if (ret != 'q')
 	     {
 	         break;
 	     }
 	 
 	     printf("玩家走:\n");
 	     player_move(board, ROWS, COLS);
 	     display_board(board, ROWS, COLS);
 	     ret = check_win(board, ROWS, COLS);
 	     if (ret != 'q')
 	     {
 	         break;
 	     }
 	     }
 	 
 	     if (ret == '*')
 	     {
 	     printf("玩家赢了!\n");
 	     }
 	     else if (ret == 'o')
 	     {
 	     printf("电脑赢了!\n");
 	     }
 	     else if (ret == ' ')
 	     {
 	     printf("平局!\n");
 	     }
 	}
 	 
 	int main()
 	{
 	     int input = 0;
 	     srand((unsigned)time(NULL));
 	     do
 	     {
 	     menu();
 	     printf("请选择:");
 	     scanf("%d", & input);
 	     switch (input)
 	     {
 	     case 1:
 	         game();
 	         break;
 	     case 2:
 	         return 0;
 	         break;
 	     default:
 	         printf("输入错误,请重新输入!\n");
 	         break;
 	     }
 	     } while (input);
 	 
 	     system("pause");
 	     return 0;
 	}

以下为函数模块功能的的分布实现:

 	#define _CRT_SECURE_NO_WARNINGS
 	 
 	 
 	#include"game.h"
 	#include<stdio.h>
 	#include<stdlib.h>
 	#include<time.h>
 	 
 	 
 	void init_board(char board[ROWS][COLS], int rows, int cols)
 	{
 	     int i = 0;
 	     int j = 0;
 	     for (i = 0; i < rows; i++)
 	     {
 	     for (j = 0; j < cols; j++)
 	     {
 	         board[i][j] = ' ';
 	     }
 	     }
 	}
 	void display_board(char board[ROWS][COLS], int rows, int cols) //显示棋盘
 	{
 	     int i = 0;
 	     for (i = 0; i < rows; i++)
 	     {
 	     printf("| %c | %c | %c |\n", board[i][0], board[i][1], board[i][2]);
 	     if (i <= rows - 1)
 	     {
 	         printf("|----|----|----|\n");
 	     }
 	     }
 	}
 	 
 	void computer_move(char board[ROWS][COLS], int rows, int cols) //电脑走
 	{
 	     while (1)
 	     {
 	     int x = rand() % 3;
 	     int y = rand() % 3;
 	     if (board[x][y] != '*' & &  board[x][y] != 'o')
 	     {
 	         board[x][y] = 'o';
 	         return;
 	     }
 	 
 	     }
 	}
 	 
 	void player_move(char board[ROWS][COLS], int rows, int cols) //玩家走
 	{
 	     int x = 0;
 	     int y = 0;
 	     printf("玩家请输入位置,如:x y》");
 	     do
 	     {
 	     scanf("%d %d", & x, & y);
 	     if (board[x - 1][y - 1] == 'o')
 	     {
 	         printf("该位置已经被占用,请重新输入:》");
 	     }
 	     else if (((x - 1)>3) || ((y - 1)>3) || (x - 1 < 0) || (y - 1 < 0))
 	     {
 	         printf("输入位置错误,请重新输入:》");
 	     }
 	     else
 	     {
 	         board[x - 1][y - 1] = '*';
 	         break;
 	     }
 	     } while (1);
 	}
 	 
 	static int is_full(char board[ROWS][COLS], int rows, int cols) //判断棋盘满没有
 	{
 	     int i = 0;
 	     int j = 0;
 	     for (i = 0; i < rows; i++)
 	     {
 	     for (j = 0; j <cols; j++)
 	     {
 	         if (board[i][j] == ' ')
 	         {
 	         return 0;
 	         }
 	     }
 	     }
 	     return 1;
 	}
 	 
 	char check_win(char board[ROWS][COLS], int rows, int cols) //判断输赢
 	{
 	     int k = 1;
 	     int i = 0;
 	     for (i = 0; i < rows; i++) //判断行
 	     {
 	     if ((board[i][0] == board[i][1]) & &  (board[i][1] == board[i][2]) & &  board[i][0] != ' ')
 	     {
 	         return board[i][0];
 	     }
 	     }
 	     for (i = 0; i < cols; i++) //判断列
 	     {
 	     if ((board[0][i] == board[1][i]) & &  (board[1][i] == board[2][i]) & &  (board[0][i] != ' '))
 	     {
 	         return board[0][i];
 	     }
 	     }
 	     if ((board[0][0] == board[1][1]) & &  (board[1][1] == board[2][2]) & &  (board[0][0] != ' ')) //判断正斜
 	     {
 	     return board[1][1];
 	     }
 	     if ((board[0][2] == board[1][1]) & &  (board[1][1] == board[2][0]) & &  (board[0][2] != ' ')) //判断反斜
 	     {
 	     return board[0][2];
 	     }
 	     if (is_full(board, rows, cols))
 	     {
 	     return ' ';
 	     }
 	     return 'q';
 	}

 

 

标签

发表评论