如何去做一个三子棋:
1.先创建一个头文件(game.h),可以使你在源文件里
不用很繁琐的去写库函或者是函数的声明,你的定义等等。
我的头文件如下:
#ifndef _GAME_H_ //防止头文件被重复被引用,用ifndef/define/endif结构产生预处理块
#define _GAME_H_
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#include<memory.h>
#define ROW 3 //定义行,列
#define COL 3
void init_board(char board[ROW][COL],int row,int col); //函数声明
void print_board(char board[ROW][COL],int row,int col);
void computer_move(char board[ROW][COL],int row,int col);
void player_move(char board[ROW][COL],int row,int col);
char is_win(char board[ROW][COL],int row,int col);
#endif //结束标志
2. 先写一个测试文件(test.c),实现界面的创建,重复玩游戏,函数的调用。
如下:
#include "game.h" //引用头文件
void game()
{
char ret={0}; //定义一个判断函数输赢的函数返回值,'Y'记录你赢了,'N'记录你输了,'P'平局,'G'继续
char board[ROW][COL] = {0}; //创建数组
init_board(board,ROW,COL); //数组初始化
print_board(board,ROW,COL); //打印数组
do //用循环实现玩家电脑多次移动
{
player_move( board, ROW, COL);
print_board(board,ROW,COL);
ret= is_win( board, ROW, COL); //判断输赢
if(ret=='Y')
{
printf("恭喜,你赢了。\n");
break;
}
if(ret=='N')
{
printf("很遗憾,你输了\n");
break;
}
if(ret=='P')
{
printf("你和电脑居然平局了!!!\n");
break;
}
computer_move(board,ROW,COL);
print_board(board,ROW,COL);
ret= is_win( board, ROW, COL);
if(ret=='Y')
{
printf("恭喜,你赢了。\n");
break;
}
if(ret=='N')
{
printf("很遗憾,你输了\n");
break;
}
}
while(ret=='G');
}
void menu()
{
printf("_____________________\n");
printf("|*******************|\n");
printf("|******1.play*******|\n");
printf("|******0.exit*******|\n");
printf("|*******************|\n");
printf("---------------------\n");
}
int main()
{
int input = 0;
srand( (unsigned ) time(NULL)); //产生随机数
do //用循环实现玩多次游戏
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误,请重新选择:\n");
break;
}
}
while(input);
return 0;
}
3.写一个游戏实现文件(game.c)
里面包含玩家移动,电脑移动,判断输赢程序,数组打印。
game.c
#include "game.h"
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 print_board(char board[ROW][COL],int row,int col) //打印数组,就是展示你的游戏界面
{
int i = 0;
int j = 0;
printf("____________\n");
for(i=0; i<row; i++)
{
for(j=0; j<col; j++)
{
printf("| %c ",board[i][j]);
}
printf("|\n");
printf("|___|___|___|");
printf("\n");
}
}
void player_move(char board[ROW][COL],int row,int col)
{
int x = 0;
int y = 0;
while(1)
{
printf("请输入您下棋的位置(用坐标表示):");
scanf("%d %d",&x,&y);
if((x>0 && x<=row) && (y>0 && y<=col) && (board[x-1][y-1]==' ')) //不能超出范围
{
board[x-1][y-1]='*';
break;
}
else
printf("输入位置错误\n");
}
}
void computer_move(char board[ROW][COL],int row,int col)
{
int ret1 = 0;
int ret2 = 0;
while(1)
{
ret1 = rand()%3; //产生两个随机数,做下标
ret2 = rand()%3;
if( board[ret1][ret2]==' ') //位置合适,给它赋值,否则让它重新随机(这里我们还可以再加判断语句,让电脑走灵活一点)
{
board[ret1][ret2] = '0';
break;
}
}
}
int is_full_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++)
{
if(board[i][j]==' ')
return 0;
}
}
return 1;
}
char is_win(char board[ROW][COL],int row,int col) //判断输赢
{
int i = 0;
int j = 0;
for(i=0; i<row; i++)
{
if((board[i][0]==board[i][1]) && (board[i][1]== board[i][2] ))
{
if(board[i][0]=='*')
{
return 'Y';
}
if(board[i][0]=='0')
{
return 'N';
}
}
}
for(j=0; j<col; j++)
{
if((board[0][j]==board[1][j]) && (board[1][j]== board[2][j] ))
{
if(board[0][j]=='*')
{
return 'Y';
}
if(board[0][j]=='0')
{
return 'N';
}
}
}
if((board[0][0]==board[1][1]) && (board[1][1]==board[2][2]))
{
if(board[0][0]=='*')
{
return 'Y';
}
if(board[0][0]=='0')
{
return 'N';
}
}
if((board[2][0]==board[1][1]) && (board[1][1]==board[0][2]))
{
if(board[2][0]=='*')
{
return 'Y';
}
if(board[2][0]=='0')
{
return 'N';
}
}
if(is_full_board(board,ROW,COL)==1) //调用函数判断是否满了
{
return 'P';
}
else
return 'G';
}
到此就结束了,让我们看下运行结果