纯c语言-五子棋

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

提示:这里可以添加本文要记录的大概内容:

改五子棋是后期改为用数据结构算法里面的顺序表来实现的,可以参考一下

可以实现三种模式,人vs人,人vs电脑,人vs人vs电脑


提示:以下是本篇文章正文内容,下面案例可供参考

一、流程

1.菜单界面

        

system("title ikun");//给窗口命名
	color(6);//字体换颜色  //目前有问题,两个弄起来会覆盖一个
	system("color e0");//给背景换色
caidan();

void caidan() {
	//system("pause");
	system("cls");
	Pos(40, 6);
	printf("1.菜单界面实现\n");
	Pos(35, 7);
	printf("******************************\n");
	Pos(35, 8);
	printf("********输入0退出游戏*********\n");
	Pos(35, 9);
	printf("********输入1(人对战人)******\n");
	Pos(35, 10);
	printf("********输入2(人对战电脑)****\n");
	Pos(35, 11);
	printf("********输入3(人对人对电脑)****\n");
	Pos(35, 12);
	printf("********输入其他奖励再来亿次**\n");
	Pos(35, 13);
	printf("******************************\n");
	Pos(35, 14);
	printf("请作出你的选择\n");
	Pos(35, 15);
}
void welcometogame() { //开始界面
	Pos(40, 12);//空出40列12行

	//system("title 贪吃蛇游戏");//??

	printf("阿祥玩五子棋");

	//Pos(40, 25);//在空40列和25行
	Pos(40, 25);//在空40列和25行

	system("pause");
	system("cls");

	Pos(40, 12);
	//printf("用↑.↓.←.→分别控制蛇的移动 \n");
	printf("欢迎来到五子棋游戏!");
	Pos(40, 25);//清空上面的内容,从这里入手
	//printf("F1 为加速,F2 为减速加速将能得到更高的分数。\n");

	Pos(40, 25);
	system("pause");
	system("cls");
}
void Pos(int x, int y) { //设置光标位置
	COORD pos;
	HANDLE hOutput;
	pos.X = x;
	pos.Y = y;
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOutput, pos);
}

void color(short x) {	//自定义函根据参数改变颜色
	if (x >= 0 && x <= 15) //参数在0-15的范围颜色
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);	//只有一个参数,改变字体颜色
	else//默认的颜色白色
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);


	//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //颜色设置
	//注:SetConsoleTextAttribute是一个API(应用程序编程接口)
}

2.创建棋盘

//棋盘的初始化
void chushihua(sqlist &L, int row, int col)


{

	//目的实现三子棋的九方格全为空的格式
	int i = 0, j = 0;
	for (i = 0; i < row; i++) {

		for (j = 0; j < col; j++) {
			L.elem->zf[i][j] = ' '; //放入空格
		}
	}
}

void dayinqp(sqlist &L, int row, int col) {
	int i = 0, j = 0;

	//3.继续优化写法
	//思路 是将%c|弄为一个组,前面再弄一个|吧 ,梅达到最后一次记得换行 ,然后在外面补一个分割行
	//printf("+---+---+---+\n");
	//这个算法可以实现格式各样的格子了
	for (j = 0; j < col; j++) { //这个在首行弄封闭

		//if (j == 0)
		//printf("|");

		printf("- %d ", j + 1);//设置行标
		//if (j < col)
		//printf("+");
	}
	printf("-\n");
	for (i = 0; i < row; i++) {
		if (i < 10) {
			printf("%d", i + 1); //在这里设置列标

		}
		if (i > 10 && i < row) {
			printf("%d ", i + 1);//弄这个为了超过10x10后对齐问题
		}

		for (j = 0; j < col; j++)

		{
			//if (j == 0) //在前面来一个竖线封
			//printf("%d", );
			//打印一行的数据

			printf(" %c ", L.elem->zf[i][j]);
			if (j < 10)
				printf("|");
			if (j >= 10 && j < col)
				printf("|");


		}
		printf("\n");

		if (i < row) {

			for (j = 0; j < col; j++) {
				if (j == 0) //前面打印 |封闭
					printf("|");


				printf("---");
				if (j < col)
					printf("+");


			}
			printf("\n");
		}


	}

}

3.玩家落子

