利用C语言实现n字棋游戏
时间:2022-10-02 12:53:00|栏目:C代码|点击: 次
前言
这里就简单发一个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; else printf("输入错误,"); } 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<stdio.h> #define WID 10 #define NID 10 #define SIC 5 void 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; else return 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++; else break; } for (i = 1; i <= NID-y-1; i++) { if (arr[x][y + i] == siz) count++; else break; } if (count >= SIC - 1) return 1; count = 0; for (i = 1; i <= x; i++) { if (arr[x-i][y] == siz) count++; else break; } for (i = 1; i <= NID - x-1; i++) { if (arr[x+i][y ] == siz) count++; else break; } 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++; else break; } for (i = 1; i <= NID - y - 1; i++) { if (arr[x + i][y + i] == siz) count++; else break; } if (count >= SIC - 1) return 1; count = 0; for (i = 1; i <= y; i++) { if (arr[x + i][y - i] == siz) count++; else break; } for (i = 1; i <= NID - y - 1; i++) { if (arr[x - i][y + i] == siz) count++; else break; } 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++; else break; } for (i = 1; i <= NID - x; i++) { if (arr[x + i][y + i] == siz) count++; else break; } //} if (count >= SIC - 1) return 1; count = 0; for (i = 1; i <= x; i++) { if (arr[x + i][y - i] == siz) count++; else break; } for (i = 1; i <= NID - x; i++) { if (arr[x - i][y + i] == siz) count++; else break; } 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,未输入返回0 int z = judge(arr, X, Y); if (z == 1) printf("此位置已输入,请重新"); else break; //printf("%d %d", X, Y); } while (1); //把O记录坐标到数组上 sure(arr, X, Y, 'O'); //判断是否获得胜利,胜利就返回1,没有胜利就返回0 over = 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,未输入返回0 int z = judge(arr, X, Y); if (z == 0) { //把X记录坐标到数组上 sure(arr, X, Y, 'X'); //结束循环 break; } } while (1); //判断电脑是否获得胜利,胜利就返回1,没有胜利就返回0 over = 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<stdio.h> #include<time.h> #include<stdlib.h> //打印一个开始面板 playboard(); //输入选择 choose(); //游戏主体 playgame(); //把数组初始化为空格 space(arr, WID, NID); //打印一个三子棋的面板 board(arr, WID, NID); //游戏者输入坐标 axis(P1, P2); //记录坐标到数组上 sure(X, Y);
上一篇:浅析C++可变参数模板的展开方式
栏 目:C代码
下一篇:没有了
本文标题:利用C语言实现n字棋游戏
本文地址:http://www.codeinn.net/misctech/215294.html