实训引发的"井"字棋游戏制作 - C语言

制作思想

不知道做什么,就做了这个小游戏。一开始觉得很简单一不小心就写了一百多行,感觉也是很有趣了。
废话不多,直接开始

程序设计

头文件

首先关于打印地图以及电脑要随机下棋,使用两个函数库

<stdlib.h>库中的
system()函数清屏
srand()函数生成随机数种子
rand()函数生成随机数
<time.h>库中的
time()函数用于生成随机数种子

棋盘制作[地图

画一张地图

//创建初始地图
int Map[8][8] = {
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{0, 0, 0, 0, 0, 0, 0, 0},
		};

打印地图
打印地图的函数用以遍历所有地图标记
由于选择过多,因此使用打印字符函数来判断需要打印的字符
为了便于查看输入的坐标,因此在打印地图时很贴心的在左边和上边加上了行标和列标
由于要打印边框,所以注意坐标转换的问题

char ChPrint(int a)//选择打印的字符
{
	char c;
	switch (a)
	{
		case 0:c = ' ';break;//空位
		case 1:c = '+';break;//连接点
		case 2:c = '-';break;//横行
		case 3:c = '|';break;//竖杠
	}
	return c;
}

void PrintMap()//打印地图函数
{
	int j;
	system("clear");	//打印地图之前先清屏
	printf("  1 2 3\n");	//显示列标
	for (int i=0; i<7; i++)	//打印地图-行循环
	{
		if (i==1 || i==3 || i==5) printf("%d",(i+1)/2);		//打印行标
		else printf(" ");					//打印行标之间的空格
		for (j=0; j<7; j++) printf("%c",ChPrint(Map[i][j]));	//打印地图-列循环
		printf("\n");						//打印一行之后换行
	}
}

之后在主函数调用打印地图的函数
地图运行测试代码如下

#include <stdio.h>//头文件
#include <stdlib.h>//包含随机函数rand(),调用系统指令函数system()
#include <time.h>//time(NULL) 生成随机数种子

//创建初始地图
int Map[8][8] = {
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{0, 0, 0, 0, 0, 0, 0, 0},
		};

char ChPrint(int a)//选择打印的字符
{
	char c;
	switch (a)
	{
		case 0:c = ' ';break;//空位
		case 1:c = '+';break;//连接点
		case 2:c = '-';break;//横行
		case 3:c = '|';break;//竖杠
	}
	return c;
}

void PrintMap()//打印地图函数
{
	int j;
	system("clear");	//打印地图之前先清屏
	printf("  1 2 3\n");	//显示列标
	for (int i=0; i<7; i++)	//打印地图-行循环
	{
		if (i==1 || i==3 || i==5) printf("%d",(i+1)/2);		//打印行标
		else printf(" ");					//打印行标之间的空格
		for (j=0; j<7; j++) printf("%c",ChPrint(Map[i][j]));	//打印地图-列循环
		printf("\n");						//打印一行之后换行
	}
}

int main()
{
	PrintMap();//打印空地图
	return 0;
}

大家可以运行一下试试,或者自己修改对应字符使其更好看一些【我已经尽力了

开始游戏!

根据模块化程序设计的思路,定义两个函数分别表示玩家下棋和电脑下棋
玩家下棋为4,电脑下棋为5,因此在打印字符的函数中要添加判断条件

char ChPrint(int a)//选择打印的字符
{
	char c;
	switch (a)
	{
		case 0:c = ' ';break;//空位
		case 1:c = '+';break;//连接点
		case 2:c = '-';break;//横行
		case 3:c = '|';break;//竖杠
		case 4:c = 'O';break;//玩家棋子
		case 5:c = 'X';break;//电脑棋子
	}
	return c;
}

玩家下棋

要判断玩家下棋的地方是否为空由于打印边框的问题,判断时依然要注意坐标转换的问题,若果为空就下棋,若果不为空就要求重下,还要注意玩家输入的坐标是否是1-3;使用goto跳转,很简单的,不懂百度

void Player()//玩家下棋
{
	int x, y;
	PRe://重新下棋的地标
	printf("输入下棋的坐标[空格隔开]:"); scanf("%d %d",&x,&y);
	if ((x<1 || x>3)||(y<1 || y>3))//判断坐标是否合法
	{
		printf("这个位置不存在\n重新");
		goto PRe;//若不合法重下
	}
	if (Map[2*x-1][2*y-1]==4 || Map[2*x-1][2*y-1]==5)//判断要下的位置是否已经有棋
	{
		printf("这个位置已经有棋辣\n重新");
		goto PRe;//若有重下
	}
	else Map[2*x-1][2*y-1] = 4;//下棋
}

电脑下棋

电脑使用随机数来生成下棋位点,用rand()函数来生成行标和列标
依然要注意判断下的位置是否已经有棋,如果有就重新生成下棋位置

void Computer()//电脑下棋
{
	int x, y;
	CRe://重新下棋的地标
	x = rand()%3+1;//随机下棋
	y = rand()%3+1;//随机下棋
	if (Map[2*x-1][2*y-1]==4 || Map[2*x-1][2*y-1]==5) goto CRe;//若选定位置已经有棋重下
	else Map[2*x-1][2*y-1] = 5;//下棋
}

在主函数中进行游戏

使用循环使玩家和电脑轮流下棋
但要添加中止循环的条件:玩家下完之后要判断地图是否填满以及玩家是否胜利
同理,电脑下完之后也要判断地图是否填满以及电脑是否胜利

判断胜利的条件

使用一个函数来返回判断结果0 - 无胜者;1 - 玩家胜;2 - 电脑胜
硬核列出所有可能的情况然后嵌套判断胜者结果

int WhoWin()//判断胜利者
{
	int Winner = 0;

	//////////////////////第一行相同//////////////////////
	if (Map[1][1]==Map[1][3] && Map[1][1]==Map[1][5])
	{
		if (Map[1][1]==4) Winner = 1;
		else if (Map[1][1]==5) Winner = 2;
	}
	//////////////////////第二行相同//////////////////////
	else if (Map[3][1]==Map[3][3] && Map[3][1]==Map[3][5])
	{
		if (Map[3][1]==4) Winner = 1;
		else if (Map[3][1]==5) Winner = 2;
	}
	//////////////////////第三行相同//////////////////////
	else if (Map[5][1]==Map[5][3] && Map[5][1]==Map[5][5])
	{
		if (Map[5][1]==4) Winner = 1;
		else if (Map[5][1]==5) Winner = 2;
	}
	//////////////////////第一列相同//////////////////////
	else if (Map[1][1]==Map[3][1] && Map[1][1]==Map[5][1])
	{
		if (Map[1][1]==4) Winner = 1;
		else if (Map[1][1]==5) Winner = 2;
	}
	//////////////////////第二列相同//////////////////////
	else if (Map[1][3]==Map[3][3] && Map[1][3]==Map[5][3])
	{
		if (Map[1][3]==4) Winner = 1;
		else if (Map[1][3]==5) Winner = 2;
	}
	//////////////////////第三列相同//////////////////////
	else if (Map[1][5]==Map[3][5] && Map[1][5]==Map[5][5])
	{
		if (Map[1][5]==4) Winner = 1;
		else if (Map[1][5]==5) Winner = 2;
	}
	////////////////////左上到右下相同////////////////////
	else if (Map[1][1]==Map[3][3] && Map[1][1]==Map[5][5])
	{
		if (Map[1][1]==4) Winner = 1;
		else if (Map[1][1]==5) Winner = 2;
	}
	////////////////////右上到左下相同////////////////////
	else if (Map[1][5]==Map[3][3] && Map[1][5]==Map[5][1])
	{
		if (Map[1][5]==4) Winner = 1;
		else if (Map[1][5]==5) Winner = 2;
	}
	return Winner;//返回胜者序号0-无胜者,1-玩家胜,2-电脑胜
}
判断棋盘是否下满的结果

循环判断所有的位点,遇到空位就break,如果全部遍历则说明棋盘已满

int IsFull()//判断地图是否已经下满
{
	int i, j;
	for (i=1; i<6; i++)
	{
		for (j=1; j<6; j++) if (Map[i][j]==0) break;	//如果遇到有空位择不满
		if (Map[i][j]==0) break;			//跳出循环
	}
	if (i==6 && j==6) return 1;	//若循环到最后说明棋盘已经下满,返回1[true
	else return 0;			//若没有循环到最后说明有空格,棋盘未下满,返回0[false
}
游戏进行的全部代码

游戏开始前生成一个随机数种子,然后进行游戏,下一个棋判断一次游戏是否结束

//"井"字棋游戏

#include <stdio.h>//头文件
#include <stdlib.h>//包含随机函数rand(),调用系统指令函数system()
#include <time.h>//time(NULL) 生成随机数种子

//创建初始地图
int Map[8][8] = {
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{0, 0, 0, 0, 0, 0, 0, 0},
		};
		
char ChPrint(int a)//选择打印的字符
{
	char c;
	switch (a)
	{
		case 0:c = ' ';break;//空位
		case 1:c = '+';break;//连接点
		case 2:c = '-';break;//横行
		case 3:c = '|';break;//竖杠
		case 4:c = 'O';break;//玩家棋子
		case 5:c = 'X';break;//电脑棋子
	}
	return c;
}

void PrintMap()//打印地图函数
{
	int j;
	system("clear");		//打印地图之前先清屏
	printf("  1 2 3\n");	//显示列标
	for (int i=0; i<7; i++)	//打印地图-行循环
	{
		if (i==1 || i==3 || i==5) printf("%d",(i+1)/2);		//打印行标
		else printf(" ");									//打印行标之间的空格
		for (j=0; j<7; j++) printf("%c",ChPrint(Map[i][j]));//打印地图-列循环
		printf("\n");										//打印一行之后换行
	}
}

void Player()//玩家下棋
{
	int x, y;
	PRe://重新下棋的地标
	printf("输入下棋的坐标[空格隔开]:"); scanf("%d %d",&x,&y);
	if ((x<1 || x>3)||(y<1 || y>3))//判断坐标是否合法
	{
		printf("这个位置不存在\n重新");
		goto PRe;//若不合法重下
	}
	if (Map[2*x-1][2*y-1]==4 || Map[2*x-1][2*y-1]==5)//判断要下的位置是否已经有棋
	{
		printf("这个位置已经有棋辣\n重新");
		goto PRe;//若有重下
	}
	else Map[2*x-1][2*y-1] = 4;//下棋
}

void Computer()//电脑下棋
{
	int x, y;
	CRe://重新下棋的地标
	x = rand()%3+1;//随机下棋
	y = rand()%3+1;//随机下棋
	if (Map[2*x-1][2*y-1]==4 || Map[2*x-1][2*y-1]==5) goto CRe;//若选定位置已经有棋重下
	else Map[2*x-1][2*y-1] = 5;//下棋
}

int IsFull()//判断地图是否已经下满
{
	int i, j;
	for (i=1; i<6; i++)
	{
		for (j=1; j<6; j++) if (Map[i][j]==0) break;	//如果遇到有空位择不满
		if (Map[i][j]==0) break;						//跳出循环
	}
	if (i==6 && j==6) return 1;	//若循环到最后说明棋盘已经下满,返回1[true
	else return 0;					//若没有循环到最后说明有空格,棋盘未下满,返回0[false
}

int WhoWin()//判断胜利者
{
	int Winner = 0;

	//////////////////////第一行相同//////////////////////
	if (Map[1][1]==Map[1][3] && Map[1][1]==Map[1][5])
	{
		if (Map[1][1]==4) Winner = 1;
		else if (Map[1][1]==5) Winner = 2;
	}
	//////////////////////第二行相同//////////////////////
	else if (Map[3][1]==Map[3][3] && Map[3][1]==Map[3][5])
	{
		if (Map[3][1]==4) Winner = 1;
		else if (Map[3][1]==5) Winner = 2;
	}
	//////////////////////第三行相同//////////////////////
	else if (Map[5][1]==Map[5][3] && Map[5][1]==Map[5][5])
	{
		if (Map[5][1]==4) Winner = 1;
		else if (Map[5][1]==5) Winner = 2;
	}
	//////////////////////第一列相同//////////////////////
	else if (Map[1][1]==Map[3][1] && Map[1][1]==Map[5][1])
	{
		if (Map[1][1]==4) Winner = 1;
		else if (Map[1][1]==5) Winner = 2;
	}
	//////////////////////第二列相同//////////////////////
	else if (Map[1][3]==Map[3][3] && Map[1][3]==Map[5][3])
	{
		if (Map[1][3]==4) Winner = 1;
		else if (Map[1][3]==5) Winner = 2;
	}
	//////////////////////第三列相同//////////////////////
	else if (Map[1][5]==Map[3][5] && Map[1][5]==Map[5][5])
	{
		if (Map[1][5]==4) Winner = 1;
		else if (Map[1][5]==5) Winner = 2;
	}
	////////////////////左上到右下相同////////////////////
	else if (Map[1][1]==Map[3][3] && Map[1][1]==Map[5][5])
	{
		if (Map[1][1]==4) Winner = 1;
		else if (Map[1][1]==5) Winner = 2;
	}
	////////////////////右上到左下相同////////////////////
	else if (Map[1][5]==Map[3][3] && Map[1][5]==Map[5][1])
	{
		if (Map[1][5]==4) Winner = 1;
		else if (Map[1][5]==5) Winner = 2;
	}
	return Winner;//返回胜者序号0-无胜者,1-玩家胜,2-电脑胜
}

int main()
{
	srand((unsigned)time(NULL));	//生成随机数种子
	system("clear");//清屏
	PrintMap();//打印空地图
	while (1)
	{
		Player();	//玩家下棋
		PrintMap();	//打印地图
		if (IsFull() && !WhoWin()) {printf("平局\n"); break;}	//地图已满且无胜者为平局
		if (WhoWin()==1) {printf("你赢辣\n"); break;}			//玩家胜利
		Computer();	//电脑下棋
		PrintMap();	//打印地图
		if (IsFull() && !WhoWin()) {printf("平局\n"); break;}	//地图已满且无胜者为平局
		if (WhoWin()==2) {printf("你输惹\n"); break;}			//电脑胜利
	}
	return 0;
}

//H_On制作,一切解释权归H_On所有

添加决定谁先手的功能

由于每次都玩家先手好像很赖皮(无聊),所以在主函数增加一个判断,若选择电脑先手,则跳过第一回合玩家下棋即可
使用goto实现

int main()
{
	int WhoFirst;
	srand((unsigned)time(NULL));	//生成随机数种子
	system("clear");//清屏
	printf("0.玩家先手 1.电脑先手:"); scanf("%d",&WhoFirst);//指定先手
	if (WhoFirst) goto Cf;//若为电脑先手,首轮跳过玩家
	PrintMap();//打印空地图
	while (1)
	{
		Player();	//玩家下棋
		PrintMap();	//打印地图
		if (IsFull() && !WhoWin()) {printf("平局\n"); break;}	//地图已满且无胜者为平局
		if (WhoWin()==1) {printf("你赢辣\n"); break;}			//玩家胜利
		Cf://电脑先手跳转地标
		Computer();	//电脑下棋
		PrintMap();	//打印地图
		if (IsFull() && !WhoWin()) {printf("平局\n"); break;}	//地图已满且无胜者为平局
		if (WhoWin()==2) {printf("你输惹\n"); break;}			//电脑胜利
	}
	return 0;
}

添加决定是否在玩亿次的判断

有时候,玩狠多次但每次都重新运行显然很麻烦,但也未必就想一直玩,在主函数的结尾中添加判断是否要重新开始一轮游戏,使用goto实现

int main()
{
	int WhoFirst, ReFlag;
	Restart:			//重新开始游戏地标
	InitializeMap();		//初始化地图
	srand((unsigned)time(NULL));	//生成随机数种子
	system("clear");//清屏
	printf("0.玩家先手 1.电脑先手:"); scanf("%d",&WhoFirst);//指定先手
	if (WhoFirst) goto Cf;//若为电脑先手,首轮跳过玩家
	PrintMap();//打印空地图
	while (1)
	{
		Player();	//玩家下棋
		PrintMap();	//打印地图
		if (IsFull() && !WhoWin()) {printf("平局\n"); break;}	//地图已满且无胜者为平局
		if (WhoWin()==1) {printf("你赢辣\n"); break;}		//玩家胜利
		Cf://电脑先手跳转地标
		Computer();	//电脑下棋
		PrintMap();	//打印地图
		if (IsFull() && !WhoWin()) {printf("平局\n"); break;}	//地图已满且无胜者为平局
		if (WhoWin()==2) {printf("你输惹\n"); break;}		//电脑胜利
	}
	printf("1.再来一局 0.退出游戏:"); scanf("%d",&ReFlag);	//是否重新开始游戏
	if (ReFlag) goto Restart;				//若重新开始跳转到开头
	else printf("游戏结束\n");				//否则结束程序
	return 0;
}

这时候你会发现一个问题,就是地图依然会保持上一次的结果,未满继续,已满死循环
所以还需要重置地图,我们需要一个BACKUP!

//创建初始地图
int BackupMap[8][8] = {
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{0, 0, 0, 0, 0, 0, 0, 0},
		};
int Map[8][8];

void InitializeMap()//重置地图
{
	int i, j;
	for (i=0; i<8; i++) for (j=0; j<8; j++) Map[i][j] = BackupMap[i][j]; 
}

之后在修改主函数,在游戏开始之前调用一下就可以了

int main()
{
	int WhoFirst, ReFlag;
	Restart:			//重新开始游戏地标
	InitializeMap();		//初始化地图
	srand((unsigned)time(NULL));	//生成随机数种子
	system("clear");//清屏
	printf("0.玩家先手 1.电脑先手:"); scanf("%d",&WhoFirst);//指定先手
	if (WhoFirst) goto Cf;//若为电脑先手,首轮跳过玩家
	PrintMap();//打印空地图
	while (1)
	{
		Player();	//玩家下棋
		PrintMap();	//打印地图
		if (IsFull() && !WhoWin()) {printf("平局\n"); break;}	//地图已满且无胜者为平局
		if (WhoWin()==1) {printf("你赢辣\n"); break;}		//玩家胜利
		Cf://电脑先手跳转地标
		Computer();	//电脑下棋
		PrintMap();	//打印地图
		if (IsFull() && !WhoWin()) {printf("平局\n"); break;}	//地图已满且无胜者为平局
		if (WhoWin()==2) {printf("你输惹\n"); break;}		//电脑胜利
	}
	printf("1.再来一局 0.退出游戏:"); scanf("%d",&ReFlag);	//是否重新开始游戏
	if (ReFlag) goto Restart;				//若重新开始跳转到开头
	else printf("游戏结束\n");				//否则结束程序
	return 0;
}

完整代码

//"井"字棋游戏

#include <stdio.h>//头文件
#include <stdlib.h>//包含随机函数rand(),调用系统指令函数system()
#include <time.h>//time(NULL) 生成随机数种子

//创建初始地图
int BackupMap[8][8] = {
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{3, 0, 3, 0, 3, 0, 3, 0},
		{1, 2, 1, 2, 1, 2, 1, 0},
		{0, 0, 0, 0, 0, 0, 0, 0},
		};
int Map[8][8];

void InitializeMap()//重置地图
{
	int i, j;
	for (i=0; i<8; i++) for (j=0; j<8; j++) Map[i][j] = BackupMap[i][j]; 
}

char ChPrint(int a)//选择打印的字符
{
	char c;
	switch (a)
	{
		case 0:c = ' ';break;//空位
		case 1:c = '+';break;//连接点
		case 2:c = '-';break;//横行
		case 3:c = '|';break;//竖杠
		case 4:c = 'O';break;//玩家棋子
		case 5:c = 'X';break;//电脑棋子
	}
	return c;
}

void PrintMap()//打印地图函数
{
	int j;
	system("clear");	//打印地图之前先清屏
	printf("  1 2 3\n");	//显示列标
	for (int i=0; i<7; i++)	//打印地图-行循环
	{
		if (i==1 || i==3 || i==5) printf("%d",(i+1)/2);		//打印行标
		else printf(" ");					//打印行标之间的空格
		for (j=0; j<7; j++) printf("%c",ChPrint(Map[i][j]));	//打印地图-列循环
		printf("\n");						//打印一行之后换行
	}
}

void Player()//玩家下棋
{
	int x, y;
	PRe://重新下棋的地标
	printf("输入下棋的坐标[空格隔开]:"); scanf("%d %d",&x,&y);
	if ((x<1 || x>3)||(y<1 || y>3))//判断坐标是否合法
	{
		printf("这个位置不存在\n重新");
		goto PRe;//若不合法重下
	}
	if (Map[2*x-1][2*y-1]==4 || Map[2*x-1][2*y-1]==5)//判断要下的位置是否已经有棋
	{
		printf("这个位置已经有棋辣\n重新");
		goto PRe;//若有重下
	}
	else Map[2*x-1][2*y-1] = 4;//下棋
}

void Computer()//电脑下棋
{
	int x, y;
	CRe://重新下棋的地标
	x = rand()%3+1;//随机下棋
	y = rand()%3+1;//随机下棋
	if (Map[2*x-1][2*y-1]==4 || Map[2*x-1][2*y-1]==5) goto CRe;//若选定位置已经有棋重下
	else Map[2*x-1][2*y-1] = 5;//下棋
}

int IsFull()//判断地图是否已经下满
{
	int i, j;
	for (i=1; i<6; i++)
	{
		for (j=1; j<6; j++) if (Map[i][j]==0) break;	//如果遇到有空位择不满
		if (Map[i][j]==0) break;			//跳出循环
	}
	if (i==6 && j==6) return 1;	//若循环到最后说明棋盘已经下满,返回1[true
	else return 0;			//若没有循环到最后说明有空格,棋盘未下满,返回0[false
}

int WhoWin()//判断胜利者
{
	int Winner = 0;

	//////////////////////第一行相同//////////////////////
	if (Map[1][1]==Map[1][3] && Map[1][1]==Map[1][5])
	{
		if (Map[1][1]==4) Winner = 1;
		else if (Map[1][1]==5) Winner = 2;
	}
	//////////////////////第二行相同//////////////////////
	else if (Map[3][1]==Map[3][3] && Map[3][1]==Map[3][5])
	{
		if (Map[3][1]==4) Winner = 1;
		else if (Map[3][1]==5) Winner = 2;
	}
	//////////////////////第三行相同//////////////////////
	else if (Map[5][1]==Map[5][3] && Map[5][1]==Map[5][5])
	{
		if (Map[5][1]==4) Winner = 1;
		else if (Map[5][1]==5) Winner = 2;
	}
	//////////////////////第一列相同//////////////////////
	else if (Map[1][1]==Map[3][1] && Map[1][1]==Map[5][1])
	{
		if (Map[1][1]==4) Winner = 1;
		else if (Map[1][1]==5) Winner = 2;
	}
	//////////////////////第二列相同//////////////////////
	else if (Map[1][3]==Map[3][3] && Map[1][3]==Map[5][3])
	{
		if (Map[1][3]==4) Winner = 1;
		else if (Map[1][3]==5) Winner = 2;
	}
	//////////////////////第三列相同//////////////////////
	else if (Map[1][5]==Map[3][5] && Map[1][5]==Map[5][5])
	{
		if (Map[1][5]==4) Winner = 1;
		else if (Map[1][5]==5) Winner = 2;
	}
	////////////////////左上到右下相同////////////////////
	else if (Map[1][1]==Map[3][3] && Map[1][1]==Map[5][5])
	{
		if (Map[1][1]==4) Winner = 1;
		else if (Map[1][1]==5) Winner = 2;
	}
	////////////////////右上到左下相同////////////////////
	else if (Map[1][5]==Map[3][3] && Map[1][5]==Map[5][1])
	{
		if (Map[1][5]==4) Winner = 1;
		else if (Map[1][5]==5) Winner = 2;
	}
	return Winner;//返回胜者序号0-无胜者,1-玩家胜,2-电脑胜
}

int main()
{
	int WhoFirst, ReFlag;
	Restart:			//重新开始游戏地标
	InitializeMap();		//初始化地图
	srand((unsigned)time(NULL));	//生成随机数种子
	system("clear");//清屏
	printf("0.玩家先手 1.电脑先手:"); scanf("%d",&WhoFirst);//指定先手
	if (WhoFirst) goto Cf;//若为电脑先手,首轮跳过玩家
	PrintMap();//打印空地图
	while (1)
	{
		Player();	//玩家下棋
		PrintMap();	//打印地图
		if (IsFull() && !WhoWin()) {printf("平局\n"); break;}	//地图已满且无胜者为平局
		if (WhoWin()==1) {printf("你赢辣\n"); break;}		//玩家胜利
		Cf://电脑先手跳转地标
		Computer();	//电脑下棋
		PrintMap();	//打印地图
		if (IsFull() && !WhoWin()) {printf("平局\n"); break;}	//地图已满且无胜者为平局
		if (WhoWin()==2) {printf("你输惹\n"); break;}		//电脑胜利
	}
	printf("1.再来一局 0.退出游戏:"); scanf("%d",&ReFlag);	//是否重新开始游戏
	if (ReFlag) goto Restart;				//若重新开始跳转到开头
	else printf("游戏结束\n");				//否则结束程序
	return 0;
}

//H_On制作,一切解释权归H_On所有

对辣,运行环境是Linux哒,只有清屏会有问题,Windows用户只需要把system(“clear”);改成system(“cls”);就好辣

发布了17 篇原创文章 · 获赞 22 · 访问量 4480

猜你喜欢

转载自blog.csdn.net/qq_37504214/article/details/88289474