人工智障三子棋

简易版三子棋

三子棋原理比较简单,类似于我们常玩的五子棋,但是只要三个相同符号连在一起就可以获得胜利,由于只有9个位置,所以先手下的人有很大机率获得胜利,下面的代码就是以自己先手和电脑进行下三子棋,由于比较简易嘛,电脑就采用的是随机数的方式进行下棋,代码如下:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
#include <windows.h>
//完成三子棋游戏代码 
void init(char arry[][3], int x, int y)//初始化
{
	for (int i = 0; i < x; i++){
		for (int j = 0; j < y; j++){
			arry[i][j] = ' ';
		}
	}
}
void face(char arry[][3], int x, int y)//显示函数
{
	system("cls");
	system("title 人工智障三子棋");
	system("mode con cols=32 lines=12");//cols页面长度,lines页面高度
	printf("  | 1 | 2 | 3\n");
	for (int i = 0; i < x; i++){
		printf("--------------\n");
		printf("%d | %c | %c | %c\n", i + 1, arry[i][0], arry[i][1], arry[i][2]);
	}
}
int poslegal(char arry[][3], int x, int y)//坐标是否合法
{
	if (x>2 || x<0 || y>2 || y < 0){
		printf("您输入的位置不合法!\n");
		return 0;
	}
	if (arry[x][y] != ' '){
		printf("您输入的位置已经被占用了!\n");
		return 0;
	}
	return 1;
}
void computer(char arry[][3], int x, int y)//电脑下
{
	while (1) {
		int i = rand() % 3;//随机数模三
		int j = rand() % 3;
		if (arry[i][j] == ' ') {//有空格直接下棋,否则一直循环
			arry[i][j] = 'O';
			break;
		}
	}
}
char is_win(char arry[][3], int x, int y)//用字符判断输赢
{
	for (int i = 0; i < x; i++){//判断某一行是否连成一条线,并且里面的值不能是空
		if (arry[i][0] == arry[i][1] && arry[i][0] == arry[i][2]&&(arry[i][0]=='X'||arry[i][0]=='O'))
			return arry[i][0];
	}
	for (int i = 0; i < x; i++){//判断某一列是否连成一条线,并且里面的值不能是空
		if (arry[0][i] == arry[1][i] && arry[0][i] == arry[2][i] && (arry[0][i] == 'X' || arry[0][i] == 'O'))
			return arry[0][i];
	}
	if (arry[0][0] == arry[1][1] && arry[0][0] == arry[2][2] && (arry[1][1] == 'X' || arry[1][1] == 'O'))
		return arry[1][1];//判断正斜杠方向,并且里面的值不能是空
	if (arry[0][y - 1] == arry[1][1] && arry[1][1] == arry[x - 1][0] && (arry[1][1] == 'X' || arry[1][1] == 'O'))
		return arry[1][1];//判断反斜杠方向,并且里面的值不能是空
	return 'N';
}
int result(char arry[][3], int x, int y, int *count)//用is_win函数的结果来判断比赛结果输出
{
	(*count)--;
	char ch = is_win(arry, x, y);
	switch (ch){
	case 'X':
		printf("你赢了,真棒~~\n");
		break;
	case 'O':
		printf("你输了,真菜~~\n");
		break;
	case 'N':
		if (*count == 0) {
			printf("棋逢对手~你的智商和电脑是一样的~\n");
			break;
		}
		return 1;//还有位置返回1
	}
	return 0;//结束break,都返回的是0
}
void main()
{
	char arry[3][3];
	init(arry, 3, 3);
	int count = 9;//每走一步--
	while (1){
		face(arry, 3, 3);
		printf("请输入你要指定的位置坐标:");
		int x, y;
		scanf("%d %d", &x, &y);
		if (!poslegal(arry, x - 1, y - 1)){
			continue;
		}
		arry[x - 1][y - 1] = 'X';//自己下完之后判断输赢
		if (result(arry, 3, 3, &count) == 0) {
			break;
		}
		face(arry, 3, 3);
		Sleep(1000);
		computer(arry, 3, 3);
		face(arry, 3, 3);
		if (result(arry, 3, 3, &count) == 0) {//电脑下完之后判断输赢
			break;
		}
	}
}

代码注释的也比较详细,主要用于个人学习,望大佬们多多指点,共同进步嘛。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值