【三子棋】7.25

编程入门 行业动态 更新时间:2024-10-26 22:24:02

【<a href=https://www.elefans.com/category/jswz/34/1769974.html style=三子棋】7.25"/>

【三子棋】7.25

三子棋是喜闻乐见的娱乐游戏,这个简单过程如何代码实现呢

本文不止分享代码过程,也会详细阐述我们想要的效果如何通过简单的修改达到目的

目录

1.game.h(头文件引用

2.game.c(函数实现

3.test.c(主体运行思路

注意:1.的讲解是穿插在2.和3.之中,因为头文件的引用是根据代码决定的


 首先我们从主体思路讲起

运行游戏肯定有简单的选项菜单——>menu();

菜单里对应开始游戏/退出——>menu的实现

菜单运行结束要有函数可以读取到选项的信息并且做出反应——>main函数的实现

用到printf等基本函数——>头文件#include <stdio.h>

srand不在目前的功能里,所以他的头文件此时先忽略,他的作用在本文后一部分

上代码

void menu()
{printf("*********************\n");printf("*******1.play********\n");printf("*******0.exit********\n");printf("*********************\n");
}int main()
{srand((unsigned int)time(NULL));   //这行的作用后面会解释int n = 0;do{menu();printf("请输入数字\n");scanf("%d", &n);switch (n){case 1:{printf("游戏开始\n");game();                   //这里为游戏函数的插入break;}case 0:{printf("已经退出游戏\n");break;}default:{printf("输入错误请重新输入\n");break;}}} while (n);return 0;
}

注意:此时代码的运行如果输入0,自动跳出,而输入非0非1会再次跳出菜单选项,并且整个三子棋游戏运行结束之后还会再次跳出菜单,也就是一把不过瘾接着来

但是如果我们只想玩一次,并且不想输入非0非1会再次跳出菜单选项,那么main函数更改为

int main()
{srand((unsigned int)time(NULL));int n = 0;menu();begin:   printf("请输入数字\n");scanf("%d", &n);if(n==1){printf("游戏开始\n");game();}else if(n==0){printf("已经退出游戏\n");}else{printf("输入错误请重新输入\n");goto begin;}return 0;
}

至此 我们正式进入游戏

首先画一个棋盘,由于网格形式——>二维数组

棋盘一开始需要是空白的——>初始化数组

打印棋盘——>需要落子的地方先用空格填充 

棋盘为3*3——>头文件里用宏定义行和列 

所以头文件棋盘的初始化部分和打印棋盘函数的代码

#define _CRT_SECURE_NO_WARNINGS
#define ROW  3
#define COL 3
#include<stdio.h>
void InitBoard(char arr[ROW][COL], int row, int col);
void PrintfBoard(char arr[ROW][COL], int row, int col);
void InitBoard(char arr[ROW][COL],int row,int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){arr[i][j] = ' ';}}
}
void PrintfBoard(char arr[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (j < col - 1)printf(" %c |", arr[i][j]);elseprintf(" %c \n", arr[i][j]);}if (i < row - 1){for (j = 0; j < col; j++){if (j < col - 1)printf("---|");elseprintf("---\n");}}}
}

在主题函数中加入game()函数 

目前test函数的思路为 

