首页 > 其他分享 >用C语言实现简单的五子棋小游戏(附上全代码以及思路讲解)

用C语言实现简单的五子棋小游戏(附上全代码以及思路讲解)

时间:2024-03-27 22:29:04浏览次数:27  
标签:int 五子棋 C语言 char 小游戏 board printf line row

目录(全代码在文末哦) 

 如果要实现五子棋,首先第一步要写一个菜单,让玩家可供选择,比如:输入’1‘,开始游戏,输入’0’,结束游戏。但是你不能只执行一次,所以要写一个do while循环,让他至少能循环一次。然后写一个switch语句,让系统来判断玩家选择的什么以此来做出相对应的动作。

void menu()
{
	printf("\n***************************\n");
	printf("********   1、PVP  ********\n");
	printf("******   0、结束游戏  *****\n");
	printf("***************************\n");

}

int main()
{
	int input = 0;
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束");
			break;
		default:
			printf("选择错误,请重新输入");
			break;
		}
	} while (input);
	return 0;
}

主函数写好之后就可以开始写具体的game()函数了。

棋子空格初始化

要想做出一个五子棋,首先要创建一个二维数组,然后初始化空格,让这些二维数组输出的都是空格。

void blank_space(char board[line][row],int lin,int ro)
{
	int i = 0, j = 0;
	for (i = 0; i < line; i++)
	{
		for (j = 0; j < row; j++)
			board[i][j] = ' ';
	}
}

char board[line][row] = { 0 };
blank_space(board,line,row);

初始化空格之后,就该创建我们的棋盘了。

棋盘

考虑到我们是五子棋,棋盘会比较大,所以有必要写一个横坐标和纵坐标,这样有利于玩家写坐标。这就产生一个问题,如果纵坐标有一位数变成两位数之后,数字占用的空间就大了,棋盘就乱了,所以我们不能把纵坐标放在左边,要放到右边。

横纵坐标解决了,就来看我们的棋盘。我们的棋盘通常是有  |  和 ---  和 空格组成。一般是这样:


发现没有,我们一行通常是由列个“|   ”和列个“|---”组成的,再利用好空格,就能做好我们的棋盘。下面是棋盘函数代码。

void chessboard(char board[line][row], int lin, int ro)
{
	int a = 0, b = 0;
	
	for (a = 0; a < row; a++)
	{
		printf(" ");
		printf("%d",a+1);
		if (a <= 10)
		{
			printf("  ");
		}
		else if (a > 11)
		{
			printf(" ");
		}
	}
	printf("\n");
	for (b = 0; b < line; b++)
	{
		
		for (a = 0; a < row; a++)
		{
			printf("| %c ", board[b][a]);
			if (a == row-1)
			{
				printf("%d", b + 1);
			}
		}
		printf("\n");
		for (a = 0; a < row; a++)
		{
			printf("|---");
		}
		printf("\n");
	}
}

棋盘照片

棋盘做好之后,我们就可以开始写玩家下棋的代码了。

玩家下棋

玩家下棋,首先要判断下的位置是否合法,如果位置不存在,那肯定不行,如果位置存在,那还要判断这个位置是否有棋子,就是是否是空格。如果不是,就返回,让玩家重新输入。

void playermove(char board[line][row], int Line, int Row)
{
	int x = 0, y = 0;
	while (1)
	{
		
		printf("请选择位置:");
		scanf("%d %d", &x, &y);
		if (x <= line && y <= row)
		{
			if (board[x-1][y-1] == ' ')
			{
				board[x-1][y-1] = '*';
				break;
			}
			else
				printf("此位置已被占用,请重新输入\n");
		}
		else
			printf("位置无效,请重新输入\n");
	}
}

在玩家下好棋子之后,再打印一下棋盘,以便游戏玩家知道游戏进行到哪一步了。

printf("玩家1下棋\n");
playermove(board, line, row);
chessboard(board, line, row);

两个玩家对战的话,就是把上面的代码再复制一遍。

