C语言----(简易)三子棋游戏

本文是作者初次学习C语言时,写的笔记博文,如有错误请及时指正。多谢啦!!!!


目录

本文是作者初次学习C语言时,写的笔记博文,如有错误请及时指正。多谢啦!!!!

一,问题描述

二,基本逻辑

三,具体步骤

1,进入游戏的选择逻辑

2,游戏体

3,创建棋盘

4,初始化棋盘

5,打印棋盘并美化棋盘

6,玩家下棋

7,电脑下棋

8,判断输赢

四,游戏函数体

五,三个文件的具体代码

1,源.c

2,game.c

3,game.h

感谢观看!!!!!!!!!!!!!!!!!!!!!!!!!


准备阶段:今天我们用模块化的编程方式,创建三个文件。

test.c //用来测试游戏的逻辑

game.c //游戏函数的实现

game.h //游戏中函数的声明,符号的定义。



一,问题描述

写代码来实现简易三子棋游戏。

二,基本逻辑

1,首先我们要写一个游戏的菜单选择进入游戏还是退出游戏

2,游戏体应该封装在一个函数内

3,创建一个二维数组来作为棋盘

4,打印我的棋盘并美化棋盘的函数

5,玩家下棋的函数

6,电脑下棋的函数

7,判断胜负的函数

8,回到菜单再次选择进入游戏还是退出游戏

三,具体步骤

1,进入游戏的选择逻辑

写代码来实现:

输入1-->进入游戏;

输入0-->退出游戏;

输入其他数-->显示输入错误,请重新输入!

#include "game.h"


void menu()
{
	printf("********************************************\n");
	printf("********************************************\n");
	printf("***************   1.paly     ***************\n");
	printf("***************   0.exit     ***************\n");
	printf("********************************************\n");
}


void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();//这里是游戏实现的函数
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default :
			printf("输入错误,请重新选择!!!\n");
		}
	}while (input);//这里直接用input也可以
}


int  main()
{
	srand((unsigned int)time(NULL));
	test();
}

注意:这里应该包含头文件#include<stdio.h>,但是我们创建了  ”game.h“  ,可以在  "test.c" 和   ”game.c"  里面包含#include "game.h"。在  ”game.h“  包含库函数的头文件自定义函数的声明一些自定义的宏变量。这样就可以吧一些头文件,自定义的宏,,,等集中定义和减少定义次数。

2,游戏体

从test函数中case 1:用到的一个函数,是这个游戏的核心。在这个函数中实现游戏的所有功能。下面是game函数里面的各个功能代码现在我们来逐个分析。

void game()
{
	//创建一个棋盘数组
	char board[ROW][COL] = { ' ' };
	//初始化棋盘
	init_board(board, ROW, COL);
	//打印棋盘并美化棋盘
	print_board(board, ROW, COL);
	while (1)
	{

		//玩家下棋
		play_board(board, ROW, COL);
		//电脑下棋
		computer_board(board, ROW, COL);
		//print_board(board, ROW, COL);
		//判断输赢
		//玩家赢返回*
		//电脑赢返回#
		//平局返回p
		//继续返回j
		print_board(board, ROW, COL);
		if (win(board, ROW, COL) == '*')
		{
			printf("玩家赢!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == '#')
		{
			printf("电脑赢!!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == 'p')
		{
			printf("你真的菜,平局!!!!\n");
			break;
		}
		else
			printf("请再次下棋!!!\n");

	}
	

}

3,创建棋盘

假设玩家下棋为*,电脑下棋为#,未下棋的地方为空格表示。需要数据未char类型的

棋盘需要一个3*3的二维数组来表示

char board[ROW][COL] = { ' ' };

注意这里的 ROW  和 COL  这里是自定义的宏变量。

1,提高了代码的兼容性,例如:更改 ROW和COL就可以直接更改棋盘。

2,方便理解,提高了可读性,见到ROW就可以认为是棋盘的行,COL就是列。

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

#define ROW 3
#define COL 3

4,初始化棋盘

下棋时数组中的元素应该是   ’空格‘ ,这里就是一个简单的双循环。

下面是具体实现。

//初始化棋盘
void init_board(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] = ' ';
		}
	}
}

5,打印棋盘并美化棋盘

我们在打印时候由于数组的数据都是空格我们看不到。

所以要加一些线条,组成方格的棋盘,美化一下。

这里用到了一些循环和判断相互嵌套。

void print_board(char board[ROW][COL], int row, int col)
{
	for (int 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 z = 0; z < col; z++)//这个循环分割行
			{
				printf("---");
				if (z < col - 1)//同样最后一个|也不要
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}

}

6,玩家下棋

玩家下棋就是输入对应的坐标,这里注意要先判断坐标的合法性,还要判断这个点是否已经有棋子,

如果已经有棋子打印已有棋子,并让他从新输入。

如果坐标不合法,打印坐标不合法并让他重新打印。

下面是函数的具体实现。

注意循环结构

//玩家下棋
void play_board(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标:");
		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");
		}
	}
}

7,电脑下棋

我们写的代码就是简单的代码

电脑下棋就是随机下棋,这就要生成两个随机数,这里就要用到rand 和srand和time。

在主函数里面引用srand和time函数(因为这里的srand就只需要引用一次)

int  main()
{
	srand((unsigned int)time(NULL));
	test();
}