void menu()
{printf("*********************\n");printf("*******1.play********\n");printf("*******0.exit********\n");printf("*********************\n");
}
void game()
{char ret = 0;                        //后面会用到,现在不涉及char arr[ROW][COL] = { 0 };InitBoard(arr, ROW, COL);PrintfBoard(arr, ROW, COL);

现在棋盘打印完毕,我们这里规定玩家先手——>落子用‘*’ 

 每次落子之后要在棋盘上有所体现——>再次打印棋盘

对弈过程是循环不可能只有一次——>while循环

玩家落子的代码为

void PlayerMove(char arr[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("轮到您了\n");
flag:	printf("请输入坐标");scanf_s("%d%d", &x, &y);if(x >= 1 && x <= row && y >= 1 && y <= col){if(arr[x - 1][y - 1] == ' ')arr[x - 1][y - 1] = '*';else{printf("位置已经被占用请重新输入\n");goto flag;}}else {printf("位置非法请重新输入");goto flag;}
}

test.c变为 

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{printf("*********************\n");printf("*******1.play********\n");printf("*******0.exit********\n");printf("*********************\n");
}
void game()
{char ret = 0;char arr[ROW][COL] = { 0 };InitBoard(arr, ROW, COL);PrintfBoard(arr, ROW, COL);while (1){PlayerMove(arr, ROW, COL);PrintfBoard(arr, ROW, COL);

注意 :我们这个函数在玩家输入坐标不在棋盘范围内,记为坐标非法,此情况和坐标被占用一样都会返回让玩家重新输入坐标那一步,而不是和其他三子棋代码一样再打印一下棋盘!!!!

由于第一轮,电脑还没落子,但是 ,我们要知道,玩家先手所以第二回合之后就可能要判断玩家是否获胜,或者平局,玩家比电脑多下一个棋子,这里不可能电脑获胜

此时头文件变成

#define _CRT_SECURE_NO_WARNINGS
#define ROW  3
#define COL 3
#include<stdio.h>
void InitBoard(char arr[ROW][COL], int row, int col);
void PrintfBoard(char arr[ROW][COL], int row, int col);
void  PlayerMove(char arr[ROW][COL], int row, int col);
char Is_win(char arr[ROW][COL], int row, int col);

此时写一个判断输赢的函数

char Is_win(char arr[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')return arr[i][0];}for (j = 0; j < col; j++){if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')return arr[0][j];}if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')return arr[0][0];if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')return arr[0][2];for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (arr[i][j] == ' ')return 'c';}}return 'q';
}