下棋结束了,下面就应该来判断输赢以及是否是平局了。

判断输赢

五子棋一方胜利的条件是横着的五个连续棋子或者竖着的五个连续棋子或者斜着的五个连续棋子,但是这些棋子都不能是空格,所以我们这样写:

char iswin(char board[line][row], int Line, int Row)
{
	int a = 0, b = 0;
	for (a = 0; a < line; a++)
	{
		for (b = 0; b < row; b++)
		{
			if (board[a][b] == board[a][b + 1] && board[a][b + 1] == board[a][b + 2] && board[a][b + 2] == board[a][b + 3] && board[a][b + 3] == board[a][b + 4] && board[a][b + 3] != ' ')
				return board[a][b + 3];
			else if (board[a][b] == board[a + 1][b] && board[a + 1][b] == board[a + 2][b] && board[a + 2][b] == board[a + 3][b] && board[a + 3][b] == board[a + 4][b] && board[a + 3][b] != ' ')
				return board[a + 3][b];
			else if (board[a][b] == board[a + 1][b + 1] && board[a + 1][b + 1] == board[a + 2][b + 2] && board[a + 2][b + 2] == board[a + 3][b + 3] && board[a + 3][b + 3] == board[a + 4][b + 4] && board[a + 3][b + 3] != ' ')
				return board[a + 3][b + 3];
			else if (board[a][b] == board[a - 1][b + 1] && board[a - 1][b + 1] == board[a - 2][b + 2] && board[a - 2][b + 2] == board[a - 3][b + 3] && board[a - 3][b + 3] == board[a - 4][b + 4] && board[a - 3][b + 3] != ' ')
				return board[a - 3][b + 3];
		}
	}
}

如果有连续的五个相同棋子,让函数返回中间棋子的值,这样的话,我们就不用另外建立一个变量来判断输赢了。在这里我让玩家一下 * 棋,让玩家二下 # 棋,然后返回的时候也让函数返回这些,我们就可以直接利用返回值是 * 还是 # 来判断是玩家一赢还是玩家二赢。

char ret = iswin(board, line, row);
if (ret == '*')
{
	printf("玩家1胜利\n");
	break;
}
else if (cou==1);
{
	printf("\n平局");
	break;
}

判断平局

最后我们来判断是否是平局。

如果双方都下完了所有的地方,但是都没有赢家,就需要我们输出平局来结束游戏了。我们可以设置一个变量,让每一个玩家下一次棋,这个变量加一次,等这个变量等于五子棋的行和列的时候,如果没有任何一方胜利,那么就是平局。

int isdraw(int count)
{
	
	if (count == line * row)
		return 1;
}

else if (cou == 1);
{
	printf("\n平局");
	break;
}

全部代码

最后附上五子棋程序的全部代码

主函数

#include "game.h"

void menu()
{
	printf("\n***************************\n");
	printf("********   1、PVP  ********\n");
	printf("******   0、结束游戏  *****\n");
	printf("***************************\n");

}

void game()
{
	int count = 0;
	//初始化空格
	char board[line][row] = { 0 };
	blank_space(board,line,row);
	//初始化棋盘
	chessboard(board, line, row);
	while (1)
	{
		//玩家1下棋
		printf("玩家1下棋\n");
		playermove(board, line, row);
		chessboard(board, line, row);
		count++;
		int cou = isdraw(count);

		char ret = iswin(board, line, row);
		if (ret == '*')
		{
			printf("玩家1胜利\n");
			break;
		}
		else if (cou==1);
		{
			printf("\n平局");
			break;
		}
		//玩家2下棋
		printf("玩家2下棋\n");
		playermove_1(board, line, row);
		chessboard(board, line, row);
		count++;
		cou = isdraw(count);

		//判断输赢
		ret = iswin(board, line, row);
		 if (ret == '#')
		{
			printf("玩家2胜利\n");
			break;
		}
		else if (cou == 1);
		{
			printf("\n平局");
			break;
		}
	}
}





