c语言——三字棋小游戏

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

 


准备工作

  首先我们要做一下准备工作,先创建好一个.c文件,我们给这个文件命名为test.c,再创建一个头文件.h文件,命名为game.h,还需要一个实现的.c文件,我们命名为game.c

 

当我们创建好文件之后,那么打开我们创建的test.c文件,我们将从这里开始

写一个main函数 

我们这次不在main函数中写尽量在main函数中少写东西,我们在main函数中创建一个test()函数,

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

当我们写完test函数之后我们就可以在test函数中来实现我们的代码

void test()
{
	srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		menu(); // 写一个menu函数打印菜单
		scanf("%d", &input); //录入一个值来作为switch的开关
		switch (input)
		{
		case 1: //如果用户输入1 那么就进入
			printf("开始游戏\n"); //提示一下
			game(); // 为游戏实现创建的函数
			break; 
		case 0:
			printf("退出游戏\n"); //如果用户输入0那么就退出游戏
			break;
		default:
			printf("选择错误,请重新选择\n");//如果用户输入的不是1/0那么就提示一下,输入错误
			break;

		}

	} while (input); //因为,我们是需要玩完之后再继续玩,所以我们录入1的话就可以一直玩下去
}
void menu()
{
	printf("**************************\n");
	printf("*******   1.play  ********\n"); //菜单实现
	printf("*******   0.exit  ********\n");
	printf("**************************\n");
}

下面我们开始实现,game()函数

test.c文件,game()函数

void game()
{
	char ret = 0;
	char board[ROW][COL]; //创建一个二维数组,行和列,这里选择的是宏定义,在.h文件中实现
	init_board(board, ROW, COL); //初始化棋盘,将棋盘初始化为‘ ’;
	print_board(board, ROW, COL); // 打印棋盘看一下;

	while (1)
	{
		game_play(board, ROW, COL); // 玩家下棋,在game.c中实现
		print_board(board, ROW, COL);// 玩家下棋后打印出来看下
		ret = is_win(board, ROW, COL); // 判断输赢函数,看下返回的是什么 判断玩家是否胜利
		if (ret != 'C')  //如果返回的不是‘c’那就结束跳出去判断
		{
			break; //规定,玩家胜利返回‘*’,电脑胜利返回‘#’,平局返回‘Q’,继续返回‘C’
		}


		comp_play(board, ROW, COL); // 电脑下棋 game.c中实现
		print_board(board, ROW, COL); // 打印棋盘
		ret = is_win(board, ROW, COL); //判断电脑是否胜利
		if (ret != 'C')
		{
			break;//规定,玩家胜利返回‘*’,电脑胜利返回‘#’,平局返回‘Q’,继续返回‘C’
		}
	}
	if (ret == '*') //如果返回的是‘*’那么就是玩家胜利
	{
		printf("胜利\n");
	}
	else if (ret == '#')//如果返回的是‘#’那么就是电脑胜利
	{
		printf("你输了\n");
	}
	else if (ret == 'Q')//如果返回的是‘Q’那么就是平局了
	{
		printf("平局\n");
	}

}

game.h头文件实现

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

#define ROW 3 //宏定义 行
#define COL 3  //宏定义列  为了以后方便修改

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

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

void game_play(char board[ROW][COL], int row, int col); // 玩家下棋函数声明

void comp_play(char board[ROW][COL], int row, int col); // 电脑下棋函数声明

char is_win(char board[ROW][COL], int row, int col); // 判断输赢函数实现

game.c文件实现

#include "game.h" //这个是我们自己的.h文件,我们使用时也是要包含头文件的

void init_board(char board[ROW][COL], int row, int col) // 棋盘初始化为‘ ’;
{ 
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++) //遍历行和列 这里的row和col是3 在.h文件中宏定义的
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' '; //将row行col列全部初始化为‘ ’;空格
		}
	}
}

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]); //这里要将i行j列打印为“ %c ”这种格式
			if (j < col - 1)
			{
				printf("|"); // 打印|是不需要每次都打印,当比列少一的时候才打印
			}
		}
		printf("\n"); //打印完一行之后换行
		if (i < col - 1) 
		{
			for (j = 0; j < col; j++)
			{
				printf("---");  //打印每一列“---”
				if (j < col - 1)
				{
					printf("|");// 打印|是不需要每次都打印,当比列少一的时候才打印
				}
			}
			printf("\n");
		}
	}
}


void game_play(char board[ROW][COL], int row, int col) //玩家下棋实现
{
	printf("玩家输入:>"); //提示玩家输入
	while (1)  //因为下棋是要一直下的,所以这里是循环 只要下棋成功才跳出去
	{
		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 comp_play(char board[ROW][COL], int row, int col)//电脑下棋
{
	printf("电脑下棋:>\n"); //首先提示一下电脑开始下棋

	while (1) //电脑下棋也是一个循环,只有下棋成功之后才跳出
	{
		int x = rand() % row; //电脑下棋我们要生成随机坐标,这时候要用我们的time函数,rand这个 
                              //函数使用前需要调用srand函数,在game()函数中实现
		int y = rand() % col;
		if (board[x][y] == ' ') // 电脑下棋不需要判断,我们生成的随机数是0-2;只需要判断
                                  //这个坐标是不是‘ ’  如果是空格我们就下棋,下棋之后我们也要 
                                       //跳出去
		{
			board[x][y] = '#';
			break;
		}
	}


}


static 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 (is_full(board, row, col) == 1) //判断是不是平局,上边返回的是1 就证明没有空余的棋盘
                                         //那么就是平局了  就返回‘Q’
	{
		return 'Q';
	}

	return 'C'; // 如果上边的都没有返回,那么就返回‘C’ 继续下棋
}

嘿嘿,这次换个写法,用备注的方式写,可能会更直白的看出,期待有一天我能把我的表达能力变的好些,期待我也可以写出好的文章吧,还有很多需要学习的地方,最近也有看好的博客,像大佬学习 谢谢检阅 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值