c语言 写一个五子棋

c语言

IsWin判赢

display 画 10 x 10 的棋盘

判断落子的坐标是否已有棋子

判断落子坐标范围是否超出范围

cpp 复制代码
// 五子棋
#include <stdio.h>
#include <stdlib.h>

// 画棋盘 10 x 10的棋盘,len为行数
void display(char map[][10], int len)
{
	system("clear");
	printf("   0 1 2 3 4 5 6 7 8 9\n");
	for (int i = 0; i < len; i++) {
		printf("%d ", i);
		for (int j = 0; j < 10; j++) {
			printf("|%c", map[i][j]);
		}
		printf("|\n");
	}
}

// 判断是否赢棋
int IsWin(char map[][10], int len, int x, int y)
{
	int xx;
	int yy;
	int saves = 0;
	int count = 1;
	// 判断是否棋盘下满
	for (int i = 0; i < len; i++) {
		for (int j = 0; j < 10; j++) {
			if (map[i][j] == ' ') {
				saves += 1;
			}
		}
	}
	if (saves == 0) {
		printf("棋盘下满,平局!\n");
		return -1;
	}
	//判断赢棋,从横、纵、斜、反斜四个方向判断
	// 横向判断
	// count == 1 是因为下面 for循环判断是从坐标的横移左一个、横移右一个开始判断的
    for (yy = y-1; yy > -1; yy--) {
		if (map[x][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	for (yy = y+1; yy < 10; yy++) {
		if (map[x][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	if (count >= 5) {
		if (map[x][y] == 'O') {
			printf("白棋赢\n");
			return 1;
		} else {
			printf("黑棋赢\n");
			return 2;
		}
	}
    count = 1;
	// 纵向判断
    for (xx = x-1; xx > -1; xx--) {
		if (map[xx][y] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	for (xx = x+1; xx < len; xx++) {
		if (map[xx][y] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	if (count >= 5) {
		if (map[x][y] == 'O') {
			printf("白棋赢\n");
			return 1;
		} else {
			printf("黑棋赢\n");
			return 2;
		}
	}
    count = 1;
	// 反斜方向判断
    for (xx = x-1,yy = y + 1; xx > -1 && yy < 10; xx--,yy++) {
		if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	for (xx= x+1,yy = y-1; xx < len && yy > -1; yy--,xx++) {
		if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	if (count >= 5) {
		if (map[x][y] == 'O') {
			printf("白棋赢\n");
			return 1;
		} else {
			printf("黑棋赢\n");
			return 2;
		}
	}
    count = 1;
	// 斜线 方向判断
    for (xx = x-1,yy = y - 1; xx > -1 && yy > -1; xx--,yy--) {
		if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	for (xx= x+1,yy = y+1; xx < len && yy < 10; yy++,xx++) {
		if (map[xx][yy] == map[x][y] && map[x][y] != ' ') {
			count += 1;
		}
	}
	if (count >= 5) {
		if (map[x][y] == 'O') {
			printf("白棋赢\n");
			return 1;
		} else {
			printf("黑棋赢\n");
			return 2;
		}
	}
	return 0;
}

int main(void)
{
	char map[10][10] = {};
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                map[i][j] = ' ';
            }
        }
	display(map, 10);
	int x = 0, y = 0,ret = -1;
	while (1) {
		while (1) {
	        printf("白旗落子\n"); // 'O'
	        printf("请输入横坐标:");
	        scanf("%d", &x);
	        printf("请输入纵坐标:");
	        scanf("%d", &y);
	        if (x >= 0 && x <= 9 && y >=0 && y <= 9) {
	            if (map[x][y] != ' ') {
		    	    printf("该坐标已落子,请重新输入坐标\n");
		    		continue;
		    	} else {
		    		map[x][y] = 'O';
	                display(map, 10);
					break;
		    	}
	        }
		    else {
		    	printf("输入坐标超出棋盘范围,请重新输入\n");
		    	continue;
		    }
		}
        ret = IsWin(map, 10, x, y);
		if (ret != 0) {
			break;
		}
		while (1) {
	        printf("黑旗落子\n"); // 'X'
	        printf("请输入横坐标:");
	        scanf("%d", &x);
	        printf("请输入纵坐标:");
	        scanf("%d", &y);
	        if (x >= 0 && x <= 9 && y >=0 && y <= 9) {
	            if (map[x][y] != ' ') {
		    	    printf("该坐标已落子,请重新输入坐标!\n");
		    		continue;
		    	} else {
		    		map[x][y] = 'X';
	                display(map, 10);
					break;
		    	}
	        }
		    else {
		    	printf("输入坐标超出棋盘范围,请重新输入!\n");
		    	continue;
		    }
		}
        ret = IsWin(map, 10, x, y);
        if (ret != 0) {
            break;
		}
	}
	return 0;
}    

     
相关推荐
凡人叶枫2 小时前
Effective C++ 条款30:透彻了解 inlining 的里里外外
linux·开发语言·c++·嵌入式开发·effective c++
noipp2 小时前
推荐题目:洛谷 P10907 [蓝桥杯 2024 国 B] 蚂蚁开会
c语言·c++·算法·编程·洛谷
学逆向的2 小时前
C++纯虚函数
开发语言·c++·网络安全
程序员二叉3 小时前
【JUC】线程池全套深度详解|参数|流程|拒绝策略|调优|异常处理
java·开发语言·jvm·算法·面试·juc
青山木3 小时前
Hot 100 --- 轮转数组
java·数据结构·算法
徐小夕3 小时前
Loop Engineering 深度解析与实战指南(全网最全)
前端·算法·github
凡人叶枫3 小时前
Effective C++ 条款22:将成员变量声明为 private
linux·开发语言·c++
北域码匠4 小时前
SHA-1算法:安全哈希原理与应用解析
算法·c#·哈希算法
努力小周4 小时前
STM32智能安防系统
c语言·stm32·单片机·嵌入式硬件·物联网·计算机网络·pcb工艺
坚果派·白晓明5 小时前
【鸿蒙PC】SDL3 移植:AtomCode Skills 4 步速通多媒体库适配
c++·华为·ai编程·harmonyos·atomcode·c/c++三方库