C语言入门必备实战详解:三子棋(附源代码和效果图)新手必做

游戏简介

三子棋,一个古老的游戏,其规则十分简单,当同一玩家的棋子连成一条线,即为获胜

游戏效果图

三子棋

游戏源码

  • 头文件
    为了提高我们代码的可读性,往往一个大型项目是由很多人共同完成,这就意味着你写出来的代码,除了你自己以外,别人也能一眼看懂,这也是区分大佬与萌新的一个关键点,大佬喜欢分享,菜鸟喜欢闭门造车。

先定义游戏的头文件为game.h,头文件是将你所创造的所有函数收录进来,方便你日后查看,某个函数的具体功能

#define ROW 3
#define COL 3

//初始化棋盘
void BoardInit();
//打印棋盘
void BoardShow();
//玩家下子
void BoardPlayer();
//判断棋盘是否下满
char IsFull();
//判断输赢
char BoardWin();
//电脑下子
void BoardComputer();
  • 游戏文件

创建一个实现游戏功能的文件 game.c,这个文件才是我们真正去实现功能的,将我们所有需要的函数,统统写在这里面。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "game.h"
//初始化棋盘
void BoardInit(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
//打印棋盘
void BoardShow(char board[ROW][COL],int row,int col)
{
	for (int i = 0; i < row; i++)
	{
		printf("##################\n|");
		printf("    |     |     |\n|");
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			printf(" | ");
		}

		printf("\n");
		printf("|    |     |     |\n");
	}
	printf("##################\n");
}
//玩家下子
void BoardPlayer(char board[ROW][COL], int row, int col)
{
	int x, y;
	while (1)
	{
		printf("请输入你要下子的坐标:");
		scanf("%d %d", &x, &y);
		if (x<0 || y<0 || x>row || y>col)
		{
			printf("输入的坐标不合法,请重新输入\n");
			continue;
		}
		else if (board[x][y] != ' ')
		{
			printf("该位置已经有子了,请重新下\n");
			continue;
		}
		else
		{
			board[x][y] = 'M';
			break;
		}
	}
}

char IsFull(char board[ROW][COL], int row, int col)
{
	//判断是否满子
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				return 0;
			}
		}
	}
	return 'Q';
}
//判断输赢
//'Q'代表平局,'P'代表玩家赢,'C'代表电脑赢 
char BoardWin(char board[ROW][COL], int row, int col)
{
	//判断行赢
	for (int i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2])
		{
			if(board[i][0] == 'M')
			{
				return 'P';
			}
			else if (board[i][0] == 'C')
			{
				return 'C';
			}
		}
	}
	//判断列赢
	for (int i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i])
		{
			if (board[0][i] == 'M')
			{
				return 'P';
			}
			else if (board[0][i] == 'C')
			{
				return 'C';
			}
		}
	}
	//判断斜赢
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] || board[0][2] == board[1][1] && board[1][1] == board[2][0])
	{
		if (board[1][1] == 'M')
		{
			return 'P';
		}
		else if (board[1][1] == 'C')
		{
			return 'C';
		}
	}
	
	IsFull(board, ROW, COL);
}

//电脑下子
void BoardComputer(char board[ROW][COL],int row,int col)
{
	srand(time(NULL));
	
	while (1)
	{	
		int x = rand() % 3;
		int y = rand() % 3;
		if (board[x][y] != ' ')
		{
			continue;
		}
		else
		{
			board[x][y] = 'C';
			break;
		}
	}
}
  • 主文件

创建文件的主文件 main.c,我们工程项目的主文件,通过它才能去调用我们别的文件。

#include <stdio.h>
#include "game.h"
//菜单函数
void menu()
{
	printf("##########################\n");
	printf("#########三子棋小游戏#####\n");
	printf("##########1.开始游戏######\n");
	printf("##########0.退出游戏######\n");
	printf("##########################\n");
}
void game()
{

	char board[ROW][COL];
	BoardInit(board, ROW, COL);
	BoardShow(board, ROW, COL);
	while (1)
	{
		BoardPlayer(board, ROW, COL);
		BoardShow(board, ROW, COL);
		char ret;
		int num = 1;
		ret = BoardWin(board, ROW, COL);
		if (ret == 'P')
		{
			printf("玩家获胜,游戏结束\n");
			break;
		}
		else if (ret == 'C')
		{
			printf("电脑获胜,游戏结束\n");
			break;
		}
		else if (ret == 'Q')
		{
			printf("游戏平局\n");
			break;
		}
		else
		{
			printf("继续\n");
		}
		BoardComputer(board, ROW, COL);
		ret = BoardWin(board, ROW, COL);
		if (ret == 'M')
		{
			printf("玩家获胜,游戏结束\n");
			break;
		}
		else if (ret == 'C')
		{
			printf("电脑获胜,游戏结束\n");
			break;
		}
		else if (ret == 'Q')
		{
			printf("游戏平局\n");
			break;
		}
		else
		{
			printf("继续\n");
		}
		BoardShow(board, ROW, COL);
	}
	
}
int main()
{
	int input;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("您已经退出游戏了\n");
			break;
		default:
			printf("输入非法,请重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

简单总结

新手在开始写的时候,切记不要直接上手写,这样会很容易造成,想得明白,但做不出来,最好是先认真的看一遍代码,然后逐步分析他的业务逻辑,能够将每一部分实现的功能讲出来,把每个语句的作用都能理解,那么此时,你已经距离项目成功很近啦,加油,你可以的!

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友人和他的朋友们

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值