test.c里的game函数变为 

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{printf("*********************\n");printf("*******1.play********\n");printf("*******0.exit********\n");printf("*********************\n");
}
void game()
{char ret = 0;char arr[ROW][COL] = { 0 };InitBoard(arr, ROW, COL);PrintfBoard(arr, ROW, COL);while (1){PlayerMove(arr, ROW, COL);PrintfBoard(arr, ROW, COL);ret = Is_win(arr, ROW, COL);if (ret == '*'){printf("恭喜获胜\n");break;}else if (ret == 'q'){printf("恭喜您水平和智障一样\n");break;}

轮到电脑落子,由于电脑下棋应该有随机性,而且我们无法判断玩家下在哪里——>生成随机数(用时间这个随时都在变的量来实现 )

 随机数——>#include<time.h>

rand srand——>#include<stdlib.h>

电脑落子之后要考虑是否电脑获胜(因为玩家是否获胜或者平局已经在玩家落子时候考虑过)

随机数生成一次即可

注意:玩家两次坐标输入不宜太快,否则电脑的随机数用时间很难区分

控制随机数在棋盘范围里,并且把函数设计成无需考虑坐标非法的问题

上代码

void ComputerMove(char arr[ROW][COL], int row, int col)
{printf("轮到电脑了\n");while (1){int x = rand() % row;int y = rand() % col;if (arr[x][y] == ' '){arr[x][y] = '#';break;}}
}

头文件

#define _CRT_SECURE_NO_WARNINGS
#define ROW  3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>void InitBoard(char arr[ROW][COL], int row, int col);
void PrintfBoard(char arr[ROW][COL], int row, int col);
void  PlayerMove(char arr[ROW][COL], int row, int col);
char Is_win(char arr[ROW][COL], int row, int col);
void ComputerMove(char arr[ROW][COL], int row, int col);

test.c

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{printf("*********************\n");printf("*******1.play********\n");printf("*******0.exit********\n");printf("*********************\n");
}
void game()
{char ret = 0;char arr[ROW][COL] = { 0 };InitBoard(arr, ROW, COL);PrintfBoard(arr, ROW, COL);while (1){PlayerMove(arr, ROW, COL);PrintfBoard(arr, ROW, COL);ret = Is_win(arr, ROW, COL);if (ret == '*'){printf("恭喜获胜\n");break;}else if (ret == 'q'){printf("恭喜您水平和智障一样\n");break;}ComputerMove(arr, ROW, COL);PrintfBoard(arr, ROW, COL);ret= Is_win(arr, ROW, COL);if (ret == '#'){printf("恭喜您输给人工智障\n");break;}}
}
int main()
{srand((unsigned int)time(NULL));int n = 0;menu();begin:   printf("请输入数字\n");scanf_s("%d", &n);if(n==1){printf("游戏开始\n");game();}else if(n==0){printf("已经退出游戏\n");}else{printf("输入错误请重新输入\n");goto begin;}return 0;
}
最后的三个文件game.h   game.c   test.c的最终代码为

game.h

#define _CRT_SECURE_NO_WARNINGS
#define ROW  3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>void InitBoard(char arr[ROW][COL], int row, 
int col);
void PrintfBoard(char arr[ROW][COL], int row, int col);
void  PlayerMove(char arr[ROW][COL], int row, int col);
char Is_win(char arr[ROW][COL], int row, int col);
void ComputerMove(char arr[ROW][COL], int row, int col);

game.c 

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void InitBoard(char arr[ROW][COL],int row,int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){arr[i][j] = ' ';}}
}
void PrintfBoard(char arr[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (j < col - 1)printf(" %c |", arr[i][j]);elseprintf(" %c \n", arr[i][j]);}if (i < row - 1){for (j = 0; j < col; j++){if (j < col - 1)printf("---|");elseprintf("---\n");}}}
}
void PlayerMove(char arr[ROW][COL], int row, int col)
{int x = 0;int y = 0;printf("轮到您了\n");
flag:	printf("请输入坐标");scanf_s("%d%d", &x, &y);if(x >= 1 && x <= row && y >= 1 && y <= col){if(arr[x - 1][y - 1] == ' ')arr[x - 1][y - 1] = '*';else{printf("位置已经被占用请重新输入\n");goto flag;}}else {printf("位置非法请重新输入");goto flag;}
}
char Is_win(char arr[ROW][COL], int row, int col)
{int i = 0;int j = 0;for (i = 0; i < row; i++){if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')return arr[i][0];}for (j = 0; j < col; j++){if (arr[0][j] == arr[1][j] && arr[1][j] == arr[2][j] && arr[0][j] != ' ')return arr[0][j];}if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')return arr[0][0];if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')return arr[0][2];for (i = 0; i < row; i++){for (j = 0; j < col; j++){if (arr[i][j] == ' ')return 'c';}}return 'q';
}
void ComputerMove(char arr[ROW][COL], int row, int col)
{printf("轮到电脑了\n");while (1){int x = rand() % row;int y = rand() % col;if (arr[x][y] == ' '){arr[x][y] = '#';break;}}
}

test.c

#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{printf("*********************\n");printf("*******1.play********\n");printf("*******0.exit********\n");printf("*********************\n");
}
void game()
{char ret = 0;char arr[ROW][COL] = { 0 };InitBoard(arr, ROW, COL);PrintfBoard(arr, ROW, COL);while (1){PlayerMove(arr, ROW, COL);PrintfBoard(arr, ROW, COL);ret = Is_win(arr, ROW, COL);if (ret == '*'){printf("恭喜获胜\n");break;}else if (ret == 'q'){printf("恭喜您水平和智障一样\n");break;}ComputerMove(arr, ROW, COL);PrintfBoard(arr, ROW, COL);ret= Is_win(arr, ROW, COL);if (ret == '#'){printf("恭喜您输给人工智障\n");break;}}
}
int main()
{srand((unsigned int)time(NULL));int n = 0;menu();begin:   printf("请输入数字\n");scanf_s("%d", &n);if(n==1){printf("游戏开始\n");game();}else if(n==0){printf("已经退出游戏\n");}else{printf("输入错误请重新输入\n");goto begin;}return 0;
}

欢迎斧正,创作不易,感谢观看 

更多推荐

【三子棋】7.25

本文发布于:2023-06-28 00:34:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/919142.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:三子

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!