C语言实现多子棋的设计

目录

一.思路分享(源码在最后)

1)我们首先要打印菜单,可以参考我的菜单

2)之后就是做选择了,我们需要switch来帮助判断,if也可以

3)选择游戏之后我们就要开始写游戏的细节了

4)接下来就是打印棋盘了,棋盘格式自定,行,列和胜利时的棋子数的定义建议用宏定义,可以参考我的

5) 接下来实现人下棋,实际就是给数组赋值(不为空,并且位于数组里面)

6)然后就是电脑下棋,用随机值赋值(要为空并且属于数组里面),随机值的设定可以参考我的文章

7)最后遍历一次即可判断完成

8)最后串联在一起

二.展示源码


一.思路分享(源码在最后)

首先从main函数开始

1)我们首先要打印菜单,可以参考我的菜单

void menu() {
	printf("******************\n");
	printf("***** 1.开始 *****\n");
	printf("***** 0.退出 *****\n");
	printf("******************\n");
}

因为我们可能要玩多局,所以,我们需要循坏报括它

2)之后就是做选择了,我们需要switch来帮助判断,if也可以

int choose;
	do {
		menu();
		scanf("%d", &choose);
		switch (choose) {
		case 0:
			printf("正在退出\n");
			break;
		case 1:game();
			break;
		default:
			printf("没有这个输入选项,请重新输入\n");
		}
	} while (choose);

3)选择游戏之后我们就要开始写游戏的细节了

游戏首先需要棋盘,和棋子,棋子我建议用二维数组代替,一开始用空白格填充,那我们就需要一个函数初始化函数,初始化函数只要一个循坏嵌套就行了,参数需要数组和数组大小就能实现

void init(char arr[Row][Col], int row, int col) {
	int i, j;
	for (i = 0; i < row; i++)
		for (j = 0; j < col; j++)
			arr[i][j] = ' ';
}

4)接下来就是打印棋盘了,棋盘格式自定,行,列和胜利时的棋子数的定义建议用宏定义,可以参考我的

#define Row 10//改变棋盘行数
#define Col 10//改变棋盘列数
#define Times 5//改变胜利棋子数
void menu1(char arr[Row][Col], int row, int col) {
	int i, j;
	for (j = 0; j < row; j++) {
		for (i = 0; i < col; i++) {
			printf(" %c ", arr[j][i]);
			if (i < row - 1)
				printf("|");
		}
		printf("\n");
		if(j<row-1)
			for (i = 0; i < col; i++) {
				printf("---");
				if (i < col - 1)
					printf("|");
			}
		printf("\n");
	}
}

效果如下

5) 接下来实现人下棋,实际就是给数组赋值(不为空,并且位于数组里面)

void playmove(char arr[Row][Col], int row, int col) {
	int x, y;
	while (1) {
		printf("玩家下棋->");
		scanf("%d%d", &x, &y);
		printf("\n");
		if (x < row + 1 && y < col + 1 && arr[x-1][y-1] == ' ') {
			arr[x-1][y-1] = '*';
			break;
		}
		else printf("输入错误或者输入的位置已经被下过,请重新下棋\n");
	}
}

6)然后就是电脑下棋,用随机值赋值(要为空并且属于数组里面),随机值的设定可以参考我的文章

void computermove(char arr[Row][Col], int row, int col) {
	while (1) {
		int x = rand() % row;
		int y = rand() % col;
		if (arr[x][y] == ' ') {
			arr[x][y] = '#';
			break;
		}
	}
}

因为每下一步棋电脑和人都可能赢了,所以我们每下一部棋多要判断并打印棋盘

判断代码:如果棋盘满了返回Q(平局),C(继续),*(人胜利),#(电脑胜利)

我分了六个部分判断是否有人赢

第一个部分判断是否每一行有足够相同字符