void wanjia(sqlist L, int row, int col) {
	//1.接下来就得判断输入的坐标是否在棋盘的范围内,因为下棋的人可能不懂棋盘的范围
	//2.也得考虑 那个位置是否已经下了
	int y = 0, x = 0;
	int e = rand() % 15;
	while (1) {
		//printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
		//printf("请输入你要落棋的位置:(横纵坐标)\n");
		printf("玩家1出手\n");
		scanf("%d%d", &x, &y);
		color(e);

		if (x >= 1 && x <= row && y >= 1
		        && y <= col) { //在这里为啥要大于等于1;因为,程序员非正常人的思维,正常人不懂这个的话,肯定从1开始输入

			//判断这个位置是否为空,为空则放入棋子,若不是空,则else提醒已经有人
			if (L.elem->zf[x - 1][y - 1] == ' ') { //在这里x-1相当于x=0;也就是让x=0=x=1;对应上面的x=1;
				L.elem->zf[x - 1][y - 1] = '*';
				break;

			} else {
				printf("靓仔或者靓女,这个位置已经有人了,到别处坐坐\n");
			}

		} else
			printf("您输入的坐标并不在棋盘的范围内,请重新输入\n");
	}
	system("cls");

}

4.电脑落子

void  diannao(sqlist &L, int row, int col) {
	int x = 0;
	int y = 0;
	//printf("玩家1出手\n");
	//x=rand()%row;//磨横纵保证范围在0到2的范围
	//y=rand()%col;
	//这个范围的话已经确定了不用去判断是否超出,只需判断是否为空
	int u = rand() % 15;
	while (1) {
		//我知道为啥会卡死,因为这两个随机数放在循环外面,虽然不知道为啥要放在里面,但必须放里面才对

		x = rand() % row; //磨横纵保证范围在0到2的范围
		y = rand() % col;
		color(u);
		//printf("ok\n");//这个拿来调试看看哪步有问题
		if (L.elem->zf[x][y] == ' ') { //在这里因为是电脑操作不需要人为因此不用设置x-1形式
			L.elem->zf[x][y] = '@';
			//printf("ok\n");
			break;
			//continue;
		}
	}
	//printf("ok\n");
	//system("cls");

}

5.判断胜负

char jieju(sqlist &L, int row, int col) {
	//赢的也就是四种情况,水平,竖直,左斜,右斜,连三个
	//扩大棋盘的重要算法  要找到3个相邻的就可以赢了

	//对就行判断
	//行,其实就得从0开始循环检查一行是否有毛病
	int count = 0;
	for (int i = 0; i < row; i++ ) { //记录行

		count = 0;//何用?//用来记录连续的情况,每行的初始化,每行都要进行搜索,看看在哪里符合条件
		for (int j = 0; j < col - 1; j++) {
			if (L.elem->zf[i][j] == L.elem->zf[i][j + 1] && L.elem->zf[i][j] != ' ') { //两个子相等并且不是空格
				count++;//符合则加1
				if (count == qqq - 1) { //在这里起码两个相等,也就是count=2即为3个棋相等才会获胜
					return L.elem->zf[i][j];  //如果有两队棋子相等则返回棋子的内容,判定输赢

				}

			} else {
				//假如循环了一行下去依然没有找到三个相等的话则重新设置count=0
				count = 0;//用于一行里面的重置作用吧
			}
		}

	}
	//列列玩列的判断
	for (int i = 0; i < col; i++) {//这个代表列的意思的唔,对每一列进行判断是否有三行是连续相等的
		count = 0;
		for (int j = 0; j < row - 1; j++) {
			if (L.elem->zf[j][i] == L.elem->zf[j + 1][i] && L.elem->zf[j][i] != ' ' ) {
				count++;
				if (count == qqq - 1) { //再次进行判断是否满足两次相等
					return L.elem->zf[j][i];
				}
			} else {
				count = 0; //重置
			}

		}
	}




	//正正对对角的判断******

	for (int i = 0; i < row - 2; i++) { //正对角符合i+1和j+1,行和列都得变化,留两个空
		//int tmpi = i;
		//count=0;这个时候不能在这里重置了,要在下面,因为行和列得变化
		for (int j = 0; j < col - 2; j++) { //改变这个就是改变了一开始的正对角的路线
			//int tmpj = j;
			count = 0;
			while (1) { //在这里面相当于就是检验除了中心对角线外的其他正对角的判断
				if (L.elem->zf[i][j] == L.elem->zf[i + 1][j + 1] && L.elem->zf[i][j] != ' ' ) {
					count++;
					if (count == qqq - 1) {
						return L.elem->zf[i][j];
					} else {
						i++;
						j++;
					}
				} else {
					count = 0; //重置
					break;
				}
			}
			//j = tmpj;
		}
		//i = tmpi;
	}

	//斜对角斜对角
	//列要从最大开始查,其实两个都可以.画图就可以知道了,i>1;下面i要-1,i最小为2嘛
	for (int i = row - 1; i > 1; --i) {
		for (int j = 0; j < col - 2; j++) { //这个-2才满足3个子吧
			count = 0;
			while (1) {
				//这个i-1和j+1可以理解的,斜对角,行-1,列加1
				if (L.elem->zf[i][j] == L.elem->zf[i - 1][j + 1] && L.elem->zf[i][j] != ' ' ) {
					count++;
					if (count == qqq - 1) {

						return L.elem->zf[i][j];
					} else {
						i--;
						j++;
					}

				} else {
					count = 0;
					break;
				}

			}


		}
	}

	//判断平局
	int a = pingju(L, ROW, COL);
	if (a == 1) {
		return 'p';
	}




}


