小游戏之三子棋的实现

思路:

        要实现一个三子棋,肯定少不了一个放置子的棋盘,在这里我们可以用一个二维数组arr[3][3]当作棋盘,再通过几个函数实现棋盘之间逻辑关系,在测试时用循环判断人和电脑之间的胜负。以下是具体的过程:

首先为了增加程序的可拓展性,可改造性,我们用宏来定义棋盘的大小。

#define  ROWS    3      
#define  COLS    3  

将数组写成arr[ROWS][COLS];在以后想要改造棋盘的大小,就只需将宏定义里的行和列的大小已改就可。然后构造打印棋盘函数、电脑下棋函数,玩家下棋函数,每次下棋判断输赢,棋盘是否满再构造两个函数,最后在main()中用while循环判断结果,直到分出输赢或者平局,跳出while,

源代码主要又三个模块组成:1.头文件模块。2.函数实现模块。3.测试模块。

头文件代码:

       包含对各个函数的声明以及宏定义的棋盘大小

#ifndef  __GAME_H__  
#define  __GAME_H__  

#define  _CRT_SECURE_NO_WARNINGS  1  
#define  ROWS    3      
#define  COLS    3        
#include<stdio.h>    
#include<stdlib.h>    
#include<time.h>  

void Init_board(int arr[ROWS][COLS]);  
void print_board(int arr[ROWS][COLS]);  
void Player_move(int arr[ROWS][COLS]);  
void Computer_move(int arr[ROWS][COLS]);
char Check(int arr[ROWS][COLS]); 
void winer(int arr[ROWS][COLS]);

#endif  

各子函数实现代码:

        包括初始化棋盘、打印棋盘、电脑下子、人下子、判断棋盘是否满和核对输赢几个函数。

#define  _CRT_SECURE_NO_WARNINGS  1  
#include <stdio.h>
#include "game.h"

void Init_board(int arr[ROWS][COLS])
{
	int rows = 0;
	int cols = 0;
	for (rows=0; rows<ROWS; rows++)
	{
		for (cols=0; cols<COLS; cols++)
		{
			arr[rows][cols] = ' ';
		}

	}
}
void print_board(int arr[ROWS][COLS])
{
	int rows = 0;
	int cols = 0;
	for(cols=0;cols<COLS;cols++)    
	{    
		printf(" %c | %c | %c \n",arr[cols][0],arr[cols][1],arr[cols][2]);   
		if(cols != 2)  
			printf("---|---|---");    
		printf("\n");    
	}   
}
int board_full(int arr[ROWS][COLS])
{    
	int rows = 0;    
	int cols = 0;    
	for (rows = 0; rows < ROWS; rows++)    
	{    
		for (cols = 0; cols <COLS; cols++)    
		{    
			if (arr[cols][rows] == ' ')    
			{    
				return 0;
			}    
		}    
	}    
	return 1;    
} 
void Computer_move(int arr[ROWS][COLS])
{
	srand((unsigned)time(NULL)); 
	printf("电脑下子:\n");
	while (board_full(arr) != 1)
	{		
		int rows = 0;
	    int cols = 0;
		rows = rand()%ROWS;
		cols = rand()%COLS;
		if (arr[rows][cols] == ' ')
		{
			arr[rows][cols] = 'X';
			break;
		}
		else    
		{    
			if (board_full(arr) == 0)    
			{    
				continue;    
			}    
			else    
			{    
				break;    
			}    
		}
	}
}
void Player_move(int arr[ROWS][COLS])
{
	int rows = 0;
	int cols = 0;
	while(board_full(arr) != 1)
	{
		printf("人下子,请输入坐标:> ");
		scanf("%d%d",&rows,&cols);
		rows--;
		cols--;
		if (arr[rows][cols] == ' ')
		{
			arr[rows][cols] ='0';
			break;
		}
		else
		{
			printf("输入错误,重新输入!!!");
			continue;
		}
	}
}

char Check(int arr[ROWS][COLS])
{
	int rows = 0;
	int ret = 0;
	   
	for (rows = 0; rows < ROWS; rows++)    //判断行和列
	{    
		if ((arr[rows][0] == arr[rows][1]) && (arr[rows][2] == arr[rows][1]))    
		{    
			return arr[rows][0];    
		}
		if ((arr[0][rows] == arr[1][rows]) && (arr[2][rows] == arr[1][rows]))    
		{    
			return arr[0][rows];    
		} 
	}   
	if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]))   //判断斜 
	{    
		return arr[0][0];    
	}    
	if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]))   //判断斜  
	{    
		return arr[0][2];    
	} 
	if (board_full(arr) == 1)    
	{    
		return 'q';    
	} 
	
	return ' ';    
}
void winer(int arr[ROWS][COLS])
{
	char ret = 0;
	ret = Check(arr);
	if (ret == 'X')
	{
		printf("电脑赢!!!\n");
	}
	if (ret == '0')
	{
		printf("玩家赢!!!\n");
	}
	if (ret == 'q')
	{
		printf("平局!!!\n");
	}

}

测试代码:逻辑显示部分

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "game.h"
void menu()
{
	printf("***************************************\n");
	printf("**********  1.play   0.exit  **********\n");
	printf("***************************************\n");
}
int main()
{
	int arr[ROWS][COLS] = {0};
	int input = 1;
	int tmp = 0;
	char ret= 0;

	while (input)
	{   menu();
		printf("请选择:>");
		scanf("%d",&input);
		Init_board(arr);
		switch(input)
		{
		case 1:
			{
			do 
			{
				print_board(arr);
				Computer_move(arr);
				print_board(arr);
				if(Check(arr) != ' ')    
				{    
					ret=Check(arr);    
					break;    
				} 
				Player_move(arr);
				print_board(arr);
				ret=Check(arr);    
					

			}while (ret == ' ');
			winer(arr);
			break;
			}
		case 0:
			break;
		}

	} 
	return 0;
}

运行截图:





总结:要实现一个简单的三子棋小游戏,只要思路清晰、逻辑明确,实现起来还是比较简单的。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值