C————类似于五子棋的三子棋小游戏

    第一次写这么长的小型程序,刚开始感觉很困难,但当多次模仿并试着去写的时候你不难发现,写这样的程序,你必须在脑海中将思路缕清晰,一步便是一环,而且环环相套。在我写完这个程序后,我发现一个程序模块化是很重要的,如果一个模块出了问题,会导致整个程序出错误,所以要做到没写几个模块就测试一下,不然你会发现最后测试时会很凌乱。下面就是关于这个程序实现后的代码:

1.首先是测试项目,把你这游戏需要想到要用的子函数并一步一步连起来,便有了大体框架

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void menu1()
{
	printf("*******************************\n");
	printf("***********1.play。************\n");
	printf("***********2.exit。************\n");
	printf("*******************************\n");
}
void menu2()
{
	printf("*******************************\n");
	printf("**********1:电脑先下**********\n");
	printf("**********2:棋手先下**********\n");
	printf("*******************************\n");
}
void game()
{
	int j = 0;
	char board[ROW][COL];
	srand((unsigned int)time(NULL));
	init_board(board,ROW,COL);
	menu2();
	printf("请选择棋手先后顺续>:\n");
	scanf("%d",&j);
	switch(j)
	{
	case 1:
		display_board(board,ROW,COL);
		computer_board(board,ROW,COL);
		break;
	case 2:
		display_board(board,ROW,COL);
		player_board(board,ROW,COL);
		break;
	default:
		printf("输入错误!\n");
		break;
	}
}

int main()
{
	int i = 0;
	do
	{
		menu1();
		printf("请选择>:\n");
		scanf("%d",&i);
		switch(i)
		{
		case 1:
			game();
			break;
		case 2:
			printf("欢迎下次再玩!\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	}while(i!=2);
	return 0;
}

2.实现大体框架下的子函数,并将这些子函数在game.h中写头文件,并引用到各个c源文件中,也就是test.c   game.c中:

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

void init_board(char board[ROW][COL], int row, int col)
{
	memset(board, ' ', ROW*COL*sizeof(char));
}
void display_board(char board[ROW][COL], int row, int col)
{
	int i = 0;
	for (i = 0; i < row; i++)
	{
		printf(" %c | %c | %c \n", board[i][0], \
			board[i][1], board[i][2]);
		if (i != 2)
			printf("---|---|---\n");
	}
}
void computer_board(char board[ROW][COL], int row, int col)
{	
	srand((unsigned int)time(NULL));
	while (1)
	{	
		int x = 0; 
		int y = 0;
		x = rand() % 3;
		y = rand() % 3; 
		if (board[x][y] == ' ')
		{ 
			board[x][y] = 'X'; 
			break;
		} 
	}
	printf("电脑落的子>:\n"); 
	display_board(board, ROW, COL); 
	if (judge_win(board, ROW, COL) == 1)
		printf("你也不过如此嘛!\n"); 
	else if (judge_full(board, ROW, COL) == 3)
		printf("哈哈,这次棋逢对手喽!\n"); 
	else player_board(board, ROW, COL);
}
void player_board(char board[ROW][COL], int row, int col)
{ 
	int x = 0;
	int y = 0;
back:printf("请棋手落子>:\n"); 
	scanf("%d%d", &x, &y); 
	x = x - 1;
	y = y - 1;
	if (((x >= 0) && (x <= 2)) && ((y >= 0) && (y <= 2)))
	{ 
		if (board[x][y] == ' ')
		{ 
			board[x][y] = '0'; 
		} 
		else 
		{ 
			printf("输入错误,请重新输入!\n");
			goto back;
		} 
	} 
	else
	{ 
		printf("输入错误,请重新输入!\n"); 
		goto back; 
	}
	display_board(board, ROW, COL); 
	if (judge_win(board, ROW, COL) == 2)p
		rintf("哈哈,你真厉害,竟然被你赢了!\n");
	else if (judge_full(board, ROW, COL) == 3)printf("呵呵,平局!\n"); 
	else 
		computer_board(board, ROW, COL);
}
int judge_win(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][0]) == '0')
			return 2;
	} 
	for (i = 0; i < col; i++) //玩家列判断 
	{ 
		if ((board[0][i]) == (board[1][i]) && (board[1][i]) == (board[2][i]) && (board[0][i]) == '0')
			return 2; 
	} 
	if ((board[0][0]) == (board[1][1]) && (board[1][1]) == (board[2][2]) && (board[0][0]) == '0') 
		return 2;//玩家斜判断 
	if ((board[0][2]) == (board[1][1]) && (board[1][1]) == (board[2][0]) && (board[0][2]) == '0') return 2;
	for (i = 0; i < row; i++) //机器行判断 
	{
		if ((board[i][0]) == (board[i][1]) && (board[i][1]) == (board[i][2]) && (board[i][0]) == 'X')
			return 1;
	}
	for (i = 0; i < col; i++) //机器列判断 
	{
		if ((board[0][i]) == (board[1][i]) && (board[1][i]) == (board[2][i]) && (board[0][i]) == 'X')
			return 1;
	} 
	if ((board[0][0]) == (board[1][1]) && (board[1][1]) == (board[2][2]) && (board[0][0]) == 'X')
		return 1; //机器斜判断 
	if ((board[0][2]) == (board[1][1]) && (board[1][1]) == (board[2][0]) && (board[0][2]) == 'X') 
		return 1; 
	if(judge_full(board, ROW, COL))
		return 3;
} 
int judge_full(char board[ROW][COL],int row,int col)
{
	int x = 0;
	int y = 0;
	for(x=0;x<row;x++)
	{
		for(y=0;y<col;y++)
		if(board[x][y]==' ')
		return 0;
	}
	return 3;
}
 
3.游戏模块和测试模块既然已实现,那就得引头文件,而此时就得写我们的头文件了: 
#ifndef __GAME_H_
#define __GAME_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define  ROW   3
#define  COL   3
void init_board(char board[ROW][COL],int row,int col);
void display_board(char board[ROW][COL],int row,int col);
void player_board(char board[ROW][COL],int row,int col);
void computer_board(char board[ROW][COL],int row,int col);
int judge_win(char board[ROW][COL],int row,int col);
int judge_full(char board[ROW][COL],int row,int col);
#endif //__GAME_H_



 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值