利用C语言实现n字棋游戏
短信预约 -IT技能 免费直播动态提醒
前言
这里就简单发一个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语言实现n字棋游戏的详细内容,更多关于C语言n字棋的资料请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341