for (i = 0; i < row; i++) {
		for (j = 0, flag = 0; j < col; j++) {
			if (arr[i][j] == arr[i][count]&&arr[i][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
			}
			if (flag == times)return arr[i][j];
		}

 第二个部分检查每一列

for (i = 0; i < col; i++) {
			for (j = 0, flag = 0; j < row; j++) {
				if (arr[j][i] == arr[count][j] && arr[j][i] != ' ')
					flag++;
				else {
					flag = 0;
					count = j;
				}
				if (flag == times)return arr[i][j];
			}
		}

第三个部分

for (i=0; i < row; i++) {
		flag = 0;
		j = 0;
		count = 0;
		count1 = i;
		k = i;
		while (k < row && j < col) {
			if (arr[k][j] == arr[count1][count]&& arr[count1][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
				count1 = k;
			}
			if (flag == times)return arr[count1][count];
			k++;
			j++;
		}
	}

第四个部分

for (i = 0; i < row; i++) {
		flag = 0;
		j = 0;
		count = col-1;
		count1 = i;
		k = i;
		while (k < row && j < col) {
			if (arr[k][j] == arr[count1][count]&&arr[k][j]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
				count1 = k;
			}
			if (flag == times)return arr[count1][count];
			k++;
			j--;
		}
	}

 第五个部分

for (i = 0, j = col - 1; j > 0; j--) {
		flag = 0;
		i = 0;
		count = j;
		count1 = 0;
		k = j;
		while (k < col && i<row) {
			if (arr[i][k] == arr[count1][count]&& arr[count1][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = k;
				count1 = i;
			}
			if (flag == times)return arr[count1][count];
			k--;
			i++;
		}
	}

第六个部分

for (i = 0,j=0; j < col; j++) {
		flag = 0;
		i = 0;
		count = j;
		count1 = i;
		k = j;
		while (i < row && k < col) {
			if (arr[i][k] == arr[count1][count]&&arr[i][k]!=' ')
				flag++;
			else {
				flag = 0;
				count = k;
				count1 = i;
			}
			if (flag == times)return arr[count1][count];
			k++;
			i++;
		}
	}

7)最后遍历一次即可判断完成

for (i = 0; i < row; i++)
		for (j = 0; j < col; j++)
			if (arr[i][j] != ' ')count++;
			else break;
	if (count == row * col)return 'Q';
	else return 'C';

8)最后串联在一起

void game() {
	char c='C';
	int result = 1;
	char arr[Row][Col];
	init(arr, Row, Col);
	menu1(arr, Row, Col);
	while (c=='C') {
		playmove(arr, Row, Col);
		menu1(arr, Row, Col);
		c = iswin(arr, Row, Col, Times);
		if (c != 'C')break;
		computermove(arr, Row, Col);
		menu1(arr, Row, Col,Times);
		c = iswin(arr, Row, Col, Times);
	}
	if (c == '*')printf("玩家胜利\n");
	else if (c == '#')printf("电脑胜利\n");
	else printf("平局\n");
}

二.展示源码

#include<time.h>
#include<stdlib.h>
#include<stdio.h>
#define Row 10//改变棋盘行数
#define Col 10//改变棋盘列数
#define Times 5//改变胜利棋子数
void menu();
void game();
void init(char arr[Row][Col], int row, int col);
void menu1(char arr[Row][Col], int row, int col);
void playmove(char arr[Row][Col], int row, int col);
void computermove(char arr[Row][Col], int row, int col);
char iswin(char arr[Row][Col], int row, int col,int times);
int main() {
	srand((unsigned int)time(NULL));
	int choose;
	do {
		menu();
		scanf("%d", &choose);
		switch (choose) {
		case 0:
			printf("正在退出\n");
			break;
		case 1:game();
			break;
		default:
			printf("没有这个输入选项,请重新输入\n");
		}
	} while (choose);
	return 0;
}
void menu() {
	printf("******************\n");
	printf("***** 1.开始 *****\n");
	printf("***** 0.退出 *****\n");
	printf("******************\n");
}
void game() {
	char c='C';
	int result = 1;
	char arr[Row][Col];
	init(arr, Row, Col);
	menu1(arr, Row, Col);
	while (c=='C') {
		playmove(arr, Row, Col);
		menu1(arr, Row, Col);
		c = iswin(arr, Row, Col, Times);
		if (c != 'C')break;
		computermove(arr, Row, Col);
		menu1(arr, Row, Col,Times);
		c = iswin(arr, Row, Col, Times);
	}
	if (c == '*')printf("玩家胜利\n");
	else if (c == '#')printf("电脑胜利\n");
	else printf("平局\n");
}
void init(char arr[Row][Col], int row, int col) {
	int i, j;
	for (i = 0; i < row; i++)
		for (j = 0; j < col; j++)
			arr[i][j] = ' ';
}
void menu1(char arr[Row][Col], int row, int col) {
	int i, j;
	for (j = 0; j < row; j++) {
		for (i = 0; i < col; i++) {
			printf(" %c ", arr[j][i]);
			if (i < row - 1)
				printf("|");
		}
		printf("\n");
		if(j<row-1)
			for (i = 0; i < col; i++) {
				printf("---");
				if (i < col - 1)
					printf("|");
			}
		printf("\n");
	}
}
void playmove(char arr[Row][Col], int row, int col) {
	int x, y;
	while (1) {
		printf("玩家下棋->");
		scanf("%d%d", &x, &y);
		printf("\n");
		if (x < row + 1 && y < col + 1 && arr[x-1][y-1] == ' ') {
			arr[x-1][y-1] = '*';
			break;
		}
		else printf("输入错误或者输入的位置已经被下过,请重新下棋\n");
	}
}
void computermove(char arr[Row][Col], int row, int col) {
	while (1) {
		int x = rand() % row;
		int y = rand() % col;
		if (arr[x][y] == ' ') {
			arr[x][y] = '#';
			break;
		}
	}
}
char iswin(char arr[Row][Col], int row, int col, int times) {
	int i, flag = 0, j, count = 0, k, count1;
	for (i = 0; i < row; i++) {
		for (j = 0, flag = 0; j < col; j++) {
			if (arr[i][j] == arr[i][count]&&arr[i][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
			}
			if (flag == times)return arr[i][j];
		}
		count = 0;
		for (i = 0; i < col; i++) {
			for (j = 0, flag = 0; j < row; j++) {
				if (arr[j][i] == arr[count][j] && arr[j][i] != ' ')
					flag++;
				else {
					flag = 0;
					count = j;
				}
				if (flag == times)return arr[i][j];
			}
		}
	}
	for (i=0; i < row; i++) {
		flag = 0;
		j = 0;
		count = 0;
		count1 = i;
		k = i;
		while (k < row && j < col) {
			if (arr[k][j] == arr[count1][count]&& arr[count1][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
				count1 = k;
			}
			if (flag == times)return arr[count1][count];
			k++;
			j++;
		}
	}
	for (i = 0; i < row; i++) {
		flag = 0;
		j = 0;
		count = col-1;
		count1 = i;
		k = i;
		while (k < row && j < col) {
			if (arr[k][j] == arr[count1][count]&&arr[k][j]!=' ')
				flag++;
			else {
				flag = 0;
				count = j;
				count1 = k;
			}
			if (flag == times)return arr[count1][count];
			k++;
			j--;
		}
	}
	for (i = 0, j = col - 1; j > 0; j--) {
		flag = 0;
		i = 0;
		count = j;
		count1 = 0;
		k = j;
		while (k < col && i<row) {
			if (arr[i][k] == arr[count1][count]&& arr[count1][count]!=' ')
				flag++;
			else {
				flag = 0;
				count = k;
				count1 = i;
			}
			if (flag == times)return arr[count1][count];
			k--;
			i++;
		}
	}
	for (i = 0,j=0; j < col; j++) {
		flag = 0;
		i = 0;
		count = j;
		count1 = i;
		k = j;
		while (i < row && k < col) {
			if (arr[i][k] == arr[count1][count]&&arr[i][k]!=' ')
				flag++;
			else {
				flag = 0;
				count = k;
				count1 = i;
			}
			if (flag == times)return arr[count1][count];
			k++;
			i++;
		}
	}
	count = 0;
	for (i = 0; i < row; i++)
		for (j = 0; j < col; j++)
			if (arr[i][j] != ' ')count++;
			else break;
	if (count == row * col)return 'Q';
	else return 'C';
}

最后收工。

感谢大家的浏览,欢迎点赞收藏

猜你喜欢

转载自blog.csdn.net/m0_74316391/article/details/130546292