二、总代码实现

//自己敲一个
//思路
//一、问题描述
//二、基本流程
//三、步骤
//1.菜单界面
//2.创建棋盘
//3.棋盘初始化
//4.打印棋盘
//(1)简陋方法:
//(2)美观方法:
//5.玩家落子
//6.电脑落子
//7.判断胜负
//四、结果演示
//1.玩家胜利
//2.电脑胜利
//3.和棋

//一、改装
//1.改为加入数据结构算法
//1.2把数组改为栈或者顺序表这种
//1.3开始改装,定义一个顺序表,和一个存储字符类型的结构图变量,搞为二维数组
//1.4后面的改一下传参就可以了




//****2.1把电脑优化,变成强大的ai
//3.改为五子棋或者四子棋
//3.1把棋盘的大小弄更大,然后为了方便寻找位置输入坐标,在棋盘的上头和左侧都做好标记;
//3.2
//有个新思路,就是弄一个提问,问选择对战方式,1为人对人,2为人打人机

//4.扩大棋盘的大小
//4.1主改赢的函数
//4.2改的就是判断相邻的三个数才可以赢
//4.3弄一个类似于邻接矩阵的棋盘,便于玩家更好的找到坐标落棋
//4.4

//5.韦哥的想法,改为双人机对战




//********开始改装为五子棋*****
//1.棋盘的初始化不用改,打印不成问题
//2.输赢方面还是留着三子棋的输赢规则,这个要改为五子棋的玩法规则
//3.
#include <stdio.h>
//改变棋盘的大小规格
#define ROW 9//宏定义
#define COL 9//在这里弄方便后期改变 
//小bug 目前还没修好超过10行和10列的排列问题

//改变n个棋获胜的变量
#define qqq 3

#define MAXSIZE 100
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <windows.h>
#include <stdlib.h>//rand的头文件 
#include <time.h>//time头文件 
//放在主函数的上头

typedef struct {
	char zf[20][20];//类似于二维数组,用于绘制棋盘,给落子输入,重点
	int qt;
} sz;

typedef struct {
	sz *elem;//顺序表基地址,引用上面的sz结构体;
	int length;
} sqlist;

void Pos(int x, int y) { //设置光标位置
	COORD pos;
	HANDLE hOutput;
	pos.X = x;
	pos.Y = y;
	hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	SetConsoleCursorPosition(hOutput, pos);
}

void color(short x) {	//自定义函根据参数改变颜色
	if (x >= 0 && x <= 15) //参数在0-15的范围颜色
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);	//只有一个参数,改变字体颜色
	else//默认的颜色白色
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);


	//SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //颜色设置
	//注:SetConsoleTextAttribute是一个API(应用程序编程接口)
}

