数组的应用实例:三子棋


三子棋:(拆分部分如下)

test.c 测试游戏逻辑

game.h关于游戏相关的函数声明,符号声明 头文件的包含

game.c游戏相关函数的实现


游戏进行的过程:(4种)

1.玩家获胜--*(游戏结束)

2.电脑获胜--#(游戏结束)

3.平局--Q(游戏结束)

4.游戏继续--C

IsWin函数 用来判断游戏的状态


game.c

#include"game.h"
#include<stdio.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<col-1)
			    	printf("|");	
			}
			printf("n");	
		}
	}
}

//玩家下棋 
void PlayerMove(char board[ROW][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)
		{
			//下棋
			//判断坐标是否被占用
			if(board[x-1][y-1]==' ')
			{
				board[x-1][y-1]='*';
				break;
			} 
			else
			{
				printf("坐标被占用,请重新输入n");
			}
		}
		else
		{
			printf("坐标非法,请重新输入n");
		}
	}
}

void ComputerMove(char board[ROW][COL],int row,int col)
{
	printf("电脑走:>n");
	while(1)
	{
		int x=rand()%row;
		int y=rand()%col;
		//判断占用
		if(board[x][y]==' ') 
		{
			board[x][y]='#';
			break;
		}
}
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<ccol;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];
	}
	
	//判断平局--棋盘是否下满,满了返回1,不满返回0
	int ret=IsFull(board,row,col);
	if(ret==1)
	{
		return '0';
	} 
	 
	//继续
	return 'C';	 
}

game.h

//头文件的包含 
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//符号的定义 
#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 PlayerMove(char board[ROW][COL],int row,int col);

//电脑下棋
void ComputerMove(char board[ROW][COL],int row,int col);
 
//判断游戏是否出现输赢 
char IsWin(char board[ROW][COL],int row,int col);

test.c

#include"game.h"//引用头文件 
void menu()
{
	printf("*************************n");
	printf("*****    1.play    ******n");
	printf("*****    0.exit    ******n");
	printf("*************************n");
}
void game()
{
	//存储数据,二维数组
	char board[ROW][COL]; 
	//初始化棋盘,初始化空格
	InitBoard(board,ROW,COL);
	//打印棋盘--本质为打印数组内容 
	DisplayBoard(board,ROW,COL); 
	char ret=0;//接受游戏状态 
	while(1)
	{
		//玩家下棋
		PlayerMove(board,ROW,COL);
		DisplayBoard(board,ROW,COL);
		//判断玩家是否获胜 
		ret=IsWin(board,ROW,COL);
		if(ret!='C')
			break; 
		
		//电脑下棋 
		ComputerMove(board,ROW,COL);
		DisplayBoard(board,ROW,COL);
		//判断电脑是否获胜 
		ret=IsWin(board,ROW,COL);
		if(ret!='C')
			break;
	}
	if(ret=='*')
	{
		printf("玩家获胜n");	
	}
	else if(ret=='#')
	{
		printf("电脑获胜n");	
	}
	else
	{
		printf("平局n");	
	}
	DisplayBoard(board,ROW,COL);	
}
int main()
{
	int input=0;
	srand((unsigned int)time(NULL));
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d",&input);
		switch(input)
		{
		case 1:
			printf("三子棋游戏n");
			break;
		case 0:
			printf("退出游戏n");
			break;
		default:
			printf("选择错误,重新选择n");
			break;
		}
	}while(input);
	
} 

 

 

部分游戏界面,如上图所示 

具体思路见代码中注释所示

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>