[c语言]三子棋小游戏(对初学者练习很大帮助)

简介

  三子棋小游戏对于初学者来说其实不算太简单,但是只要仔细分析一波也是能做下去的,从三子棋游戏玩的步骤来一步一步的写出相应的代码,将每个部分区域化,写成函数,这样读起来以及写起来也会方便许多!
  废话不多说,紧接着看正文!!!

正文

  三子棋游戏玩的过程可以简述为:电脑下一步棋—>你下一步棋—>电脑下一步棋…依次类推,直到下出结果。
  那么就可以将电脑下的过程和人下的过程分别写成函数,然后下到最后将判断输赢的过程写成一个函数。开始进行之前肯定需要一个棋盘,那么就将棋盘的初始化和打印棋盘分别写成函数。
  首先我们创建自己的头文件game.h,然后将函数的声明以及宏定义放进去方便后期函数管理以及修改

//这是game.h里的内容
#ifndef __GAME_H__
#define __GAME_H__

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>

#define ROW 3
#define COL 3

void Init_board(char board[ROW][COL],int row,int col);
void Display_board(char board[ROW][COL],int row,int col);
void Player_move(char board[ROW][COL],int row,int col);
void Computer_move(char board[ROW][COL],int row,int col);
void game();
int Is_full(char board[ROW][COL],int row,int col);


//Is_win
//'*'玩家赢
//'o'电脑赢
//'q'平局
//' '再来
char Is_win(char board[ROW][COL],int row,int col);

#endif//__GAME_H__

  再创建一个源文件test.c中放入主函数,主函数用于调用游戏模块的各个部分,再写一个简单的界面函数以便用户使用

//test.c中的内容
#include "game.h"
void menu()//界面函数
{
printf("\n#################################\n");
printf("##########  三子棋游戏  #########\n");
printf("###########  1. 开始  ###########\n");
printf("###########  0. 退出  ###########\n");
printf("#################################\n");
system("color e0");
}

int main()//主函数
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("游戏已退出\n");
break;
default:
printf("输入错误请重新输入\n");
break;
}
}while(input);
}

  接下来就是细节了game.c的内容(重头戏)
首先初始化棋盘,想要下棋首先得有一个棋盘:(初始化不多说,大家都会)

void Init_board(char board[ROW][COL],int row,int col)//初始化棋盘
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
   board[i][j] = ' ';
}
}
}

那么接下来就是把棋盘展示出来(不展示往哪下棋),给棋盘画出格子

void Display_board(char board[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 ",board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
if(i<row-1)
{
for(j=0; j<col; j++)
{
printf("---");
if(j<col-1)
printf("|");
}
printf("\n");
}
}
}

然后是用户下棋的过程

void Player_move(char board[ROW][COL],int row,int col)//玩家走棋
{
int x = 0;
int y = 0;
while(1)
{
printf("玩家走棋(请输入坐标):\n");
scanf("%d%d",&x,&y);//人落棋的坐标
if(x>=1 && x<=row && y>=1 && y<=col)
{
if(board[x-1][y-1]==' ')//落棋的位置如果为空那么就将棋子下在此处
{
   board[x-1][y-1] = '*';
break;
}
else
{
printf("该位置已被占用,请重新输入\n");
}
}
else
{
printf("输入位置错误,请重新输入\n");
}
}
}

接着是电脑走棋的过程

void Computer_move(char board[ROW][COL],int row,int col)//电脑走棋
{
printf("电脑走棋:\n");
while(1)
{
int x = rand()%3;
int y = rand()%3;//设置随机数决定电脑落棋的位置
if(x>=0 && x<row && y>=0 && y<col)
{
if(board[x][y] == ' ')//落棋的位置如果为空那么就将棋子下在此处
{
    board[x][y] = 'o';
break;
}
}
}
}

当下出结果或者平局是我们需要一个函数来判断输赢或者平局

char Is_win(char board[ROW][COL],int row,int col)//判断胜负
{
int i = 0;
int j = 0;
//判断横行是否有三个连棋
for(i=0; i<row; i++)
{
for(j=0; j<col-1; j++)
{
if(board[i][j] != board[i][j+1])
break;
}
if(j == col-1)
{
return board[i][0];
}
}
//判断竖行是否有三个连棋
for(i=0; i<row; i++)
{
for(j=0; j<col-1; j++)
{
if(board[j][i] != board[j+1][i])
break;
}
if(j == col-1)
{
return board[j][i];
}
}
//判断捺是否有三个连棋[0][0],[1][1],[2][2]
for(i=0; i<row-1; i++)
 {
  if(board[i][i] != board[i+1][i+1])
  {
   break;
  }
 }
 if(i == row-1)
  {
   return board[i][i];
  }
//判断撇是否有三个连棋[0][2],[1][1],[2][0]
for(i=0; i<row-1; i++)
 {
  if(board[i][row-1-i] != board[i+1][row-1-i-1])
  {
   break;
  }
 }
 if(i == row-1)
  return board[0][row-1];
if(Is_full(board,ROW,COL))
return 'q';//返回q表示为平局
else
return ' ';
}

当棋谱满了时要么有人赢要么平局,所以我们还要判断一下棋盘满没满

int Is_full(char board[ROW][COL],int row,int col)//判断棋盘是否满了
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
if(board[i][j] == ' ')
return 0;//没满返回0
}
}
return 1;//满了返回1
}

最后用一个game()函数来将上面的函数们联系起来

void game()
{
 char board[ROW][COL] = {0};
 char ret = 0;
 Init_board(board,ROW,COL);
 Display_board(board,ROW,COL);
 srand((unsigned int)time(NULL));
 while(1)
 {
  Computer_move(board,ROW,COL);//电脑先下
  ret = Is_win(board,ROW,COL);//判断这个时候有没有人赢
  {
   if(ret != ' ')
    break;
  }
  Display_board(board,ROW,COL);//展示这个时候的棋谱
  Player_move(board,ROW,COL);//人下棋
  ret = Is_win(board,ROW,COL);//判断这个时候有没有人赢
  {
   if(ret != ' ')
    break;
  }
  Display_board(board,ROW,COL);
 }
 {
  if(ret == '*')
  {
   printf("玩家赢\n");
  }
  else if(ret == 'o')
  {
   printf("电脑赢\n");
  }
  else if(ret == 'q')
  {
   printf("平局\n");
  }
  Display_board(board,ROW,COL);
 }
}

附上运行结果:
在这里插入图片描述
在这里插入图片描述
颜色有点挫大家凑活看哈。

总结

  三子棋到这里就结束了,没错,你竟然看懂了。一定要一步一步的分析要写的功能,然后一步一步实现,大事化小。


PS:
  注意:一定要在自己的源文件中调用自己的头文件game.h,不然就会出错哟。
  然后就是大家有什么建议或者意见都可以提出来哟


猜你喜欢

转载自blog.csdn.net/Code_beeps/article/details/83020251