第一次写这么长的小型程序,刚开始感觉很困难,但当多次模仿并试着去写的时候你不难发现,写这样的程序,你必须在脑海中将思路缕清晰,一步便是一环,而且环环相套。在我写完这个程序后,我发现一个程序模块化是很重要的,如果一个模块出了问题,会导致整个程序出错误,所以要做到没写几个模块就测试一下,不然你会发现最后测试时会很凌乱。下面就是关于这个程序实现后的代码:
1.首先是测试项目,把你这游戏需要想到要用的子函数并一步一步连起来,便有了大体框架
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void menu1()
{
printf("*******************************\n");
printf("***********1.play。************\n");
printf("***********2.exit。************\n");
printf("*******************************\n");
}
void menu2()
{
printf("*******************************\n");
printf("**********1:电脑先下**********\n");
printf("**********2:棋手先下**********\n");
printf("*******************************\n");
}
void game()
{
int j = 0;
char board[ROW][COL];
srand((unsigned int)time(NULL));
init_board(board,ROW,COL);
menu2();
printf("请选择棋手先后顺续>:\n");
scanf("%d",&j);
switch(j)
{
case 1:
display_board(board,ROW,COL);
computer_board(board,ROW,COL);
break;
case 2:
display_board(board,ROW,COL);
player_board(board,ROW,COL);
break;
default:
printf("输入错误!\n");
break;
}
}
int main()
{
int i = 0;
do
{
menu1();
printf("请选择>:\n");
scanf("%d",&i);
switch(i)
{
case 1:
game();
break;
case 2:
printf("欢迎下次再玩!\n");
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
}while(i!=2);
return 0;
}
2.实现大体框架下的子函数,并将这些子函数在game.h中写头文件,并引用到各个c源文件中,也就是test.c game.c中:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void init_board(char board[ROW][COL], int row, int col)
{
memset(board, ' ', ROW*COL*sizeof(char));
}
void display_board(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
printf(" %c | %c | %c \n", board[i][0], \
board[i][1], board[i][2]);
if (i != 2)
printf("---|---|---\n");
}
}
void computer_board(char board[ROW][COL], int row, int col)
{
srand((unsigned int)time(NULL));
while (1)
{
int x = 0;
int y = 0;
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = 'X';
break;
}
}
printf("电脑落的子>:\n");
display_board(board, ROW, COL);
if (judge_win(board, ROW, COL) == 1)
printf("你也不过如此嘛!\n");
else if (judge_full(board, ROW, COL) == 3)
printf("哈哈,这次棋逢对手喽!\n");
else player_board(board, ROW, COL);
}
void player_board(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
back:printf("请棋手落子>:\n");
scanf("%d%d", &x, &y);
x = x - 1;
y = y - 1;
if (((x >= 0) && (x <= 2)) && ((y >= 0) && (y <= 2)))
{
if (board[x][y] == ' ')
{
board[x][y] = '0';
}
else
{
printf("输入错误,请重新输入!\n");
goto back;
}
}
else
{
printf("输入错误,请重新输入!\n");
goto back;
}
display_board(board, ROW, COL);
if (judge_win(board, ROW, COL) == 2)p
rintf("哈哈,你真厉害,竟然被你赢了!\n");
else if (judge_full(board, ROW, COL) == 3)printf("呵呵,平局!\n");
else
computer_board(board, ROW, COL);
}
int judge_win(char board[ROW][COL], int row, int col)//判断输赢
{
int i = 0;
for (i = 0; i < row; i++) //玩家行判断
{
if ((board[i][0]) == (board[i][1]) && (board[i][1]) == (board[i][2]) && (board[i][0]) == '0')
return 2;
}
for (i = 0; i < col; i++) //玩家列判断
{
if ((board[0][i]) == (board[1][i]) && (board[1][i]) == (board[2][i]) && (board[0][i]) == '0')
return 2;
}
if ((board[0][0]) == (board[1][1]) && (board[1][1]) == (board[2][2]) && (board[0][0]) == '0')
return 2;//玩家斜判断
if ((board[0][2]) == (board[1][1]) && (board[1][1]) == (board[2][0]) && (board[0][2]) == '0') return 2;
for (i = 0; i < row; i++) //机器行判断
{
if ((board[i][0]) == (board[i][1]) && (board[i][1]) == (board[i][2]) && (board[i][0]) == 'X')
return 1;
}
for (i = 0; i < col; i++) //机器列判断
{
if ((board[0][i]) == (board[1][i]) && (board[1][i]) == (board[2][i]) && (board[0][i]) == 'X')
return 1;
}
if ((board[0][0]) == (board[1][1]) && (board[1][1]) == (board[2][2]) && (board[0][0]) == 'X')
return 1; //机器斜判断
if ((board[0][2]) == (board[1][1]) && (board[1][1]) == (board[2][0]) && (board[0][2]) == 'X')
return 1;
if(judge_full(board, ROW, COL))
return 3;
}
int judge_full(char board[ROW][COL],int row,int col)
{
int x = 0;
int y = 0;
for(x=0;x<row;x++)
{
for(y=0;y<col;y++)
if(board[x][y]==' ')
return 0;
}
return 3;
}
3.游戏模块和测试模块既然已实现,那就得引头文件,而此时就得写我们的头文件了:
#ifndef __GAME_H_
#define __GAME_H_
#include<stdio.h>
#include<stdlib.h>
#include<string.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_board(char board[ROW][COL],int row,int col);
void computer_board(char board[ROW][COL],int row,int col);
int judge_win(char board[ROW][COL],int row,int col);
int judge_full(char board[ROW][COL],int row,int col);
#endif //__GAME_H_