作者:爱弹吉他的小奔同学

专栏:《C语言》

仓库:gitee(所有的代码都在这个仓库里面,名字就是三子棋5.9)

如果感觉学累了,那么就看一个视频放松一下吧,猜猜点进去你会看到什么(视频)

我向往以后悠闲的生活,但现在的我们正处于需要努力的年华


这里就简单发一个n字棋游戏,和井字棋一样,不过这个游戏你可以自定义棋盘的大小。
井字棋是3×3大小,满足三个平齐就获得胜利。
小奔写的这个游戏,你可以自定义为10×10大小,满足6个平齐就获得胜利,都是可以随便定义的。
如果感兴趣的话就可以来尝试一下,或许你可以找到一些bug

(至于为什么说它是“人工智障”呢?因为它是随机下的,并不会去针对你,它很有自己的想法,不过有一次小奔测试的时候,没有注意到,就被它反杀了……)


目录

      • 思路
      • 游戏中的一些图片
          • 开始的界面:
          • 棋盘的样子:
          • 随机打的坐标:
          • 获得胜利
          • 结束程序
      • 代码

思路

  1. 用#define定义的标识符常量来确定n字棋的大小和n字棋获胜的条件
  2. 打印一个开始面板
  3. 选择是否开始游戏
  4. 开始游戏
  5. 根据#define定义的标识符常量来创建二维数组
  6. 把二维数组初始化为空格
  7. 打印一个n字棋的面板
  8. 游戏者输入坐标
  9. 判断游戏者输入的坐标是否已输入,已输入就重新输入
  10. 未输入的话,把O记录到数组里选择的坐标上
  11. 判断游戏者是否获得胜利,胜利结束游戏
  12. 判断是否填满了表格,填满就平局
  13. 电脑根据随机值输入坐标
  14. 判断电脑输入的坐标是否已输入,已输入就重新输入
  15. 未输入的话,把X记录到数组里选择的坐标上
  16. 判断电脑是否获得胜利,胜利结束游戏
  17. 判断是否填满了表格,填满就平局
  18. 回到步骤7,不断循环,直到某方获胜或者平局
  19. 结束后输入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);