void welcometogame() { //开始界面
	Pos(40, 12);//空出40列12行

	//system("title 贪吃蛇游戏");//??

	printf("阿祥玩五子棋");

	//Pos(40, 25);//在空40列和25行
	Pos(40, 25);//在空40列和25行

	system("pause");
	system("cls");

	Pos(40, 12);
	//printf("用↑.↓.←.→分别控制蛇的移动 \n");
	printf("欢迎来到五子棋游戏!");
	Pos(40, 25);//清空上面的内容,从这里入手
	//printf("F1 为加速,F2 为减速加速将能得到更高的分数。\n");

	Pos(40, 25);
	system("pause");
	system("cls");
}

void gamestart() { //游戏初始化
	//system("mode con cols=100 lines=30");
	welcometogame();
}

//int  diannao(char qipan[ROW][COL],int row,int col)
void  diannao(sqlist &L, int row, int col) {
	int x = 0;
	int y = 0;
	//printf("玩家1出手\n");
	//x=rand()%row;//磨横纵保证范围在0到2的范围
	//y=rand()%col;
	//这个范围的话已经确定了不用去判断是否超出,只需判断是否为空
	int u = rand() % 15;
	while (1) {
		//我知道为啥会卡死,因为这两个随机数放在循环外面,虽然不知道为啥要放在里面,但必须放里面才对

		x = rand() % row; //磨横纵保证范围在0到2的范围
		y = rand() % col;
		color(u);
		//printf("ok\n");//这个拿来调试看看哪步有问题
		if (L.elem->zf[x][y] == ' ') { //在这里因为是电脑操作不需要人为因此不用设置x-1形式
			L.elem->zf[x][y] = '@';
			//printf("ok\n");
			break;
			//continue;
		}
	}
	//printf("ok\n");
	//system("cls");

}

//玩家2落棋
void wanjia2(sqlist &L, int row, int col) {
	//1.接下来就得判断输入的坐标是否在棋盘的范围内,因为下棋的人可能不懂棋盘的范围
	//2.也得考虑 那个位置是否已经下了
	int y = 0, x = 0;
	int t = rand() % 15;
	while (1) {
		//printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
		//printf("请输入你要落棋的位置:(横纵坐标)\n");
		scanf("%d%d", &x, &y);
		color(t);
		if (x >= 1 && x <= row && y >= 1
		        && y <= col) { //在这里为啥要大于等于1;因为,程序员非正常人的思维,正常人不懂这个的话,肯定从1开始输入
			//判断这个位置是否为空

			if (L.elem->zf[x - 1][y - 1] == ' ') { //在这里x-1相当于x=0;也就是让x=0=x=1;对应上面的x=1;
				L.elem->zf[x - 1][y - 1] = 'o';
				break;

			} else {
				printf("靓仔或者靓女,这个位置已经有人了,到别处坐坐\n");
			}

		} else
			printf("您输入的坐标并不在棋盘的范围内,请重新输入\n");
	}
	system("cls");

}

//下满了就平局
int pingju(sqlist L, int row, int col) {
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < col; j++) {
			if (L.elem->zf[i][j] == ' ')
				return 0;

		}
	}
	return 1;
}