在这里对随机数%3然后加1就生成了合法的坐标,直接判断该坐标下有没有棋子就行。


//电脑下棋
void computer_board(char board[ROW][COL], int row, int col)
{
	while (1)
	{

		int x = rand() % 3 + 1;
		int y = rand() % 3 + 1;
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '#';
				break;
			}
		}
	}
}

注意写成循环结构。

8,判断输赢

每次下棋后都要判断输赢,这里判断的时候就只有四种情况,、

玩家赢返回*

电脑赢返回#

平局返回p

继续返回j

下面是函数的实现

char win(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)//判断三行是否相等
	{
	if (board[i][1] == board[i][0] && board[i][0] == 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[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//
	if (board[0][0] == board[2][2] && board[2][2] == board[1][1] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}

	int count = 0;
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				count++;
			}
		}
	}
	if (count = 0)
	{
		return 'p';
	}
	else
		return 'j';

}

四,游戏函数体

void game()
{
	//创建一个棋盘数组
	char board[ROW][COL] = { ' ' };
	//初始化棋盘
	init_board(board, ROW, COL);
	//打印棋盘并美化棋盘
	print_board(board, ROW, COL);
	while (1)
	{

		//玩家下棋
		play_board(board, ROW, COL);
		//电脑下棋
		computer_board(board, ROW, COL);
		//print_board(board, ROW, COL);
		//判断输赢
		//玩家赢返回*
		//电脑赢返回#
		//平局返回p
		//继续返回j
		print_board(board, ROW, COL);
		if (win(board, ROW, COL) == '*')
		{
			printf("玩家赢!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == '#')
		{
			printf("电脑赢!!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == 'p')
		{
			printf("你真的菜,平局!!!!\n");
			break;
		}
		else
			printf("请再次下棋!!!\n");

	}
	

}

五,三个文件的具体代码

1,源.c

#include"game.h"


void menu()
{
	printf("********************************************\n");
	printf("********************************************\n");
	printf("***************   1.paly     ***************\n");
	printf("***************   0.exit     ***************\n");
	printf("********************************************\n");
}


void game()
{
	//创建一个棋盘数组
	char board[ROW][COL] = { ' ' };
	//初始化棋盘
	init_board(board, ROW, COL);
	//打印棋盘并美化棋盘
	print_board(board, ROW, COL);
	while (1)
	{

		//玩家下棋
		play_board(board, ROW, COL);
		//电脑下棋
		computer_board(board, ROW, COL);
		//print_board(board, ROW, COL);
		//判断输赢
		//玩家赢返回*
		//电脑赢返回#
		//平局返回p
		//继续返回j
		print_board(board, ROW, COL);
		if (win(board, ROW, COL) == '*')
		{
			printf("玩家赢!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == '#')
		{
			printf("电脑赢!!!!!\n");
			break;
		}
		else if (win(board, ROW, COL) == 'p')
		{
			printf("你真的菜,平局!!!!\n");
			break;
		}
		else
			printf("请再次下棋!!!\n");

	}
	

}




void test()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default :
			printf("输入错误,请重新选择!!!\n");
		}
	}while (input);
}






int  main()
{
	srand((unsigned int)time(NULL));
	test();
}

2,game.c

#include"game.h"

//初始化棋盘
void init_board(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 print_board(char board[ROW][COL], int row, int col)
{
	for (int 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 z = 0; z < col; z++)//这个循环分割行
			{
				printf("---");
				if (z < col - 1)//同样最后一个|也不要
				{
					printf("|");
				}
			}
		}
		printf("\n");
	}

}

//玩家下棋
void play_board(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	while (1)
	{
		printf("请输入坐标:");
		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_board(char board[ROW][COL], int row, int col)
{
	while (1)
	{

		int x = rand() % 3 + 1;
		int y = rand() % 3 + 1;
		if (x >= 1 && x <= row && y >= 1 && y <= col)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '#';
				break;
			}
		}
	}
}




//判断输赢
//玩家赢返回*
//电脑赢返回#
//平局返回p
//继续返回j


char win(char board[ROW][COL], int row, int col)
{
	for (int i = 0; i < row; i++)//判断三行是否相等
	{
	if (board[i][1] == board[i][0] && board[i][0] == 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[0][i] != ' ')
		{
			return board[0][i];
		}
	}
	//
	if (board[0][0] == board[2][2] && board[2][2] == board[1][1] && board[0][0] != ' ')
	{
		return board[0][0];
	}
	if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}

	int count = 0;
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (board[i][j] == ' ')
			{
				count++;
			}
		}
	}
	if (count = 0)
	{
		return 'p';
	}
	else
		return 'j';

}

3,game.h

#pragma once


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

#define ROW 3
#define COL 3

//舒适化棋盘
void init_board(char bpard[ROW][COL], int row, int col);
//打印棋盘并美化棋盘
void print_board(char board[ROW][COL], int row, int col);
//玩家下棋
void play_board(char board[ROW][COL], int row, int col);
//电脑下棋
void computer_board(char board[ROW][COL], int row, int col);
//判断输赢
char win(char board[ROW][COL], int row, int col);

感谢观看!!!!!!!!!!!!!!!!!!!!!!!!!

猜你喜欢

转载自blog.csdn.net/zxf123567/article/details/123488060
今日推荐