【C语言】初学者的福利--让你可以上手的第一个小游戏(三子棋亦可为N子棋)

  作者:你我皆为凡人

 博客主页:你我皆为凡人的博客

 名言警句:时间不会为任何人停留,而事物与人,无时不刻也在变化着。每一个人,也都在不停向前!

 觉得博主文章写的不错的话,希望大家三连(✌关注,✌点赞,✌评论),多多支持一下!!

 系列作品:

 

 C语言编程刷题篇

 经典题型系列

 

 

文章目录

目录

文章目录

前言

主框架的搭建

游戏的实现

初始化棋盘

打印棋盘

玩家下棋

判断输赢

电脑下棋

判断输赢

总代码

总结


前言

初学者学习C语言,想实行第一个小游戏来检查一下自己之前所学的知识牢固不牢固,那么这个三子棋小游戏是不二人选


提示:以下是本篇文章正文内容,下面案例可供参考

主框架的搭建

1:先准备好游戏目录,规则为 1 为玩游戏 0 为退出游戏

2:打印完目录,准备输出数字,如果1,就开始游戏,如果0,就退出游戏,如果是其他返回并重新输入数字,这时候就需要循环了,因为至少需要执行一次,所以用do,while循环,条件为输入的那个数,因为如果是0,为假,直接不进去,而其他的两个可以反复

void memu()
{
	printf("*****************************\n");
	printf("************* 0 exit  *******\n");
	printf("************* 1 play  *******\n");
	printf("*****************************\n");
}
int main()
{
	 srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		memu();
		printf("请输入你的选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始我们的三子棋游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("好兄弟,选错了,重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

游戏的实现

初始化棋盘

1,需要准备一个二维数组来存放一个三乘三的棋盘

2,定义函数与参数,并且在头文件中声明

3,棋盘初始化时,需要看起来是空白的,所以把棋盘初始化为空格

void Initboard(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++)
		{
			board[i][j] = ' ';
		}
	}
}

打印棋盘

1,声明和定义打印棋盘的函数

2,棋盘可以看为两部分,数据为一部分,分隔符为一部分,打印数据时,为数据和|,如果最后一列的时候,就不需要打印|了,接下来打印分隔符与|,同上,在最后一行的时候不需要打印分隔符,打印完换行

void Displayboard(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)
		{
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");
				if(j

玩家下棋

1,玩家下棋需要输入下标,需要看坐标是否在范围之内,如果坐标合法

2,坐标合法需要看这个范围内有没有被占用,如果没有被占用则等于*

3,注意的是,输入的坐标和数组的坐标是相差的,需要减一才能相等

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

判断输赢

1,当玩家输入后需要判断一下玩家是否赢了,我们给一个判断原则,如果返回q,则平局并不再进行,如果返回c,则代表没有人赢并继续,如果返回*则玩家赢了,如果返回#则电脑赢了

2,赢的条件有三种,行三个相等,列三个相等并且两条对角线是三条相等,既然这样,那么如果相等并且不等于空格的时候则返回这个数,这个数等于*或者#

3,定义一个函数用来查看有没有满,并且没有赢则平局,规则是如果满了则返回1,如果没满则返回0

4,最后一种情况是棋盘没有满,继续的情况

int isfull(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;
}
char iswin(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];
		}
	}
	//判断列
	int j = 0;
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
		{
			return board[1][j];
		}
	}
	//判断对角线
	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 (isfull(board, row, col))
	{
		return 'q';
	}
	return 'c';
}

电脑下棋

1,当电脑下棋时,需要设置一个随机生成的数,需要用到rand与srand函数,而且生成的下标需要是行与列,那么就对行与列取模生成

2,判断坐标有没有被占用,没有就输出#

void conputermove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋:\n");
	while (1)
	{
		//生成随机数
		 x = rand() % row;
		 y = rand() % col;
		//判断有没有被占用
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}

判断输赢