int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("游戏结束");
			break;
		default:
			printf("选择错误,请重新输入");
			break;
		}
	} while (input);
	return 0;
}

game.h

#include<stdio.h>

#define line 20
#define row 20

//初始化空格
void blank_space(char board[line][row], int Line, int Row);

//初始化棋盘
void chessboard(char board[line][row], int Line, int Row);

//玩家1下棋
void playermove(char board[line][row], int Line, int Row);

//玩家2下棋
void playermove_1(char board[line][row], int Line, int Row);

//判断输赢以及是否继续
char iswin(char board[line][row], int Line, int Row);

//判断是否平局
int isdraw(int count);

game.c

#include "game.h"


//初始化空格
void blank_space(char board[line][row],int lin,int ro)
{
	int i = 0, j = 0;
	for (i = 0; i < line; i++)
	{
		for (j = 0; j < row; j++)
			board[i][j] = ' ';
	}
}

//初始化棋盘
void chessboard(char board[line][row], int lin, int ro)
{
	int a = 0, b = 0;
	
	for (a = 0; a < row; a++)
	{
		printf(" ");
		printf("%d",a+1);
		if (a <= 10)
		{
			printf("  ");
		}
		else if (a > 11)
		{
			printf(" ");
		}
	}
	printf("\n");
	for (b = 0; b < line; b++)
	{
		
		for (a = 0; a < row; a++)
		{
			printf("| %c ", board[b][a]);
			if (a == row-1)
			{
				printf("%d", b + 1);
			}
		}
		printf("\n");
		for (a = 0; a < row; a++)
		{
			printf("|---");
		}
		printf("\n");
	}
}

//玩家1下棋
void playermove(char board[line][row], int Line, int Row)
{
	int x = 0, y = 0;
	while (1)
	{
		
		printf("请选择位置:");
		scanf("%d %d", &x, &y);
		if (x <= line && y <= row)
		{
			if (board[x-1][y-1] == ' ')
			{
				board[x-1][y-1] = '*';
				break;
			}
			else
				printf("此位置已被占用,请重新输入\n");
		}
		else
			printf("位置无效,请重新输入\n");
	}
}

//玩家2下棋
void playermove_1(char board[line][row], int Line, int Row)
{
	int x = 0, y = 0;
	while (1)
	{

		printf("请选择位置:");
		scanf("%d %d", &x, &y);
		if (x <= line && y <= row)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '#';
				break;
			}
			else
				printf("此位置已被占用,请重新输入\n");
		}
		else
			printf("位置无效,请重新输入\n");
	}
}


//判断输赢以及是否继续

char iswin(char board[line][row], int Line, int Row)
{
	int a = 0, b = 0;
	for (a = 0; a < line; a++)
	{
		for (b = 0; b < row; b++)
		{
			if (board[a][b] == board[a][b + 1] && board[a][b + 1] == board[a][b + 2] && board[a][b + 2] == board[a][b + 3] && board[a][b + 3] == board[a][b + 4] && board[a][b + 3] != ' ')
				return board[a][b + 3];
			else if (board[a][b] == board[a + 1][b] && board[a + 1][b] == board[a + 2][b] && board[a + 2][b] == board[a + 3][b] && board[a + 3][b] == board[a + 4][b] && board[a + 3][b] != ' ')
				return board[a + 3][b];
			else if (board[a][b] == board[a + 1][b + 1] && board[a + 1][b + 1] == board[a + 2][b + 2] && board[a + 2][b + 2] == board[a + 3][b + 3] && board[a + 3][b + 3] == board[a + 4][b + 4] && board[a + 3][b + 3] != ' ')
				return board[a + 3][b + 3];
			else if (board[a][b] == board[a - 1][b + 1] && board[a - 1][b + 1] == board[a - 2][b + 2] && board[a - 2][b + 2] == board[a - 3][b + 3] && board[a - 3][b + 3] == board[a - 4][b + 4] && board[a - 3][b + 3] != ' ')
				return board[a - 3][b + 3];
		}
	}
}

