C语言简易三子棋游戏实现

1.游戏想法图解

2.游戏框架


//游戏测试,主函数所在。逻辑框架
#include<stdio.h>

void menu()
{
	printf("##################################\n");
	printf("#####1.play#######################\n");
	printf("#####0.exit###################\n");
	printf("请选择-》\n");
}
int main()
{
	int input = 0;
	//1.想实现游戏的继续使用do while
	do
	{


		//2.再次开始游戏要出现菜单所以,菜单显示放在循环里面
		menu();
		//3.菜单打印完成,客户输入选择
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("正在为您加载游戏,请稍等\n");
			
			break;
		case 0:
			printf("游戏退出\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}

	} while (input);
	return 0;
}

本次游戏我分三个文件来写,

一个游戏测试文件test.c ,用于游戏测试,主函数所在文件

一个游戏函数实现或者封存到这个文件,负责具体游戏代码的实现:game.c

一个头文件,包含函数和公用头文件:game.h.

接下来一步一步来实现三子棋游戏版吧。

 1.游戏开始,棋盘显示。

 首先显示棋盘   a.最开始应该是个空白棋盘,下棋就是往一个棋盘格子里放入元素,如果把每一个格子看成是存储数据的格子,那么整个棋盘就可以看做一个数组,放入棋子就是往数组里放入元素
                         b.最开始的棋盘是空白和一些线条框构成,数组里该是有元素的,有元素但是看不见:空格,下棋就是用代表棋子的符号替换空格,储存在数组并打印出来,这一步棋就算是下好了。

1.创建二维数组,棋盘基础

#include"game.h"

//游戏代码,函数的实现
void menu()
{
	printf("##################################\n");
	printf("#####1.play#######################\n");
	printf("#####0.exit###################\n");
	printf("请选择-》\n");
}


void game()
{
	char arr[HANG][LIE] = { 0 };//创建棋盘初始化棋盘觉得写在这里太冗余了,不如封装一个函数
	Startbord(arr, HANG, LIE);//初始化数组

}

2.数组初始化,将数组每一个元素变为空格;

#include"game.h"

//游戏代码,函数的实现
void menu()
{
	printf("##################################\n");
	printf("#####1.play#######################\n");
	printf("#####0.exit###################\n");
	printf("请选择-》\n");
}
void Startbord( char arr[HANG][LIE], int hang, int lie)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < hang; i++)
	{
		for (j = 0; j < lie; j++)
		{
			arr[hang][lie] = ' ';
		}
	}
}

void game()
{
	char arr[HANG][LIE] = { 0 };//创建棋盘初始化棋盘觉得写在这里太冗余了,不如封装一个函数
	Startbord(arr, HANG, LIE);//初始化数组

}

3.显示棋盘(打印数组)

这是棋盘初始化的样子,实际上是打印了,但是由于都是空格我们没有办法看见。

还欠缺一些棋盘的边框该如何去体现呢?看图解。

 

 效果如下:


void Printbord(char arr[HANG][LIE],int hang,int lie)

{
	int i = 0;
	int j = 0;
	for (i = 0; i < hang; i++)
	{
		int x = 0;
		for (x = 0; x < lie; x++)
		{
			printf(" —— ");
		}
		printf("\n");

		for (j = 0; j < lie; j++)
		{
			
			printf("| %c ", arr[i][j]);
		}
		printf("|\n");
		
	}
	int y= 0;
	for (y = 0; y < lie; y++)
	{
		printf(" —— ");
	}
	printf("\n");

}

 2.玩家下棋

void Player(char arr[HANG][LIE],int hang,int lie)

{
	while (1)
	{


		//玩家输入坐标
		printf("请输入坐标:》,两个数中间有空格隔开\n");
		int i = 0;
		int j = 0;
		scanf("%d %d", &i, &j);
		//大多数玩家,都认为坐标是从1开始,所以第一个我们需要判断一下玩家输入的坐标合理不合理,是不是在范围内
		if (i > 0 && i <= hang && j > 0 && j <= lie)//考虑棋子落子的位置是不是在棋盘内部
		{
			if (arr[i - 1][j - 1] != ' ')//考虑落子这个位置是不是有对手的棋子或者自己的棋子
			{
				printf("该位已经被占了,请重新输入\n");
			}
			else
			{
				arr[i - 1][j - 1] = '*';
				//Printbord(arr, HANG, LIE);
				break;
			}
		}
		else
		{
			printf("输入不合法,请重新输入\n");
		}
		
	}

}

 3.电脑落子

电脑落子要随机,产生随机坐标,引入rand函数用法。

 电脑下棋应该是随机落子,那么意味着电脑下棋的坐标是随机的,那么电脑下标就要是随机数