char jieju(sqlist &L, int row, int col) {
	//赢的也就是四种情况,水平,竖直,左斜,右斜,连三个
	//扩大棋盘的重要算法  要找到3个相邻的就可以赢了

	//对就行判断
	//行,其实就得从0开始循环检查一行是否有毛病
	int count = 0;
	for (int i = 0; i < row; i++ ) { //记录行

		count = 0;//何用?//用来记录连续的情况,每行的初始化,每行都要进行搜索,看看在哪里符合条件
		for (int j = 0; j < col - 1; j++) {
			if (L.elem->zf[i][j] == L.elem->zf[i][j + 1] && L.elem->zf[i][j] != ' ') { //两个子相等并且不是空格
				count++;//符合则加1
				if (count == qqq - 1) { //在这里起码两个相等,也就是count=2即为3个棋相等才会获胜
					return L.elem->zf[i][j];  //如果有两队棋子相等则返回棋子的内容,判定输赢

				}

			} else {
				//假如循环了一行下去依然没有找到三个相等的话则重新设置count=0
				count = 0;//用于一行里面的重置作用吧
			}
		}

	}
	//列列玩列的判断
	for (int i = 0; i < col; i++) {//这个代表列的意思的唔,对每一列进行判断是否有三行是连续相等的
		count = 0;
		for (int j = 0; j < row - 1; j++) {
			if (L.elem->zf[j][i] == L.elem->zf[j + 1][i] && L.elem->zf[j][i] != ' ' ) {
				count++;
				if (count == qqq - 1) { //再次进行判断是否满足两次相等
					return L.elem->zf[j][i];
				}
			} else {
				count = 0; //重置
			}

		}
	}




	//正正对对角的判断******

	for (int i = 0; i < row - 2; i++) { //正对角符合i+1和j+1,行和列都得变化,留两个空
		//int tmpi = i;
		//count=0;这个时候不能在这里重置了,要在下面,因为行和列得变化
		for (int j = 0; j < col - 2; j++) { //改变这个就是改变了一开始的正对角的路线
			//int tmpj = j;
			count = 0;
			while (1) { //在这里面相当于就是检验除了中心对角线外的其他正对角的判断
				if (L.elem->zf[i][j] == L.elem->zf[i + 1][j + 1] && L.elem->zf[i][j] != ' ' ) {
					count++;
					if (count == qqq - 1) {
						return L.elem->zf[i][j];
					} else {
						i++;
						j++;
					}
				} else {
					count = 0; //重置
					break;
				}
			}
			//j = tmpj;
		}
		//i = tmpi;
	}

	//斜对角斜对角
	//列要从最大开始查,其实两个都可以.画图就可以知道了,i>1;下面i要-1,i最小为2嘛
	for (int i = row - 1; i > 1; --i) {
		for (int j = 0; j < col - 2; j++) { //这个-2才满足3个子吧
			count = 0;
			while (1) {
				//这个i-1和j+1可以理解的,斜对角,行-1,列加1
				if (L.elem->zf[i][j] == L.elem->zf[i - 1][j + 1] && L.elem->zf[i][j] != ' ' ) {
					count++;
					if (count == qqq - 1) {

						return L.elem->zf[i][j];
					} else {
						i--;
						j++;
					}

				} else {
					count = 0;
					break;
				}

			}


		}
	}

	//判断平局
	int a = pingju(L, ROW, COL);
	if (a == 1) {
		return 'p';
	}




}

//玩家落棋
void wanjia(sqlist L, int row, int col) {
	//1.接下来就得判断输入的坐标是否在棋盘的范围内,因为下棋的人可能不懂棋盘的范围
	//2.也得考虑 那个位置是否已经下了
	int y = 0, x = 0;
	int e = rand() % 15;
	while (1) {
		//printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
		//printf("请输入你要落棋的位置:(横纵坐标)\n");
		printf("玩家1出手\n");
		scanf("%d%d", &x, &y);
		color(e);

		if (x >= 1 && x <= row && y >= 1
		        && y <= col) { //在这里为啥要大于等于1;因为,程序员非正常人的思维,正常人不懂这个的话,肯定从1开始输入

			//判断这个位置是否为空,为空则放入棋子,若不是空,则else提醒已经有人
			if (L.elem->zf[x - 1][y - 1] == ' ') { //在这里x-1相当于x=0;也就是让x=0=x=1;对应上面的x=1;
				L.elem->zf[x - 1][y - 1] = '*';
				break;

			} else {
				printf("靓仔或者靓女,这个位置已经有人了,到别处坐坐\n");
			}

		} else
			printf("您输入的坐标并不在棋盘的范围内,请重新输入\n");
	}
	system("cls");

}

//打印棋盘
void dayinqp(sqlist &L, int row, int col) {
	int i = 0, j = 0;

	//3.继续优化写法
	//思路 是将%c|弄为一个组,前面再弄一个|吧 ,梅达到最后一次记得换行 ,然后在外面补一个分割行
	//printf("+---+---+---+\n");
	//这个算法可以实现格式各样的格子了
	for (j = 0; j < col; j++) { //这个在首行弄封闭

		//if (j == 0)
		//printf("|");

		printf("- %d ", j + 1);//设置行标
		//if (j < col)
		//printf("+");
	}
	printf("-\n");
	for (i = 0; i < row; i++) {
		if (i < 10) {
			printf("%d", i + 1); //在这里设置列标

		}
		if (i > 10 && i < row) {
			printf("%d ", i + 1);//弄这个为了超过10x10后对齐问题
		}

		for (j = 0; j < col; j++)

		{
			//if (j == 0) //在前面来一个竖线封
			//printf("%d", );
			//打印一行的数据

			printf(" %c ", L.elem->zf[i][j]);
			if (j < 10)
				printf("|");
			if (j >= 10 && j < col)
				printf("|");


		}
		printf("\n");

		if (i < row) {

			for (j = 0; j < col; j++) {
				if (j == 0) //前面打印 |封闭
					printf("|");


				printf("---");
				if (j < col)
					printf("+");


			}
			printf("\n");
		}


	}

}

