简介
三子棋小游戏对于初学者来说其实不算太简单,但是只要仔细分析一波也是能做下去的,从三子棋游戏玩的步骤来一步一步的写出相应的代码,将每个部分区域化,写成函数,这样读起来以及写起来也会方便许多!
废话不多说,紧接着看正文!!!
正文
三子棋游戏玩的过程可以简述为:电脑下一步棋—>你下一步棋—>电脑下一步棋…依次类推,直到下出结果。
那么就可以将电脑下的过程和人下的过程分别写成函数,然后下到最后将判断输赢的过程写成一个函数。开始进行之前肯定需要一个棋盘,那么就将棋盘的初始化和打印棋盘分别写成函数。
首先我们创建自己的头文件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,不然就会出错哟。
然后就是大家有什么建议或者意见都可以提出来哟