1.主函数模块
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("************************\n");
printf("*** 三子棋游戏 ***\n");
printf("***1.play 0.exit***\n");
printf("************************\n");
}
void game()
{
char ret = 0;//游戏状态接收
char board [ROW] [COL] = {0};//字符型二维数组
InitBoard(board,ROW,COL);//初始化棋盘
DisplayBoard(board,ROW,COL);//打印棋盘
while(1)
{
playermove(board,ROW,COL);//玩家先手
system("cls");
DisplayBoard(board,ROW,COL);
ret=Iswin(board,ROW,COL);//游戏状态
//游戏四种状态:
//玩家赢 - '*'
//电脑赢 - '#'
//平局 - 'Q'
//继续 - 'C'
if(ret!='C')
{
break;
}
computermove(board,ROW,COL);//电脑后手
system("cls");
DisplayBoard(board,ROW,COL);
ret=Iswin(board,ROW,COL);
if(ret!='C')
{
break;
}
}
if(ret=='*')
{
printf("玩家赢!!!\n");
}
else if(ret=='#')
{
printf("电脑赢!!!\n");
}
else
{
printf("平局!!!\n");
}
}
void test()
{
int input = 0;
srand((unsigned int) time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 1:
system("cls");
printf("%d\n",input);
printf("三子棋游戏开始:\n");
game();
break;
case 0:
system("cls");
printf("%d\n",input);
printf("退出游戏\n");
break;
default:
system("cls");
printf("%d\n",input);
printf("选择错误,请重新选择!!!\n");
break;
}
}
while(input);
}
int main()
{
test();
return 0;
}
2.函数定义模块
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void InitBoard (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 DisplayBoard (char board [ROW] [COL],int row,int col)
/* | |
---|---|---
| |
---|---|---
| |
*/
{
int i = 0;
int j = 0;
for(j=0;j<=col;j++)//打印列号
{
printf("(%d) ",j);
}
printf("\n");
for(i=0;i<row;i++)
{
//数据行
printf("(%d) ",i+1);
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++)
{
if(j==0)
{
printf(" ");
}
printf("---");
if(j<col-1)
{
printf("|");
}
}
printf("\n");
}
}
}
void playermove (char board [ROW] [COL],int row,int col)
{
int x = 0;
int y = 0;
//判断坐标合法性
while(1)
{
printf("玩家走\n");
printf("请输入坐标:");
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 computermove(char board [ROW] [COL],int row,int col)
{
int x = 0;
int y = 0;
while(1)
{
x = rand()%row+1;
y = rand()%col+1;
printf("电脑走\n");
if(board[x-1][y-1]==' ')
{
board[x-1][y-1]='#';
break;
}
}
}
char Iswin (char board [ROW] [COL],int row,int col)
{
int i = 0;
int j = 0;
int a = 0;//判断各种取胜条件,为1胜利
for(i=0;i<row;i++)//所有行相等
{
for(j=0;j<col-1;j++)
{
if(board[i][j]==board[i][j+1] && board[i][j]!=' ')
{
a=1;
}
else
{
a=0;
break;
}
}
if(a==1)
{
return board[i][j];
}
}
for(j=0;j<col;j++)//所有列相等
{
for(i=0;i<row-1;i++)
{
if(board[i][j]==board[i+1][j] && board[i][j]!=' ' )
{
a=1;
}
else
{
a=0;
break;
}
}
if(a==1)
{
return board[i][j];
}
}
for(i=0,j=0;i<row-1,j<col-1;i++,j++)//主对角线
{
if(board[i][j]==board[i+1][j+1] && board[i][j]!=' ')
{
a=1;
}
else
{
a=0;
break;
}
}
if(a==1)
{
return board[i][j];
}
for(i=row-1,j=0;i>0,j<col-1;i--,j++)//副对角线
{
if(board[i][j]==board[i-1][j+1] && board[i][j]!=' ')
{
a=1;
}
else
{
a=0;
break;
}
}
if(a==1)
{
return board[i][j];
}
//判断是否平局
if(1==IsFull(board,ROW,COL))
{
return'Q';
}
else
{
return'C';
}
}
//返回1表示满了,返回0表示没满
int IsFull(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;//满了
}
3.函数声明模块
#define ROW 5
#define COL 5 //#define定义标识符常量,便于修改整个程序的变量值。
//把所有函数头文件都放在一起,最后在主函数里面调用自己自定义的函数即可。
#include <stdio.h>
#include <Windows.h>
#include <time.h>
#include <stdlib.h>
void InitBoard (char board [ROW] [COL],int row,int col);
void DisplayBoard (char board [ROW] [COL],int row,int col);
void playermove (char board [ROW] [COL],int row,int col);
void computermove (char board [ROW] [COL],int row,int col);
char Iswin (char board [ROW] [COL],int row,int col);//游戏状态
int IsFull (char board [ROW] [COL],int row,int col);//是否平局
4.结果显示
5.思维导图