//棋盘初始化,全部置空
void chushihua(sqlist &L, int row, int col)


{

	//目的实现三子棋的九方格全为空的格式
	int i = 0, j = 0;
	for (i = 0; i < row; i++) {

		for (j = 0; j < col; j++) {
			L.elem->zf[i][j] = ' '; //放入空格
		}
	}
}

void game(sqlist &L, int y) {
	//printf("%d\n", y);
	//开始弄棋盘,九宫格的样式,二维数组便于填坐标
	//printf("2.创建棋盘\n");
	//char qipan[ROW][COL] = {0}; //rou行坐标,col纵坐标..-这个用顺序表代替
	//printf("3.初始化棋盘\n");
	//system("cls");
	chushihua(L, ROW, COL);

	//printf("4.打印棋盘\n");
	dayinqp(L, ROW, COL);

	printf("玩家1落棋\n");
	printf("请在棋盘范围内落子,请勿超出范围\n");
	printf("玩家1(*) 玩家2(o) 电脑(@)\n");
	printf("请输入你要落棋的位置:(横纵坐标)\n");

	srand((unsigned int)time(0)); //这里不太明白还有加s
	char kun;
	while (1) {

		if (y == 1) {
			wanjia(L, ROW, COL);
			//打印一下现在棋盘的情况;
			//printf("目前棋盘的情况如下表:\n") ;
			dayinqp(L, ROW, COL);
			//判断输赢平,继续
			kun = jieju(L, ROW, COL) ;
			//printf("%c\n", kun);
			//printf("赢 'y'平'p'继续'j'\n");
			//printf("%d\n", y);
			if (kun == '*')
				break;
			if (kun == 'o')
				break;
			if (kun == '@')
				break;
			if (kun == 'p')
				break;


			//printf("%d\n", y);
			printf("玩家2出手\n");
			wanjia2(L, ROW, COL);
			dayinqp(L, ROW, COL);
			kun = jieju(L, ROW, COL);
			if (kun == '*')
				break;
			if (kun == 'o')
				break;
			if (kun == '@')
				break;
			if (kun == 'p')
				break;

		}

		//电脑落子,我感觉要用到库函数实现随机填充
		//确实没毛病老铁
		if (y == 2) {
			wanjia(L, ROW, COL);
			//打印一下现在棋盘的情况;

			//printf("目前棋盘的情况如下表:\n") ;
			dayinqp(L, ROW, COL);
			//判断输赢平,继续
			kun = jieju(L, ROW, COL) ;
			printf("%c\n", kun);
			//printf("赢 'y'平'p'继续'j'\n");
			//printf("%d\n", y);
			if (kun == '*')
				break;
			if (kun == 'o')
				break;
			if (kun == 'p')
				break;
			if (kun == '@')
				break;


			//printf("%d\n", y);
			system("cls");
			printf("电脑玩家出手\n");
			//目前剩四个空格电脑就会死;
			diannao(L, ROW, COL); //死在这里
			dayinqp(L, ROW, COL);
			kun = jieju(L, ROW, COL);
			if (kun == '*')
				break;
			if (kun == 'o')
				break;
			if (kun == 'p')
				break;
			if (kun == '@')
				break;

		}


		if (y == 3) {
			wanjia(L, ROW, COL);
			//打印一下现在棋盘的情况;
			//printf("目前棋盘的情况如下表:\n") ;
			dayinqp(L, ROW, COL);
			//判断输赢平,继续
			kun = jieju(L, ROW, COL) ;
			//printf("%c\n", kun);
			//printf("赢 'y'平'p'继续'j'\n");
			//printf("%d\n", y);
			if (kun == '*')
				break;
			if (kun == 'o')
				break;
			if (kun == 'p')
				break;
			if (kun == '@')
				break;
			//system("cls");
			//printf("%d\n", y);
			printf("玩家2出手\n");
			//system("cls");
			wanjia2(L, ROW, COL);
			system("cls");
			dayinqp(L, ROW, COL);
			kun = jieju(L, ROW, COL);
			if (kun == '*')
				break;
			if (kun == 'o')
				break;
			if (kun == 'p')
				break;
			if (kun == '@')
				break;


			system("cls");
			printf("电脑玩家出手\n");
			//目前剩四个空格电脑就会死;
			diannao(L, ROW, COL); //死在这里
			dayinqp(L, ROW, COL);
			kun = jieju(L, ROW, COL);
			if (kun == '*')
				break;
			if (kun == 'o')
				break;
			if (kun == 'p')
				break;
			if (kun == '@')
				break;

		}
		//判断输赢平,继续,每一步都得判断



	}

	if (kun == '*')
		printf("恭喜,玩家1,您赢了,你干嘛哎哟\n");
	if (kun == 'o')
		//printf("搞笑,连人机都玩不过,奖励回去练习两年半\n");
		printf("恭喜,玩家2,您赢了,你干嘛哎哟\n");
	if (kun == '@')
		printf("搞笑,连人机都玩不过,奖励回去练习两年半\n");
	if (kun == 'p')
		printf("恭喜,你两平手\n");
	system("pause");


}


