C语言小游戏-三子棋

C语言小游戏-三子棋,第1张

前言:底层实现三子棋,使用二维数组

源码地址:蒋文涛 (jiang-wentao-WelTW) - Gitee.com

首先:我们把我们所需要写的程序分为三份:头文件、函数实施、运行。这样设置的好处是高度封装,方便以后的更改等。本代码还可优化,给电脑做一些列算法,让他可以战胜人

1.头文件代码

#include 
#include 
#include 

//定义棋盘的大小
#define ROW 3
#define COL 3

//初始化地图
void initdata(char board[ROW][COL], int row ,int col);

//打印地图函数
void displayboard(char board[ROW][COL],int row,int col);

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

//电脑随机下棋 (可以进行算法优化)
void computermove(char board[ROW][COL], int row, int col);

//判断谁赢了  *人赢  #机器赢 C继续 Q 平局
char iswin(char board[ROW][COL], int row, int col);

2.主要函数实现

#define _CRT_SECURE_NO_WARNINGS 1

#include "head.h"

//遍历数组,给数组所有元素 变为 空
void initdata(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 < col - 1) 
					{
						printf("|");
					}
				
			}
			
		}
		printf("\n");
	}
}


void playermove(char board[][COL], int row, int col) 
{
	int x = 0;
	int y = 0;
	printf("玩家走:>\n");
	while (1) 
	{
		printf("请输入坐标>:");
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)//判断输入是否合法 ,玩家看来坐标为1
		{
			if (board[x - 1][y - 1] == ' ')//所有我们这里需要减一 来正确判断数组中的字符 如果为空则赋*
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else //不为空则需要重新输入
			{
				printf("已被占用");
			}
		}
		else//非法输入重新输入
		{
			printf("输入非法\n");
		}
	}
}


void computermove(char board[ROW][COL], int row, int col) 
{
	int x = 0;
	int y = 0;
	while (1)
	{
		x = rand() % 3;//使用随机数 让棋盘随机生成 x,y的坐标
		y = rand() % 3;
		if (board[x][y] == ' ') //如果数组中为空 则可赋# ,否则一致随机 直到随机到有空的位置
		{
			board[x][y] = '#';
			break;
		}
		else //当没有空的位置  电脑随机不到地方时 则跳出循环 否则会死循环
		{
			int res = isfull(board, ROW, COL);
			if (res == 1)
			{
				break;
			}
			
		}

	}
}


//遍历棋盘是否满,如果满了则返回1 没有满则返回0 给判断棋盘是否满了提供条件
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];  //*和#谁先组成一排 则先返回谁
		}
	}

	for ( 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[1][1] != ' ')
	{
		return board[1][1];
	}
	
	//判断棋盘是否满了, 没满返回C 满了返回Q
	int res = isfull(board , ROW, COL);
	if (res==0) 
	{
		return 'C';
	}
	else if (res==1)
	{
		return 'Q';
	}
}


3.主程序

#define _CRT_SECURE_NO_WARNINGS 1
#include "head.h"
void menu() 
{
	printf("*********************\n");
	printf("****** 1.play *******\n");
	printf("****** 0.exit *******\n");
	printf("*********************\n");
}

void game() 
{
	//创建一个数组存储棋盘的大小
	char board[ROW][COL];
	//打印map map初始化
	initdata(board, ROW ,COL);
	//打印棋盘
	displayboard(board,ROW,COL);
	printf("\n");

	char read;
	//开始下棋
	while (1)
	{
		//玩家下棋 每次打印一遍棋盘
		playermove(board, ROW, COL);
		system("cls");//清屏
		displayboard(board, ROW, COL);
		

		//电脑下棋
		computermove(board, ROW, COL);
		displayboard(board, ROW, COL);

		//判断是否 结束 *人赢  #机器赢 C继续 Q 平局
		read = iswin(board, ROW, COL);
		if (read != 'C')
		{
			break;
		}
	}
	//输出最终获胜 或者结果
	if (read == '*') 
	{
		printf("人赢\n");
	} else if(read == '#') 
	{
		printf("机器赢\n");
	}
	else if (read == 'Q') 
	{
		printf("平局\n");
	}
}

int main() 
{
	srand((unsigned int)time(NULL));  //生成随机数
	int input = 0;
	do 
	{
		menu();
		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;
}

 大体游玩展示:

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/921010.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存