problem&solve 3 | article 3
声明:此五子棋偏新手向,不涉及复杂知识,仅供欣赏
系列目录:
(0)在控制台实现自己的小想法 [本文]
(1)利用easyx制作自己的gui界面 写文章-CSDN博客
(2)胜负判定
(3)ai算法
(4)其他及细节
目前实现情况:
(已做出界面,胜负判断,需要补充ai落子算法,和其他一些细节)
(额外做到了:自定义棋盘大小,自定义胜负规则,自定义提子规则(超过k个子时第一个子会被拿去,胜负窗口,高亮显示等))
本节从最简单的-控制台运行说起
最初要求:
显然要求②是典型的简单队列,暂时不做考虑
从最基础的做起,我们把五子棋分成:
(1)打印棋盘
(2)控制落子
(3)一些提示语和输入输出
(1)打印棋盘
首先我们写出想要棋盘的样子:
|---+---+---+---+---+---+---|
| | | | | | | |
|---+---+---+---+---+---+---|
| | | | | | | |
|---+---+---+---+---+---+---|
| | | | | | | |
|---+---+---+---+---+---+---|
| | | | | | | |
|---+---+---+---+---+---+---|
| | | | | | | |
|---+---+---+---+---+---+---|
很简单,只需要全部打印出来即可。
(2)控制落子
我们使用数组存储每个空的值(落的子),介于需要自定义,这里使用二维数组更为方便
(3)一些提示语和输入输出
完整代码如下(这里花里胡哨了一下,做了个大小屏的居中对齐(只是更好看一点))
//五子棋
#include<stdio.h>
#include<windows.h>
#include<math.h>
int printchess(int a,int b);
int printchessx1(int a);
int printchessx2(int a);
int printblank(int a,int screensizex);
int printenter(int a,int screensizey);
//全局变量的定义&测试和阅读代码须知
int time=10; //把c作为打印棋盘的延时单位
int waittime=200; //把waittime作为文字显示间隔
char value[40][40]; //定义并初始化数组
//大屏不要超过 40x24,小屏不超过25x12
//居中打印格式
int printenter(int a,int screensizey) //小屏高30行,大屏50行
{
for(int i=0;i<screensizey-a-1;i++)
{
printf("\n");
}
}
//小屏长120字符,大屏199字符
int printblank(int a,int screensizex) //a为需要居中的字体个数,screensize为居中的屏幕尺寸
{
for(int i=1;i<=screensizex-2*a;i++)
printf(" ");
Sleep(time);
}
int printchessx2(int a,int x,int y)
{
static int start1=a;
if(a==start1)
{
printf("|");Sleep(time);
}
if(a==0)
{
printf("\n");Sleep(time);
return 0;
}
printf(" %c |",value[x][y]);Sleep(time);
return printchessx2(a-1,x,y+1);Sleep(time);
}
int printchessx1(int a)
{
static int start2=a;
if(a==start2)
{
printf("|---");Sleep(time);
}
if(a==1)
{
printf("|\n");Sleep(time);
return 0;
}
printf("+---");
Sleep(time);
return printchessx1(a-1);
}
int main()
{
again:
int flag=1; //用于判断下O还是X
int positionx,positiony; //落子坐标
int winrule; //胜利条件:几个子一起为赢
for(int i=0;i<40;i++) //棋盘初始化
{
for(int j=0;j<40;j++)
value[i][j]=' ';
}
int length,width,screensize,screensizex,screensizey;
printf("请输入棋盘大小(如7 7表示长x宽):");
scanf("%d %d",&length,&width);
printf("请输入胜利条件:__子棋(建议3或者5)");
scanf("%d",&winrule);
printf("请选择大屏/小屏幕游戏(影响居中格式):大屏幕输入1,小屏幕输入0\n");Sleep(waittime);
scanf("%d",&screensize);
if(screensize==0)
{
screensizex=60;
screensizey=15;
}
else if(screensize==1)
{
screensizex=95;
screensizey=25;
}
else
{
screensize=60;
printf("输入错误,默认小屏幕\n");Sleep(waittime);
}
printblank(length,screensizex);printf("游戏正在初始化,请稍后......\n");Sleep(waittime);
printblank(length,screensizex);printf("------~25%~----- \n");Sleep(waittime);
printblank(length,screensizex);printf("------~50%~----- \n");Sleep(waittime);
printblank(length,screensizex);printf("------~75%~----- \n");Sleep(waittime);
printblank(length,screensizex);printf("------~99%~----- \n");Sleep(waittime);
printblank(length,screensizex);printf("游戏加载完成,正在运行\n");Sleep(waittime);
system("cls");
flag2:
system("cls");
//竖直居中
printenter(width,screensizey);
for(int i=1;i<=2*width+1;i++)
{
printblank(length,screensizex);
if(i%2==1)printchessx1(length);
if(i%2==0)printchessx2(length,i/2-1,0);
}
printblank(length,screensizex);
//printf(" 点击对应位置下棋子\n");
printf("输入坐标下对应棋子:");
scanf("%d %d",&positionx,&positiony);
if(value[positionx][positiony]==' ');
else{
printblank(6,screensizex);
printf("该位置已有格子,请重新输入.\n");
system("pause");
goto flag2;
}
if(flag==1)value[positionx][positiony]='X';
if(flag==-1)value[positionx][positiony]='O';
flag=-flag;
time=0;
goto flag2;
}
一个简单的五子棋就出来了!
首次编辑12.11(完成文章)