void caidan() {
	//system("pause");
	system("cls");
	Pos(40, 6);
	printf("1.菜单界面实现\n");
	Pos(35, 7);
	printf("******************************\n");
	Pos(35, 8);
	printf("********输入0退出游戏*********\n");
	Pos(35, 9);
	printf("********输入1(人对战人)******\n");
	Pos(35, 10);
	printf("********输入2(人对战电脑)****\n");
	Pos(35, 11);
	printf("********输入3(人对人对电脑)****\n");
	Pos(35, 12);
	printf("********输入其他奖励再来亿次**\n");
	Pos(35, 13);
	printf("******************************\n");
	Pos(35, 14);
	printf("请作出你的选择\n");
	Pos(35, 15);
}

void zongxt() {
	//do..while 好处是必执行一次,也就是有一次选择;

	sqlist L;

	//初始化
	L.elem = new sz[MAXSIZE];
	L.length = 0;


	int choose ;  //在这里choose需要放在do..while上头,不然无法识别
	int i = 0;
	do {
		caidan();

		//我用switch实现

		scanf("%d", &choose);
		system("cls");
		int p = 0, q = 0, w = 0;

		switch (choose) {

			case 1:
				printf("欢迎进入人对战人模式\n");
				q = 1;//用来设置可以选择两张玩法的思路实现
				game(L, q); //开始进入游戏板块
				break;
			case 2 :
				printf("欢迎进入人对战电脑模式\n");
				p = 2; //进入然后用if判断
				game(L, p); //开始进入游戏板块
				break;
			case 3 :
				printf("欢迎进入人对战人对战电脑模式\n");
				w = 3; //进入然后用if判断
				game(L, w); //开始进入游戏板块
				break;
			case 0:
				printf("已退游戏\n");
				break;
			default :
				printf("输入错误,请重新输入,谢谢配合,不然你自己看着办\n");
				break;
		}


	} while (choose); //这里需要分号
}



int main() {
	//printf("阿祥玩三子棋\n");
	system("title ikun");//给窗口命名
	color(6);//字体换颜色  //目前有问题,两个弄起来会覆盖一个
	system("color e0");//给背景换色

	//system("color 6");
	gamestart();

	zongxt();
	printf("阿祥敲完历时两年半\n");
	//问题1.电脑玩家死循环,死在电脑玩家函数里面 ,在diannao函数已经解释明白了
	//2.结果出不来,这个第一个问题解决这个也可以了
	//3.只能是我赢,无法弄好电脑赢的情况,修改
	//想法1.双人对战
	//2.改为五子棋或者四子棋
	//system("pause");
	return 0;
}

总结

提示:这里对文章进行总结:
以上就是今天要讲的内容,本文仅仅简单介绍了五子棋的大概流程的实现,主要还是对c语言的小小运用了,对以上文章疑问或者有错误的地方可以私信或者留言哈。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值