作者:爱弹吉他的小奔同学
专栏:《C语言》
仓库:gitee(所有的代码都在这个仓库里面,名字就是三子棋5.9)
如果感觉学累了,那么就看一个视频放松一下吧,猜猜点进去你会看到什么(视频)
我向往以后悠闲的生活,但现在的我们正处于需要努力的年华
这里就简单发一个n字棋游戏,和井字棋一样,不过这个游戏你可以自定义棋盘的大小。
井字棋是3×3大小,满足三个平齐就获得胜利。
小奔写的这个游戏,你可以自定义为10×10大小,满足6个平齐就获得胜利,都是可以随便定义的。
如果感兴趣的话就可以来尝试一下,或许你可以找到一些bug
(至于为什么说它是“人工智障”呢?因为它是随机下的,并不会去针对你,它很有自己的想法,不过有一次小奔测试的时候,没有注意到,就被它反杀了……)
目录
- 思路
- 游戏中的一些图片
- 开始的界面:
- 棋盘的样子:
- 随机打的坐标:
- 获得胜利
- 结束程序
- 代码
思路
- 用#define定义的标识符常量来确定n字棋的大小和n字棋获胜的条件
- 打印一个开始面板
- 选择是否开始游戏
- 开始游戏
- 根据#define定义的标识符常量来创建二维数组
- 把二维数组初始化为空格
- 打印一个n字棋的面板
- 游戏者输入坐标
- 判断游戏者输入的坐标是否已输入,已输入就重新输入
- 未输入的话,把O记录到数组里选择的坐标上
- 判断游戏者是否获得胜利,胜利结束游戏
- 判断是否填满了表格,填满就平局
- 电脑根据随机值输入坐标
- 判断电脑输入的坐标是否已输入,已输入就重新输入
- 未输入的话,把X记录到数组里选择的坐标上
- 判断电脑是否获得胜利,胜利结束游戏
- 判断是否填满了表格,填满就平局
- 回到步骤7,不断循环,直到某方获胜或者平局
- 结束后输入1重新开始游戏,输入0结束游戏
你看懂了吗?
游戏中的一些图片
这里的自定义的是10×10大小的,胜利条件是大于等于5,游戏方使用的是大写O
开始的界面:
棋盘的样子:
随机打的坐标:
获得胜利
结束程序
怎么样,感觉还不错吧,还不快去支持一下小奔
代码
创建了两个.c文件test.c和game.c,一个头文件game.h
test.c
#define _CRT_SECURE_NO_WARNINGS#include"game.h"int main(){int num = 1;srand((unsigned int)time(NULL));do{if (num == 1){//打印一个开始面板playboard();}printf("输入1则进行游戏,输入0则结束程序\n");//输入选择num = choose();//通过输入的选择来判断是否进行游戏switch (num){case 1://开始游戏{do{playgame();num = 0;printf("是否重新开始游戏,重新开始输入1,结束游戏输入0:>");scanf("%d", &num);if (num == 1);else if (num == 0)break;elseprintf("输入错误,");} while (1);break;}case 0:{printf("结束程序\n");break;}default:{printf("\n输入错误,未能识别你的选择,请重新输入\n\n");break;}}//判断是否跳出循环if (num == 0)break;} while (1);return 0;}
game.c
#define _CRT_SECURE_NO_WARNINGS#include#define WID 10#define NID 10#define SIC 5void playboard(){printf("**********************************\n");printf("**********************************\n");printf("************ 1.play **************\n");printf("************ 0.exit **************\n");printf("**********************************\n");printf("**********************************\n");}int choose(){int num = 0;printf("请输入你的选择:>");scanf("%d", &num);return num;}void space(char arr[WID][NID], int x, int y){int i = 0;for (i = 0; i < x; i++){int j = 0;for (j = 0; j < y; j++){arr[i][j] = ' ';}}}board(char arr[WID][NID],int x,int y){int i = 0;int j = 0;printf("\n-");for (i = 0; i < x; i++){printf("----");}printf("-\n");printf("0");for (i = 1; i <= x; i++){printf("%d ", i);}printf("\n");printf("-");for (i = 0; i < x; i++){printf("----");}printf("-\n");for (i = 0; i < x; i++){int k = 0;printf("%d", i+1);for (j = 0; j < y; j++){printf("|");printf(" %c ", arr[i][j]);}printf("|\n");printf("-");for (k = 0; k < x; k++){printf("----");}printf("-\n");}}void axis(int* x,int* y){scanf("%d %d", &*x, &*y);*x=(*x) - 1;*y=(*y) - 1;}void sure(char arr[WID][NID],int x,int y,char c){arr[x][y] = c;}void human_machine(int* x, int* y){*x = rand() % WID;*y = rand() % NID;}int judge(char arr[WID][NID],int x,int y){if (arr[x][y] == ' ')return 0;elsereturn 1;}int judgesure(char arr[WID][NID], int x, int y,char siz){int count = 0;int i = 0;for (i = 1; i <= y; i++){if (arr[x][y - i] == siz)count++;elsebreak;}for (i = 1; i <= NID-y-1; i++){if (arr[x][y + i] == siz)count++;elsebreak;}if (count >= SIC - 1)return 1;count = 0;for (i = 1; i <= x; i++){if (arr[x-i][y] == siz)count++;elsebreak;}for (i = 1; i <= NID - x-1; i++){if (arr[x+i][y ] == siz)count++;elsebreak;}if (count >= SIC - 1)return 1;count = 0;if (WID >= NID){for (i = 1; i <= y; i++){if (arr[x - i][y - i] == siz)count++;elsebreak;}for (i = 1; i <= NID - y - 1; i++){if (arr[x + i][y + i] == siz)count++;elsebreak;}if (count >= SIC - 1)return 1;count = 0;for (i = 1; i <= y; i++){if (arr[x + i][y - i] == siz)count++;elsebreak;}for (i = 1; i <= NID - y - 1; i++){if (arr[x - i][y + i] == siz)count++;elsebreak;}if (count >= SIC - 1)return 1;count = 0;}if (WID <= NID){for (i = 1; i <= x; i++){if (arr[x - i][y - i] == siz)count++;elsebreak;}for (i = 1; i <= NID - x; i++){if (arr[x + i][y + i] == siz)count++;elsebreak;}//}if (count >= SIC - 1)return 1;count = 0;for (i = 1; i <= x; i++){if (arr[x + i][y - i] == siz)count++;elsebreak;}for (i = 1; i <= NID - x; i++){if (arr[x - i][y + i] == siz)count++;elsebreak;}if (count >= SIC - 1)return 1;}return 0;}int judgefill(char arr[WID][NID]){int count = 0;int i = 0;int j = 0;for (i = 0; i < WID; i++){int j = 0;for (j = 0; j < NID; j++){if (arr[i][j] != ' ')count++;}}return WID*NID-count;}void playgame(){//建立一个二维数组char arr[WID][NID];//把数组初始化为空格 space(arr,WID,NID);int over = 0;int i = 0;int count = 0;int X = 0;int Y = 0;int* P1 = &X;int* P2 = &Y;do{//打印一个n字棋的面板board(arr, WID, NID);do{printf("输入你选择的坐标:>");//游戏者输入坐标axis(P1, P2);//判断游戏者输入的坐标是否已输入,已输入返回1,未输入返回0int z = judge(arr, X, Y);if (z == 1)printf("此位置已输入,请重新");elsebreak;//printf("%d %d", X, Y);} while (1);//把O记录坐标到数组上sure(arr, X, Y, 'O');//判断是否获得胜利,胜利就返回1,没有胜利就返回0over = judgesure(arr, X, Y, 'O');if (over == 1){printf("你获得胜利\n");board(arr, WID, NID);break;}//判断是否填满了表格if (judgefill(arr) == 0){printf("平局");break;}do{//电脑输入坐标human_machine(P1, P2);//判断电脑输入的坐标是否已输入,已输入返回1,未输入返回0int z = judge(arr, X, Y);if (z == 0){//把X记录坐标到数组上sure(arr, X, Y, 'X');//结束循环break;}} while (1);//判断电脑是否获得胜利,胜利就返回1,没有胜利就返回0over = judgesure(arr, X, Y, 'X');if (over == 1){printf("电脑获得胜利\n");board(arr, WID, NID);break;}//判断是否填满了表格if (judgefill(arr) == 0){printf("平局\n");break;}} while (1);}
game.h
#pragma once#include#include#include//打印一个开始面板playboard();//输入选择choose();//游戏主体playgame();//把数组初始化为空格 space(arr, WID, NID);//打印一个三子棋的面板board(arr, WID, NID);//游戏者输入坐标axis(P1, P2);//记录坐标到数组上sure(X, Y);