C语言实现井字棋游戏

Rhoda ·
更新时间:2024-11-01
· 869 次阅读

本文实例为大家分享了C语言实现井字棋游戏的具体代码,供大家参考,具体内容如下

首先,我们需要一个大体的思路,先进行宏观规划,再对细节进行实现。

比如:

1、首先需要一个菜单面板作以修饰,在这个面板上,玩家可以选择进入游戏或者退出游戏。
2、需要一个游戏程序,这个是核心。

差不多就是这两个了,我们可以先把这个写下来,这样也可以方便后面使用,像这样:

void Game(); int Menu();//这里Menu之所以用int,是为了用返回值来确定是否退出游戏,并非唯一,也非最佳,读者自己尝试

为了丰富游戏内容,我们可以加入一个选项在函数Game()里,比如PVE模式、PVP模式。

void PVP(); void PVE();

接下来,我们就可以用主函数把这些东西连起来啦!如下:

int main() { int i=Menu(); if (i == 1) { Game(); } printf("再见"); return 0; }

这样就大功告成啦~~(最后哪个再见可以不要,这个代码中,笔者为了优化玩家游戏体验,加入了很多不必要的东西,读者均可以不写,主要视读者兴趣而定)

接下来我们来实现细节,先来写菜单:(如下)

int Menu() { //以下是修饰用的菜单面板 printf("##########################\n"); printf("###### #####\n"); printf("###### 1:开始游戏 #####\n"); printf("###### 2:退出游戏 #####\n"); printf("###### #####\n"); printf("##########################\n"); printf("请选择:"); //下面这个循环的目的是为了确认玩家是否输入的是“1”或者“2”,为了使系统可以稳定运行,这个很重要 int i = 0; while (1) { scanf("%d", &i); if (i == 1 || i == 2) { break; } printf("\n输入无效,请重新输入:"); } if (i == 1) return 1; return 2; }

这里我们可以看到,返回了 i ,因为我在主函数里需要借助这个返回值确定是否进入游戏~~

完成面板后,我们就要进行我们的核心部分。

函数Game()的实现

同样的,先宏观操作,根据需求来写代码。

void Game() { //首先需要一个看起来像棋盘的东西,数组是个不错的选择, //因为一般我们用‘x'和‘o'来表示两个玩家的棋子,我们这里把数组定义成char类型 char arr[3][3] = {{ ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '}}; //以下是花里胡哨的面板~~ printf("##########################\n"); printf("###### #####\n"); printf("###### 1:人机对战 #####\n"); printf("###### 2:双人对战 #####\n"); printf("###### 3:退出游戏 #####\n"); printf("###### #####\n"); printf("##########################\n"); printf("请选择:");//提示玩家输入的窗口 int choose = 0; //这个循环同样是为了优化系统的稳定,不至于被有些调皮的玩家搞崩~~ while (1) { scanf("%d", &choose); if (choose == 1 || choose == 2||choose==3) break; printf("\n输入无效,请重新输入:"); } //根据玩家的选择进入相应的模式,这里if(choose==3)的时候显然Game会运行结束,到达主函数的结束阶段,所以笔者偷了个懒,并没写这个情况~~,不过这并不影响什么。 if (choose == 1) PVE(); if (choose == 2) PVP(); }

以上都是游戏的基本流程,玩过游戏的老铁应该是烂熟与心的,没玩过也没关系~~,去玩一下就知道了,总之要搞出来一个游戏,我们总得知道玩的过程吧?

接下来实现两个模式:

先写人机吧?(这个限于笔者能力有限,写的比较啰嗦,如果读者有更好的创意,可以去自己实现~~)

void PVE() { int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} }; //胜负判别 char win = ' '; //落子的坐标定义 int i = 0; int j = 0; //打印棋盘 printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); while (1) { //玩家落子 printf("请落子:"); while (1) { scanf("%d%d", &i, &j); if (i < 3 && j < 3 && arr[i][j] == ' ') { arr[i][j] = 'x'; break; } printf("\n请重新输入:"); } printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); //判定胜负 if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'x') { win = 'x'; break; } else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'x') { win = 'x'; break; } else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'x') { win = 'x'; break; } else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'x') { win = 'x'; break; } else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'x') { win = 'x'; break; } else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') { win = '0'; break; } //电脑落子 while (1) { i = (time(0) % 3); j = ((time(0)*time(0)) % 3); if (arr[i][j] == ' ') { arr[i][j] = 'o'; break; } } printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); //判定胜负 if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'o') { win = 'o'; break; } else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'o') { win = 'o'; break; } else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'o') { win = 'o'; break; } else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'o') { win = 'o'; break; } else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'o') { win = 'o'; break; } else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') { win = '0'; break; } } if (win == 'o') { printf("\n不会吧?不会吧!不会真的有人输给人工智障吧?\n");//笔者还是个孩子,也比较调皮哈~~,不建议这么写,大家成熟些啊~ } else if (win == 'x') { printf("\n恭喜获胜!!!\n"); } else { printf("\n恭喜您与人工智障打成平手!!!\n");//捂脸~由于电脑走的棋是笔者用时间戳来随机确定的,可能真的有些人工智障. //这里如果笔者有兴趣,可以设计一个难度选择界面,通过感应周围的棋子的位置来确定,或者直接输入经验也可以,凭读者喜好决定~~ } //这里笔者考虑到再来一局的设计,觉得可以提供一些便利,于是就有了下面的递归 int re = 0; printf("##########################\n"); printf("###### #####\n"); printf("###### 1;返回菜单 #####\n"); printf("###### 2:再来一次 #####\n"); printf("###### #####\n"); printf("##########################\n"); printf("请选择:"); while (1) { scanf("%d", &re); if (re == 1 || re == 2) break; printf("\n输入违法,请重新输入:"); } if (re == 1) { re=Menu(); if (re == 1) { Game(); } } else if (re == 2) { PVE(); } }

好嘞!以同样的方式写下PVP模式,思路差不多,就不详细解释了,具体如下

void PVP() { int arr[3][3] = { { ' ',' ',' ' } ,{' ', ' ', ' '}, {' ', ' ', ' '} }; //胜负判别 char win = ' '; //落子的坐标定义 int i = 0; int j = 0; //打印棋盘 printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); while (1) { //玩家p1落子 printf("P1玩家请落子:"); while (1) { scanf("%d%d", &i, &j); if (i < 3 && j < 3 && arr[i][j] == ' ') { arr[i][j] = 'x'; break; } printf("\nP1玩家请重新输入:"); } printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); //判定胜负 if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'x') { win = 'x'; break; } else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'x') { win = 'x'; break; } else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == 'x') { win = 'x'; break; } else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'x') { win = 'x'; break; } else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'x') { win = 'x'; break; } else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'x') { win = 'x'; break; } else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') { win = '0'; break; } //玩家p2落子 printf("P2玩家请落子:"); while (1) { scanf("%d%d", &i, &j); if (i < 3 && j < 3 && arr[i][j] == ' ') { arr[i][j] = 'o'; break; } printf("\nP2玩家请重新输入:"); } printf("\n+---+---+---+\n| %c | %c | %c |", arr[0][0], arr[0][1], arr[0][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[1][0], arr[1][1], arr[1][2]); printf("\n+---+---+---+\n| %c | %c | %c |", arr[2][0], arr[2][1], arr[2][2]); printf("\n+---+---+---+\n"); //判定胜负 if (arr[0][0] == arr[0][1] && arr[0][0] == arr[0][2] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[1][0] == arr[1][1] && arr[1][0] == arr[1][2] && arr[1][0] == 'o') { win = 'o'; break; } else if (arr[2][0] == arr[2][1] && arr[2][0] == arr[2][2] && arr[2][0] == 'o') { win = 'o'; break; } else if (arr[0][0] == arr[1][0] && arr[0][0] == arr[2][0] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[0][1] == arr[1][1] && arr[0][1] == arr[2][1] && arr[0][1] == '0') { win = 'o'; break; } else if (arr[0][2] == arr[1][2] && arr[0][2] == arr[2][2] && arr[0][2] == 'o') { win = 'o'; break; } else if (arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == 'o') { win = 'o'; break; } else if (arr[0][2] == arr[1][1] && arr[0][2] == arr[2][0] && arr[0][2] == 'o') { win = 'o'; break; } else if (arr[0][0] != ' ' && arr[0][1] != ' ' && arr[0][2] != ' ' && arr[1][0] != ' ' && arr[1][1] != ' ' && arr[1][2] != ' ' && arr[2][1] != ' ' && arr[2][0] != ' ' && arr[2][2] != ' ') { win = '0'; break; } } if (win == 'o') { printf("\nP2获得胜利!!!\n"); } else if (win == 'x') { printf("\nP1获得胜利!!!\n"); } else { printf("\n平手!!!\n"); } int re = 0; printf("##########################\n"); printf("###### #####\n"); printf("###### 1;返回菜单 #####\n"); printf("###### 2:再来一次 #####\n"); printf("###### #####\n"); printf("##########################\n"); printf("请选择:"); while (1) { scanf("%d", &re); if (re == 1 || re == 2) break; printf("\n输入违法,请重新输入:"); } if (re == 1) { re = Menu(); if (re == 1) { Game(); } } else if (re == 2) { PVP(); } }

这样,所有我们设计好的细节就都被实现啦,一个完整的简单游戏就大功告成了。



井字棋 C语言

需要 登录 后方可回复, 如果你还没有账号请 注册新账号