调用rand函数。
我们想一下:
任何除数的余数是不是都应该小于除数才对
无论用什么数来除10,余数只可能是0~9,所以,我们这里可以这样用,
用产生的随机数除HANG,LIE就能够得到在坐标范围内的随机数了

void Computerplay(char arr[HANG][LIE], int hang, int lie)
{
	printf("现在是电脑玩家落子,请稍等\n");
	while (1)
	{


		int i = 0;//范围0~hang-1
		int j = 0;//范围0~lie-1
		i = rand() % hang;
		j = rand() % lie;

		if (arr[i][j] != ' ')//考虑落子这个位置是不是有对手的棋子或者自己的棋子
		{
			printf("该位已经被占了,请重新输入\n");
		}
		else
		{
			arr[i][j] = '#';
			//Printbord(arr, HANG, LIE);
			break;
		}
	}
}

 4.判断输赢

对于电脑和用户来说,行列对角线有自己的三个元素一样就可以结束游戏,但是也有棋盘满平局

分情况考虑。

int Isping(char arr[HANG][LIE], int hang, int lie)
{
	int i = 0;
	
	for (i = 0; i < hang; i++)
	{
		int j = 0;
		for (j = 0; j < lie; j++)
		{
			if (arr[i][j] == ' ')
			{
				return 0;//这个函数在看棋盘满了没有,如果还有空格就返回0如果没有空格了就返回1,用于判断
			}
		}
	}
	return 1;
}
char  Iswin(char arr[HANG][LIE], int hang, int lie)
{
	int i = 0;
	for (i = 0; i < hang; i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2] != ' ')
		{
			return arr[i][0];//如果一行全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
		}
	}
		
	int j = 0;
	for (j = 0; j < lie; j++)
	{
		if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')//如果一列全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
		{
			return arr[0][j];

		}
	}
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]&&arr[1][1] != ' ')//对角线,如果对角线全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
		return arr[0][0];
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')
	   return arr[1][1];
	if (Isping(arr, HANG, LIE) ==1)//如果棋盘满了就返回‘w'
	   {
		   return 'W';
	    }

	return 'r';//没有输赢也没有平局就返回’r'继续
		
}

3 ,整个项目完毕,测试效果。(完整代码展示)

1.主函数框架()


//游戏测试,主函数所在。逻辑框架
#include"game.h"





int main()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	

	//1.想实现游戏的继续使用do while
	do
	{


		//2.再次开始游戏要出现菜单所以,菜单显示放在循环里面
		menu();
		//3.菜单打印完成,客户输入选择
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("正在为您加载游戏,请稍等\n");
			game();
			//开始游戏
			// 1.首先显示棋盘   a.最开始应该是个空白棋盘,下棋就是往一个棋盘格子里放入元素,如果把每一个格子看成是存储数据的格子
			// 那么整个棋盘就可以看做一个数组,放入棋子就是往数组里放入元素
			// b.最开始的棋盘是空白和一些线条框构成,数组里该是有元素的,有元素但是看不见:空格,下棋就是用代表棋子的符号替换空格,储存在数组里
			// 并打印出来,这一步棋就算是下好了。
			// 
			// 2.棋盘好了过后就是玩家下棋了
			// 输入坐标,但是玩家的思路坐标都是从1开始,所以要判断一下玩家输入是不是合规是否合法
			// 但是也有就是玩家要下的位置被对手占了也不能1下,所以合法输入看一下有没有被占用,这里应该循环判断,然后跳出结束这个
			// 落子的过程
			// 3.电脑下棋,随机生成rand函数搭配srand使用
			// 一样判断是不是被占用
			// 4.判断输赢
			// 行
			// 列
			// 对角线
			//
			break;
		case 0:
			printf("游戏退出\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}

	} while (input);
	return 0;
}

2.函数功能实现(game.c) 

#include"game.h"