1,当电脑输入后需要判断一下电脑是否赢了,我们给一个判断原则,如果返回q,则平局并不再进行,如果返回c,则代表没有人赢并继续,如果返回*则玩家赢了,如果返回#则电脑赢了

2,赢的条件有三种,行三个相等,列三个相等并且两条对角线是三条相等,既然这样,那么如果相等并且不等于空格的时候则返回这个数,这个数等于*或者#

3,定义一个函数用来查看有没有满,并且没有赢则平局,规则是如果满了则返回1,如果没满则返回0

4,最后一种情况是棋盘没有满,继续的情况

int isfull(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;
}
char iswin(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];
		}
	}
	//判断列
	int j = 0;
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
		{
			return board[1][j];
		}
	}
	//判断对角线
	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 (isfull(board, row, col))
	{
		return 'q';
	}
	return 'c';
}

总代码

主框架的实现

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void game()
{
	char ret = 0;
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	Initboard(board, ROW, COL);
	//打印棋盘
	Displayboard(board,ROW,COL);
	while (1)
	{
		//玩家下棋
		playmove(board, ROW, COL);
		//判断输赢
		ret = iswin(board,ROW,COL);
		//显示棋盘
		Displayboard(board, ROW, COL);
		if (ret != 'c')
		{
			break;
		}
		//电脑下棋
		conputermove(board, ROW, COL);
		//判断输赢
		ret = iswin(board, ROW, COL);
		//显示棋盘
		Displayboard(board, ROW, COL);
		if (ret != 'c')
		{
			break;
		}
	}
	if (ret == 'q')
	{
		printf("平局\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢了\n");
	}
	else
	{
		printf("玩家赢了\n");
	}
	Displayboard(board, ROW, COL);
}
void memu()
{
	printf("*****************************\n");
	printf("************* 0 exit  *******\n");
	printf("************* 1 play  *******\n");
	printf("*****************************\n");
}
int main()
{
	 srand((unsigned int)time(NULL));
	int input = 0;
	do
	{
		memu();
		printf("请输入你的选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("开始我们的三子棋游戏\n");
			game();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("好兄弟,选错了,重新输入\n");
			break;
		}
	} while (input);
	return 0;
}

 函数的声明-头文件

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#define ROW 3
#define COL 3
//初始化棋盘
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 conputermove(char board[ROW][COL], int row, int col);

//   q 退出
//  * 玩家赢了 
//  # 电脑赢了
//  c 继续
char iswin(char board[ROW][COL], int row, int col);

 游戏内部的实现

#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
//初始化棋盘
void Initboard(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++)
		{
			board[i][j] = ' ';
		}
	}
}
//打印棋盘
void Displayboard(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)
		{
			int j = 0;
			for (j = 0; j < col; j++)
			{
				printf("---");
				if(j\n");
		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 conputermove(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋:\n");
	while (1)
	{
		//生成随机数
		 x = rand() % row;
		 y = rand() % col;
		//判断有没有被占用
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
int isfull(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;
}
char iswin(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];
		}
	}
	//判断列
	int j = 0;
	for (j = 0; j < col; j++)
	{
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
		{
			return board[1][j];
		}
	}
	//判断对角线
	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 (isfull(board, row, col))
	{
		return 'q';
	}
	return 'c';
}

总结

这篇是对于新手可以上手实现的第一个较简单的三子棋小游戏,因为是对于新手时期的,没有进行代码优化,尽量让初学者可以看懂,并且自己来进行优化代码,比如实现N子棋的玩法,电脑太笨怎么办,总是自己赢,如何让玩家赢不了电脑,这个代码有很大的改进空间,俗话说没有笨的电脑,只有笨的程序员,优化后的代码正在构思中,实现玩家与电脑的高超对弈,敬请期待,如果觉得凡人写的还可以,请多多支持,当然了,这个是对于新手写的,大佬们肯定觉得就是菜鸟级别的,勿喷蛤,感谢各位观看!!!

你可能感兴趣的:(初阶C语言,c语言)