C-三子棋

我们在学完二维数组后,就可以写代码模拟实现三子棋游戏,让小编带大家实现代码。

一.注意几点:

  • 模块化。我们分为3个模块,test.c来实现游戏的逻辑,game.c   game.h来实现游戏内容。
  • 函数化。将每个小模块包装成函数可以让逻辑更畅通,代码的可读性更高。
  • 整体化。做到如果今后想玩方格更多的棋盘,在代码中修改一处即可。

二.思路:

  1. 创建数组,打印菜单
  2. 初始化棋盘
  3. 打印棋盘
  4. 玩家下棋
  5. 电脑下棋
  6. 判断胜负

三.部分内容解析

1.#define

在 game.h 文件中通过#define 定义行列,如果我们想玩更多方格的棋盘,只需在这里改变ROW,COL即可。

2.棋盘

先来看棋盘样式:。我们明知有三列,但不能这样打印:

printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);

这样列数确定了,COL就失去了作用

3.电脑生成随机值

各位读者请审阅小编的上一篇文章

四.代码实现

1. test.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void menu()
{
	printf("*******************************\n");
	printf("**********  1.play  ***********\n");
	printf("**********  0.eixt  ***********\n");
	printf("*******************************\n");
}

void game()
{
	char board[ROW][COL];
	char ret = 0;
	//初始化棋盘全为空格
	init_board(board, ROW, COL);
	print_board(board, ROW, COL);

	while (1)
	{
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret == '*')
		{
			printf("玩家赢了\n");
			break;
		}

		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//判断输赢
		ret = is_win(board, ROW, COL);
		if (ret == '#')
		{
			printf("电脑赢了\n");
			break;
		}

		if (ret == 'Q')
		{
			printf("平局\n");
			break;
		}
	}
}

//玩家赢:*
//电脑赢:#
//平局:Q
//继续:C

void test()
{
	srand((unsigned int)time(NULL));//文章末尾做解析
	int input = 0;
	//上来循环得先走一遍,所以用do-while
	do
	{
		menu();	
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏");
			break;
		default:
			printf("输入错误,重新输入:\n");
		}
	} while (input);//如果input非0为真,就再次进入循环
}

int main()
{
	test();
	return 0;
}

2. game.h

#pragma once

#define ROW 3  //行
#define	COL 3  //列

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//初始化棋盘
void init_board(char board[ROW][COL], int row, int col);

//打印棋盘
void print_board(char board[ROW][COL], int row, int col);

//玩家下棋
void player_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);

3. game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include "game.h"

void init_board(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 print_board(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++)
		{
			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 player_move(char board[ROW][COL], int row, int col)
{
	printf("玩家下棋:\n");
	while (1)//死循环,break可以跳出循环
	{
		printf("请输入要下的坐标:");
		int x = 0;
		int y = 0;
		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;
		}
	}
}

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][0]==board[i][2] & board[i][0] != ' ')
			return board[i][0];
		//不用区分里面是*/#,里面有什么就返回什么
	}

	//每一列
	int j = 0;
	for (j = 0; j < col; j++)
	{
		if (board[0][j]==board[1][j] && board[0][j]==board[2][j] && board[0][j] != ' ')
			return board[0][j];
	}

	//对角
	if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
		return board[0][0];
	if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ')
		return board[0][2];
	
	//继续
	//棋盘还有空位,就继续走
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 'C';
		}
	}

	//都没赢,棋盘还满了,就平局
	return 'Q';
}

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注

小编会以自己学习过程中遇到的问题为素材,持续为您推送文章。