//游戏代码,函数的实现
void menu()
{
	printf("##################################\n");
	printf("#####1.play#######################\n");
	printf("#####0.exit###################\n");
	printf("请选择-》\n");
}
void Startbord( char arr[HANG][LIE], int hang, int lie)
{
	int i = 0;
	int j = 0;
	for (i = 0; i < hang; i++)
	{
		for (j = 0; j < lie; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

void Printbord(char arr[HANG][LIE],int hang,int lie)

{
	int i = 0;
	int j = 0;
	for (i = 0; i < hang; i++)
	{
		int x = 0;
		for (x = 0; x < lie; x++)
		{
			printf(" —— ");
		}
		printf("\n");

		for (j = 0; j < lie; j++)
		{
			
			printf("| %c ", arr[i][j]);
		}
		printf("|\n");
		
	}
	int y= 0;
	for (y = 0; y < lie; y++)
	{
		printf(" —— ");
	}
	printf("\n");

}
void Player(char arr[HANG][LIE],int hang,int lie)

{
	while (1)
	{


		//玩家输入坐标
		printf("请玩家输入坐标:》,两个数中间有空格隔开\n");
		int i = 0;
		int j = 0;
		scanf("%d %d", &i, &j);
		//大多数玩家,都认为坐标是从1开始,所以第一个我们需要判断一下玩家输入的坐标合理不合理,是不是在范围内
		if (i > 0 && i <= hang && j > 0 && j <= lie)//考虑棋子落子的位置是不是在棋盘内部
		{
			if (arr[i - 1][j - 1] != ' ')//考虑落子这个位置是不是有对手的棋子或者自己的棋子
			{
				printf("该位已经被占了,请重新输入\n");
			}
			else
			{
				arr[i - 1][j - 1] = '*';
				//Printbord(arr, HANG, LIE);
				break;
			}
		}
		else
		{
			printf("输入不合法,请重新输入\n");
		}
		
	}

}
void Computerplay(char arr[HANG][LIE], int hang, int lie)
{
	printf("现在是电脑玩家落子,请稍等\n");
	while (1)
	{


		int i = 0;//范围0~hang-1
		int j = 0;//范围0~lie-1
		i = rand() % hang;
		j = rand() % lie;

		if (arr[i][j] != ' ')//考虑落子这个位置是不是有对手的棋子或者自己的棋子
		{
			printf("该位已经被占了,请重新输入\n");
		}
		else
		{
			arr[i][j] = '#';
			//Printbord(arr, HANG, LIE);
			break;
		}
	}
}

int Isping(char arr[HANG][LIE], int hang, int lie)
{
	int i = 0;
	
	for (i = 0; i < hang; i++)
	{
		int j = 0;
		for (j = 0; j < lie; j++)
		{
			if (arr[i][j] == ' ')
			{
				return 0;//这个函数在看棋盘满了没有,如果还有空格就返回0如果没有空格了就返回1,用于判断
			}
		}
	}
	return 1;
}
char  Iswin(char arr[HANG][LIE], int hang, int lie)
{
	int i = 0;
	for (i = 0; i < hang; i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][2] != ' ')
		{
			return arr[i][0];//如果一行全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
		}
	}
		
	int j = 0;
	for (j = 0; j < lie; j++)
	{
		if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')//如果一列全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
		{
			return arr[0][j];

		}
	}
	if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2]&&arr[1][1] != ' ')//对角线,如果对角线全是‘*’或者‘#’,就返回判断,如果是‘*’就是用户赢了,如果是‘#’就是电脑赢了
		return arr[0][0];
	if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[0][2] != ' ')
	   return arr[1][1];
	if (Isping(arr, HANG, LIE) ==1)//如果棋盘满了就返回‘w'
	   {
		   return 'W';
	    }

	return 'r';//没有输赢也没有平局就返回’r'继续
		
}

 void game()
{
	char arr[HANG][LIE] = { 0 };//创建棋盘初始化棋盘觉得写在这里太冗余了,不如封装一个函数
	Startbord(arr, HANG, LIE);//初始化数组
	Printbord(arr, HANG, LIE);//打印数组
	char ch = 0;
	while (1)
	{
			Player(arr, HANG, LIE);
			Printbord(arr, HANG, LIE);
			ch = Iswin(arr, HANG, LIE);
			if (ch != 'r')
			    break;
			Computerplay(arr, HANG, LIE);
			Printbord(arr, HANG, LIE);
			Iswin(arr, HANG, LIE);
			ch = Iswin(arr, HANG, LIE);
			if (ch != 'r')
			   break;		
	}
	
	if (ch == '*')
	{
		printf("玩家赢了\n");
	}
	else if (ch == '#')
	{
		printf("电脑赢了\n");
	}
	else
	{
		printf("平局\n");
	}
	
}

 3.封装头文件(game.h)

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define HANG 3
#define LIE 3  //为了能够实现5子棋等,定义了宏就行修改棋盘布局

void menu();//菜单
void game();//游戏
void Startbord(char arr[HANG][LIE], int hang, int lie);//数组初始化

void Printbord(char arr[HANG][LIE], int hang, int lie);//数组打印
void Player(char arr[HANG][LIE], int hang, int lie);//玩家落子
void Computerplay(char arr[HANG][LIE], int hang, int lie);//电脑落子
char  Iswin(char arr[HANG][LIE], int hang, int lie);//判断输赢

int Isping(char arr[HANG][LIE], int hang, int lie);//判断是否平局

 以上就是本次三子棋游戏的思路和实现分享。抛转引玉,大家可以再次升级。

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值