制作思想
不知道做什么,就做了这个小游戏。一开始觉得很简单一不小心就写了一百多行,感觉也是很有趣了。
废话不多,直接开始
程序设计
头文件
首先关于打印地图以及电脑要随机下棋,使用两个函数库
<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”);就好辣