//判断是否平局
int isdraw(int count)
{
	
	if (count == line * row)
		return 1;
}

最后很感谢大家能喜欢,我也是一个刚学C语言的新手,如果有什么不对的希望大家能够指正,谢谢大家!

标签:int,五子棋,C语言,char,小游戏,board,printf,line,row
From: https://blog.csdn.net/wpzssss/article/details/137089575

相关文章

  • 从零开始学c语言(3)
    常用运算符运算方法&(按位与)  |(按位或)^(按位异或) <<(左移)>>(右移) ~(按位求反) ......
  • C语言学习之第一个C语言程序【建议收藏】
    环境搭建好了C语言学习之环境搭建【建议收藏】-CSDN博客,接下来让我们一起来用VC编写第一个C语言程序吧!保姆级教程,非常建议小白学习使用,建议收藏!第一个C语言程序 双击打开VC,然后点击新建项目:按照图上的步骤,创建新项目→点击确定引导点击下一步:应用程序设置:项目创建完成:外......
  • 数据结构——栈(C语言版)
    前言:在学习完数据结构顺序表和链表之后,其实我们就可以做很多事情了,后面的栈和队列,其实就是对前面的顺序表和链表的灵活运用,今天我们就来学习一下栈的原理和应用。准备工作:本人习惯将文件放在test.c、SeqList.c、SeqList.h三个文件中来实现,其中test.c用来放主函数,SeqList.c......
  • C语言 预处理详解
    目录前言一、预定义符号二、#define定义常量三、#define定义宏四、带有副作用的宏参数五、宏替换的规则六、宏与函数的对比七、#和##7.1#运算符7.2##运算符八、命名约定九、#undef十、命令行定义十一、条件编译十二、头文件的包含12.1头文件被包含的方式:12......
  • 网上的一个用C语言实现FFT算法
     用C语言实现FFT算法/*****************fftprograme*********************/#include"typedef.h"#include"math.h"structcompxEE(structcompxb1,structcompxb2){structcompxb3;b3.real=b1.real*b2.real-b1.imag*b2.imag;b3.imag=b1.real*b2.imag+b1.imag*b2.real;......
  • 宏定义(C语言)
    1、宏定义一个两数相乘#defineMUL(a,b)a*b代码如下:#include<stdio.h>#defineMUL(a,b)a*bintmain(){intvalue;printf("value=%d\n",MUL(2,4));return0;}2、在虚拟机中运行,利用如下命令进行屏蔽屏蔽头文件,就可以完成宏替换。gcc-Edemo.c-o......
  • 0基础 三个月掌握C语言(15)
    动态内存管理为什么要有动态内存分配我们已经掌握的内存开辟⽅式有:intval=20; //在栈空间上开辟四个字节chararr[10]={0};//在栈空间上开辟10个字节的连续空间但上述的开辟空间的⽅式有两个特点:•空间开辟⼤⼩是固定的。•数组在申明的时候,必须指定数组的......
  • C语言-实现文件操作
    0.前言:    我们知道下载东西,电脑上就会有各种的文件夹及文件里面的内容,那么文件里面的数据怎么通过编写程序来帮我们获取呢,这些文件又是怎么创建的呢?C语言给我们提供了一些可以操作文件的函数。这里我只列举了一部分操作文件的函数,使用这些函数需要引入头文件<stdlib.......
  • C语言实现游戏——三子棋
    三子棋是一种民间传统游戏,又叫九宫棋、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。今天我们就来用C语言来实现一下这个游戏游戏分解:本文采用分文件编写的模式,实......
  • 【C语言】数组(一维、二维数组的简单介绍)
    数组(Array)数组概念数组是一组相同数据类型元素的集合,属于一种简单的数据结构,从中可以得到三个有效信息数组元素是同一数据类型的变量数组存放一个或者多个数据,但是数组元素个数不能为0数组中各元素可独立作为一个基本变量使用注:数组分为一维数组和多维数组,多维数组一......