问题:
用C语言实现三子棋。
思路:
- 整体思路
1.肯定先出现菜单,之后在判断,是否退出。
出现菜单,肯定就会有选择,不同的选择,进入不同的函数。而选择的话,用switch实现分支选择。
2.实现基本思路,选择1,进入游戏。选择2退出游戏,其他情况,重新输入。
3.而三子棋游戏,首先需要有一个三子棋棋盘,棋盘在这里相当于二维数组,一次先初始化棋盘,即数组,给棋盘每个位置变为空格。
4.而打印棋盘则需要研究下,为了更美观,我们想打印一个小格子一个小格子,观察发现,每一行打印,打印两种东西,第一次打印一行数据,每个数据后面又仅跟一个|,第二行则打印---,相当于小格子的下边界线,每次打印分割线后面紧跟一个|。
5.这就实现了打印函数,
6.随后便开始玩家下棋,和电脑下棋的操作。即玩家输入坐标,然后对应数组进行赋值即可。
7.每次下棋时,都会进行一次判定,如果得到的判定结果不是'C'(继续),则跳出循环,进行相应的输出,判断输赢。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//菜单
void menu()//菜单
{
printf("******** 三子棋!***********\n");
printf("**************************\n");
printf("***** 1.开始游戏 ***********\n");
printf("***** 2.结束游戏 ***********\n");
printf("**************************\n");
}
void initchess(char str[ROW][COL],int row,int col)//初始化棋盘
{
int i=0;
for(i=0;i<row;i++)
{
int j=0;
for(j=0;j<col;j++)
str[i][j]=' ';
}
}
void playermove(char str[ROW][COL],int row,int col)//玩家下棋
{
printf("输入坐标\n");
int x=0,y=0;
while(1)
{
scanf("%d %d",&x,&y);
if(x>=1 && x<=row && y>=1 &&y<=col)
{
if(str[x-1][y-1] == ' ')
{
str[x-1][y-1]='*';
break;
}
else
printf("该区域已被落子,请重新输入\n");
}
else
printf("输入范围有误,请重新输入\n");
}
}
void display(char str[ROW][COL],int row,int col)//显示棋盘
{
int i=0;
for(i=0;i<row;i++)
{
int j=0;
for(j=0;j<col;j++)
{
printf(" %c ",str[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
int w=0;
for(w=0;w<col;w++)
{
printf("---");
if(w<col-1)
printf("|");
}
printf("\n");
}
}
void computermove(char str[ROW][COL],int row,int col)//电脑下棋
{
printf("电脑下棋\n");
int x=0;
int y=0;
while(1)
{
x=rand()%3;
y=rand()%3;
if(str[x][y]==' ')
{
str[x][y]='$';
break;
}
}
}
int isfull(char str[ROW][COL],int row,int col)//判断棋盘是否满了
{
int i=0;
for(i=0;i<row;i++)
{
int j=0;
for(j=0;j<col;j++)
{
if(str[i][j]==' ')
return 0;
}
}
return 1;
}
char iswiner(char str[ROW][COL],int row,int col)
{
//赢
//行
int i=0;
for(i=0;i<row;i++)
{
if(str[i][0]==str[i][1] && str[i][1]==str[i][2] && str[i][0]!=' ')
return str[i][0];
}
//列
for(i=0;i<col;i++)
{
if(str[0][i]==str[1][i] && str[1][i]==str[2][i] && str[0][i]!=' ')
return str[0][i];
}
//斜着
if(str[0][0]==str[1][1] && str[1][1] == str[2][2] && str[1][1]!=' ')
return str[1][1];
if(str[0][2]==str[1][1] && str[1][1] == str[2][0] && str[1][1]!=' ')
return str[1][1];
//平局
if(isfull(str,ROW,COL)==1)
return 'Q';
// 继续
return 'C';
}
void game()
{
char str[ROW][COL]={0};
printf("游戏开始\n");
initchess(str,ROW,COL);
display(str,ROW,COL);
int ret=0;
while(1)
{
playermove(str,ROW,COL);//玩家下棋
display(str,ROW,COL);
system("cls");
ret =iswiner(str,ROW,COL);
if(ret !='C')
break;
computermove(str,ROW,COL);//电脑下棋
display(str,ROW,COL);
ret =iswiner(str,ROW,COL);
if(ret !='C')
break;
}
if(ret == '*')
printf("你赢了,兄弟(⊙﹏⊙)\n");
else if(ret =='$')
printf("电脑赢了\n");
else if(ret =='Q')
printf("平局了\n");
else
printf("出错了\n");
}
int main()
{
srand((unsigned int)time(NULL));
int input=0;
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
//printf("game\n");
game();
break;
case 2:
printf("结束\n");
break;
default:
printf("输入有误,重新输入\n");
break;
}
}while(input!=2);
}