三子棋的实现——C语言

“一名优秀的程序员,在穿越单行道时也会确认双向的来车情况。”——道格拉斯·林德(Doug Linder)


目录

一:三子棋的基本流程

二:三子棋的具体步骤

1.创建文件

2.打印菜单

3.创建棋盘

4.初始化棋盘

5.打印棋盘

6.玩家下棋

7.电脑下棋

8.判断输赢

三:三子棋的演示


一:三子棋的基本流程:

首先选择菜单——>选择开始游戏——>输入你要下棋的坐标——>如果满足每行或者每列或者对角线上的都是你的棋子,则游戏胜利。

二:三子棋的基本步骤:

1.创建文件

首先我们创建三个文件,分别为test.c,game.c,game.h  三个文件,test.c文件主要是测试逻辑,game.c game.h去实现这个三子棋,在game.h文件主要用来声明函数和定义一些常量。

 2.打印菜单

这个菜单就是我们进入游戏的界面,我们可以定义一个菜单函数,在主函数里面定义一个test()函数,将后面实现的代码全部放在里面

int main() {
	test();
	return 0;
}

 为了让我们能一直玩,这里采用了do while循环,将打印的菜单函数放在这个循环,再用switch语句来选择输入选项,是进入游戏还是退出游戏,用1来表示进入游戏,0表示退出游戏,正好while循环的条件表达式就为输入的数,为0正好循环结束。

打印菜单:

void menu() {
	printf("*****************************\n");
	printf("********   1. play     ******\n");
	printf("********   0. eixt     ******\n");
	printf("*****************************\n");
}
void test() {
	//rand函数(随机数范围0~32767)调用之前要使用srand函数 调用一次即可
	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);//可以一直玩下去,一直到输入0游戏结束

}

 3.创建棋盘:

创建棋盘就用到二维数组,我们把棋子用字符表示,所以创建一个字符数组。

char board[ROW][COL];

 在game.h文件中定义常量行和列 

//声明行和列,便于以后修改,改该头文件数据就可以了
#define ROW 3
#define COL 3

 4.初始化棋盘:

创建完毕后要对棋盘清空,初始化棋盘都为空格,再创建一个初始化棋盘函数。

init_board(board,ROW,COL);
//此函数让数组的每个元素都是空格
void init_board(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++) {
			board[i][j] = ' ';
		}
	}
}

 5.打印棋盘

初始化完毕要将这个棋盘打印在屏幕上,再创建一个打印函数。

print_board(board, ROW, COL);
void print_board(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) {
			for (j = 0; j < col; j++) {
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

 6.玩家下棋:

棋局已经布置好了,开始让电脑和玩家下棋。

player_move(board, ROW, COL);

 

//实现玩家下棋的函数
void player_move(char board[ROW][COL], int row, int col) {
	printf("玩家下棋\n");
	//因为要让玩家一直下棋,可以想到用while循环来实现
	while (1) {
		printf("请输入要下棋的坐标:\n");
		int x = 0;
		int y = 0;
		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;                         //然后通过break跳出循环
			}
			else 
			{
				printf("该坐标被占用,请重新输入:\n");
			}
		}
		else {
			printf("输入坐标非法\n");
		}
	}
}

7.电脑下棋:

computer_move(board, ROW, COL);

在这里电脑下棋是编译器随机下棋,如果追求难度的话,还可以写算法来控制电脑下棋,哈哈,这应该算智能三子棋,希望各位可以写写看。

在这里有一个点,C语言的rand()生成随机数,rand函数(随机数范围0~32767)调用之前要使用srand函数 调用一次即可。

//实现电脑下棋的函数
void computer_move(char board[ROW][COL], int row, int col) {
	//让电脑随机下棋,自己随机生成坐标
	//用rand()函数生成随机值,因为电脑行和列都要随机生成0~2之间的数字,所以让随机数对行和列取余即可
	printf("电脑下棋\n");
	int x = rand() % row;
	int y = rand() % col;
	while (1) {
		if (board[x][y] == ' ') {
			board[x][y] = '#';
			break;
		}
		
	}
}

 8.判断输赢:
在走到这一步了,首先要分析判断输赢的条件:

这时候我们再定义一个判断输赢的函数,返回值返回上图:

//玩家下一次判断输赢
		 ret=is_win(board, ROW, COL);
//判断棋盘是否满了,满了就是平局
int is_full(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 is_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] != ' ') {
			//因为条件满足三个都为同样的字符,随便返回哪一个
			return board[i][0];
		}
	}
	//判断列是否相等
	for (i = 0; i < col; i++) {
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') {
			return board[0][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];
	}
	//是否平局
	int ret = 0;
	if (ret = is_full(board,row,col) == 1) {
		return 'Q';
	}
	//游戏继续
	return 'C';
}

 最后我们将这些函数放在while循环中,让玩家一直下棋,直到游戏胜利或者平局或者游戏失败:

//while循环让玩家一直下棋
	while (1) {
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//玩家下一次判断输赢
		 ret=is_win(board, ROW, COL);
		 if (ret != 'C') {   //如果等于C,一直往下走,否则跳出循环判断谁赢了
			 break;
		 }
		//电脑下棋
		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//电脑下一次判断输赢
		if (ret != 'C') {
			break;
		}
	}
	if (ret == '#') {
		printf("电脑赢了哇哈哈哈哈,玩家你真菜\n");
	}
	else if (ret == '*') {
		printf("可以啊你赢了,靓仔\n");
	}
	else if (ret == 'Q') {
		printf("平局了没意思\n");
	}

}

 自此,整个三子棋的实现就完成了,另外重申的是,在game.h头文件中,声明了这些函数,在其他文件直接包含头文件即可/

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//声明行和列,便于以后修改,改该头文件数据就可以了
#define ROW 3
#define COL 3

//头文件声明函数
//初始化棋盘
void init_board(char board[ROW][COL], int row, int col);

//打印棋盘
void print_board(char board[ROW][COL], int row, int col);

//玩家下棋的函数
void player_move(char board[ROW][COL], int row, int col);

//电脑下棋的函数
void computer_move(char board[ROW][COL], int row, int col);

//判断输赢的条件
char is_win(char board[ROW][COL], int row, int col);

 最后来看看三子棋最终的实现效果:

 

  • 18
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 23
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值