大家好,想必大家都知道井字棋吧,通常井字棋的定位是靠坐标来实现的,比如说你输入一个坐标(两个数字)比如1,3,那么在井字棋的最左下就填充了一个棋子。井字棋所需要的棋盘并不大,只需要9个格子就可以完成,所以说通过通过坐标定位并不复杂,也可以快速的进行定位。但有没有一种更好,更简洁的定位方式呢?
下面我就来介绍一个更方便的定位方法——通过键盘定位。
我们观察我们的键盘就以QWE,ASD,ZXC这九个按键为例,你可以发现他们恰好形成了一个九宫格,和我们的井字棋刚好符合。
下面我们通过代码来实现。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/*我们需要的头文件*/
首先我们要定义一个全局变量将我们的按键表示成棋盘中的位置
char key[3][3]={"qwe","asd","zxc"};
然后,我们需要设置一个菜单来美化和提示我们的井字棋
void menu()
{
printf("\t****************\n");
printf("\t*****1.GAME*****\n");
printf("\t*****2.BACK*****\n");
printf("\t****************\n");
putchar('\n');
printf("通过九宫格控制棋子\n");
printf("\tq\tw\te\n\n\n\ta\ts\td\n\n\n\tz\tx\tc\n");
}
接下来我们要打印和初始化我们的棋盘,这里我将其分为两个函数
void print_board(char board[3][3]) //打印棋盘和棋子
{
printf("\n");
for(int i=0;i<3;i++)
{
printf("\t%c | %c | %c\n",board[i][0],board[i][1],board[i][2]);
if(i<2)
{
printf("\t--|---|--\n");
}
}
}
void put_firstboard(char board[3][3]) //初始化棋盘
{
int i,s;
for(i=0;i<3;i++)
{
for(s=0;s<3;s++)
{
board[i][s]=' '; //先将每个棋子赋值为空格
}
}
}
接下来我们来实现玩家的操作
void player1_move(char board[3][3])//玩家1是先手且他对应的棋子为符号‘o’
{
int i,s;
int back=1;
char player1move;
while(back)
{
printf("请玩家1操作\n");
player1move=getchar();
for(i=0;i<3;i++)
{
for(s=0;s<3;s++)
{
if(player1move==key[i][s])//判断是否是指定的按键
{
if(board[i][s]==' ')//如果棋盘中没棋子就填入棋子
{
board[i][s]='o';
back=0;
break;
}
if(board[i][s]!=' ')//判断棋盘中是否有棋子,有棋子就报错
{
printf("已经填入棋子!!");
break;
}
}
}
}
}
}
void player2_move(char board[3][3])//玩家2后手且他对应的棋子为字符‘x’
{
int i,s;
int back=1;
char player2move;
while(back)
{
printf("请玩家2操作\n");
player2move=getchar();
for(i=0;i<3;i++)
{
for(s=0;s<3;s++)
{
if(player2move==key[i][s])
{
if(board[i][s]==' ')
{
board[i][s]='x';
back=0;
break;
}
if(board[i][s]!=' ')
{
printf("已经填入棋子!!");
break;
}
}
}
}
}
}
这里我们可以用随机函数来实现简单的电脑对战
void playercomputer_move(char board[3][3])
{
srand(time(0));
int x=rand()%3;
int y=rand()%3;
printf("请电脑玩家操作\n");
while(1)
{
if(board[x][y]==' ')//持续判断键盘是否被填入
{
board[x][y]='x';
break;
}
x=rand()%3;//如果棋盘是被填入的,那么再重新定位键盘
y=rand()%3;
}
}
下面,我们需要建立一个函数来实现判断游戏是否结束
char judgement(char board[3][3])//这里需要返回一个值来判断胜利者
{
if(board[0][0]==board[1][1]&&board[2][2]==board[1][1]&&board[1][1]!=' ')
{
return board[1][1];
}
if(board[0][2]==board[1][1]&&board[2][0]==board[1][1]&&board[1][1]!=' ')
{
return board[1][1];
}
for(int i=0;i<3;i++)
{
if(board[i][0]==board[i][1]&&board[i][1]==board[i][2]&&board[i][1]!=' ')
{
return board[i][1];
}
}
for(int i=0;i<3;i++)
{
if(board[0][i]==board[1][i]&&board[1][i]==board[2][i]&&board[2][i]!=' ')
{
return board[1][i];
}
}
return 'p';
}
根据上面创建的函数,接着我们要实现游戏的运行,这里我用了两个函数来实现运行
void game_person_run()
{
int time=9;//用来判断棋盘是否占满
char board[3][3];
put_firstboard(board);
print_board(board);//输入,初始化棋盘
while(time)
{
player1_move(board);
print_board(board);
getchar();
time--;
if(judgement(board)!='p')//判断是否结束
break;
if(time==0)
break;
player2_move(board);
print_board(board);
getchar();
time--;
if(judgement(board)!='p')
break;
}
judgement(board);
if(time==0&&judgement(board)=='p')//判断是否平局
printf("平局\n");
else if(time!=0)//判断谁是胜利者
{
if(judgement(board)=='o')
printf("恭喜玩家1获胜!");
else if(judgement(board)=='x')
printf("恭喜玩家2获胜!");
}
if(time==0&&judgement(board)!='p')//判断棋子占满后谁是胜利者
{
if(judgement(board)=='o')
printf("恭喜玩家1获胜!");
else if(judgement(board)=='x')
printf("恭喜玩家2获胜!");
}
}
void game_computer_run()//与双人对战相似
{
int time=9;
char board[3][3];
put_firstboard(board);
print_board(board);
while(time)
{
player1_move(board);
print_board(board);
getchar();
time--;
if(judgement(board)!='p')
break;
if(time==0)
break;
playercomputer_move(board);
print_board(board);
time--;
if(judgement(board)!='p')
break;
}
judgement(board);
if(time==0&&judgement(board)=='p')
printf("平局\n");
else if(time!=0)
{
if(judgement(board)=='o')
printf("恭喜玩家获胜!");
else if(judgement(board)=='x')
printf("恭喜电脑获胜!");
}
if(time==0&&judgement(board)!='p')
{
if(judgement(board)=='o')
printf("恭喜玩家获胜!");
else if(judgement(board)=='x')
printf("恭喜电脑获胜!");
}
}
最后就是主函数了,上面我们已经将各种功能通过函数代替,接下来我们只需要包装一下就可以实现通过按键定位实现井字棋了。
int main()
{
int mode;
int back=1;
menu();
putchar('\n');
printf("请选择您所需要的模式\n\t1.preson_game\n\t2.computer_game\n\t3.back\n");
while(back)
{
scanf("%d",&mode);
switch(mode)
{
case 1:game_person_run();break;
case 2:game_computer_run();break;
case 3:back=0;break;
default:printf("选择模式错误!!");
}
}
}
好了,我们实验一下我们的小游戏
上面就完成了
c语言小白一枚,代码比较简单,不喜勿喷,如果代码有不对的地方欢迎大家能指出。
感谢大家的观看,希望大家能多多点赞支持一下吧。