基于c语言的简单小游戏-(三子棋)

前言

阅读水平条件
C语言的基本语法:

  • 条件语句if,switch;
  • 循环语句for ,while, do while,
  • 函数
  • 数组

    文章目录

    • 前言
    • 一. 三子棋效果展示
    • 二. 三子棋的需求分析
    • 三. 三子棋的代码实现
      • 1) 三子棋的菜单和交互逻辑的实现
      • 2)三子棋的初始化
      • 3)三子棋的界面显示
      • 4)三子棋玩家移动
      • 5)三子棋电脑移动
      • 6)三子棋判断输赢

一. 三子棋效果展示

基于c语言的简单小游戏-(三子棋)_第1张图片
大概就是玩家选择对应的坐标下棋,电脑会自动下棋;直到游戏结束,或者平局。


二. 三子棋的需求分析

三子棋游戏需要一个3 × 3 的棋盘,需要玩家下棋,需要电脑下棋,需要判断输赢。

  • 首先:三子棋是一个 3 × 3 的九宫格:我们可以用一个二维数组表示;
  • 其次:玩家下棋,分装函数,本质二维数赋值,用 * 号表示;
  • 接着:电脑下棋,封装好事,本质二维数组赋值,用 # 号表示;
  • 最后:判断输赢,本质二维数组的上下左右写对角线的符号相等,即可判断输赢;

三. 三子棋的代码实现

前提准备文件:(笔者用vs2013创建的文件)

  • game.c 文件:用于实现扫雷游戏的功能函数;
  • game.h 文件:用于声明函数,和声明一些头文件;
  • text.c文件:用于主函数测试游戏和主函数开始的文件;

头文件的代码内容(具体实现在后面):

# define ROW 3 //行号
# define COL 3 //列号
# include
# include //随机数种子函数srand()的头文件
# include //时间函数time()需要的头文件

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

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

void PlayMove(char board[ROW][COL], int row, int col); //玩家下棋

void ComputerMove(char board[ROW][COL], int row, int col);//电脑下棋

char IsWin(char board[ROW][COL],int row,int col);//四种状态	
			//玩家,
			//电脑,
			//平局,
			//是否继续
int IsFull(char board[ROW][COL], int row, int col); //判断棋盘是否满了

1) 三子棋的菜单和交互逻辑的实现

下面的代码也是在 test.c文件中的

#define _CRT_SECURE_NO_WARNINGS 1

# include"game.h"
// 测试三子
void meun()
{	
	printf("*********|三子棋|********\n");
	printf("*********--------********\n");
	printf("*********|1.Play|********\n");
	printf("*********--------********\n");
	printf("*********|0.Exit|********\n");
}
// 游戏的实现
void game()
{
	char ret = 0;
	//创建数组——存放玩家走的棋盘信息
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	//下棋
	while (1)
	{
		//玩家下棋
		PlayMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断玩家是否赢
		 ret = IsWin(board, ROW, COL);
		if (ret != 'C') //用字符C游戏结束状态
			break;
			
		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		 ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
	}
		if (ret == '*')
			printf("玩家赢\n");
		else if (ret == '#')
			printf("电脑赢\n");
		else
			printf("平局\n");
}
void text()
{
	int input = 0;
	srand((unsigned int)time(NULL));//随机数为了后面电脑下棋做准备
	do
	{
		meun();
		printf("请选择->:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误请重新选择\n");
			break;
		}
	} while (input);
}
int main()
{
	text();
	return 0;
}

首先看 test( )函数

  • [1 ] 游戏进入需要一个菜单页面,用一个函数menu()封装,打印界面即可;
  • [2 ] 可供选择游戏开始和结束,这里提供switch语句供玩家选择,选择 1 表示进入游戏,选择 0 表示退出游戏,选择其他,就重写输入;
  • [3 ] 并且玩家有可能需要一直玩下去,所以提供一个 do while 循环,为什么是do while而不是 while, 因为我们玩家一进入游戏就开始游戏,而不是先判断需不需要开始玩;

其次看 game()函数

  • [1 ] 游戏的开始,需要设置 3×3 的九宫格,用一个二维数组创建;
  • [2 ] 二维数组有了,需要初始化二维数组,用空格初始化,封装InitBoard(board, ROW, COL)函数;
  • [3 ] 并且我们需要棋盘的模样,本质也就是 给二维数组,打印一些边框,分装DisplayBoard(board, ROW, COL);
  • [4 ] 开始玩家下棋,封装函数PlayMove(board, ROW, COL);由于玩家下棋要一直下棋直到游戏结束和平局出现,所以用一个while去控制,下完棋需要打印一下棋盘的信息,所以用DisplayBoard(board, ROW, COL)去打印,打印结束后还需要判断一下玩家是否赢了,用一个IsWin(board, ROW, COL);去封装,我们设计IsWin()函数的返回值为char类型,用返回值 C来判断游戏结束状态,用字母Q表示游戏平局;
  • [5 ] 电脑下棋逻辑和玩家基本一样,只是实现的代码有些不一样;

2)三子棋的初始化

void InitBoard(char board[ROW][COL], int row, int col) //初始化棋盘本质就是给二维数组赋值空格;
{
	int i = 0, j = 0;
	for (i = 0; i < ROW; i++)
	for (j = 0; j < COL; j++)
	{
		board[i][j] = ' ';
	}
}

3)三子棋的界面显示

void DisplayBoard(char board[ROW][COL], int row, int col) //打印棋盘模样,本质也是打印二维数组
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		//打印一行数据;
		for (int j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]); // 用字符 * 和 # 来区分玩家和电脑
			if (j < col - 1) //控制条件,不打印最后一列的 竖杠 |
				printf("|");
		}
		printf("\n");
		//打印分割行;
		if (i < row - 1) //控制条件,不打印最后一行的 --- 分隔符
		{
			for (int j = 0; j < col; j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

4)三子棋玩家移动

void PlayMove(char board[ROW][COL], int row, int col) //玩家移动
{
	int x = 0, y = 0; // 下棋的坐标变量
	printf("玩家走->:\n");
	while (1)
	{
		printf("请输入要下的坐标->");
		scanf("%d%d", &x, &y);
		//判断x,y的坐标合法性
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ') // x-1 y-1是因为数组的下标从0开始,而我们下棋的下标从一开始
			{
				board[x - 1][y - 1] = '*'; //玩家下棋用*号表示
				break;
			}
			else
				printf("该坐标被占用\n");
		}
		else
			printf("输入有误,请重新输入\n");
	}
}

5)三子棋电脑移动

void ComputerMove(char board[][COL], int row, int col) //电脑移动
{
	int x = 0, y = 0;
	printf("电脑走->\n");
	while (1)
	{
		//设置随机下标让电脑走,控制下标为0-2
		x = rand() % row;  
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

6)三子棋判断输赢

int IsFull(char board[ROW][COL], int row, int col) //封装函数判断三子棋是否满的状态
{

	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
				return 0;	
		}
	}
	return 1;
}
char IsWin(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] && board[i][1] != ' ')
			return board[i][1];
	}
	
	//判断竖三列是否相等
	for (int 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[2][0] != ' ')
			return board[1][1];
			
	if (1 == IsFull(board, ROW, COL)) //满了返回Q表示平局
		return 'Q';
	return 'C'; //返回C 表示游戏结束标志
}

三子棋的功能代码实现组合起来就是 game.c文件的内容了。

你可能感兴趣的:(C语言,游戏,c++,c语言,三子棋)