先简单介绍一下三子棋的规则,方便我们接下来的编程和理解。规则如下:
在九宫格棋盘上,只要将自己的三个棋子走成一条线(横、竖、对角线),对方就算输了。
规则很简单,但是我们应该从哪里入手完成这个三子棋程序呢?
首先,我们的游戏程序应该先有个菜单页面,这个菜单页面用来让用户操作选择玩游戏,或是退出。
界面可以很简单,只需要几条 printf 语句即可。
这里我们尽可能用函数来完成游戏的功能:
game.h
#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define ROW 3
#define COL 3
void menu();
void playgame();
void showchess(char chess[ROW][COL],int row,int col);
void printfchess(char chess[ROW][COL],int row,int col);
void playermove(char chess[ROW][COL],int row,int col);
void computermove(char chess[ROW][COL],int row,int col);
char iswin(char chess[ROW][COL],int row,int col);
#endif//__DAME_H__
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void showchess(char chess[ROW][COL],int row,int col)
{
memset(&chess[0][0],' ',row*col*sizeof(char));
}
void printfchess(char chess[ROW][COL],int row,int col)
{
int i=0;
int j=0;
int m=0;
int n=0;
for(i=0;i<row-1;i++)
{
for(m=0;m<col-1;m++)
{
printf(" %c |",chess[i][m]);
}
printf(" %c \n",chess[i][col-1]);
for(m=0;m<col-1;m++)
{
printf("---|");
}
printf("---\n");
}
if(i<=row-1)//最后一行
{
for(m=0;m<col-1;m++)
{
printf(" %c |",chess[i][m]);
}
printf(" %c \n",chess[i][col-1]);
}
}
void playermove(char chess[ROW][COL],int row,int col)
{
int x=0;
int y=0;
if(iswin(chess,row,col)=='S')
{
printf("请输入你要走的坐标:> ");
while(1)
{
scanf("%d%d",&x,&y);
if(x>=1&&x<=row&&y>=1&&y<=col)
{
if(chess[x-1][y-1]==' ')
{
chess[x-1][y-1]='X';
break;
}
else
{
printf("此坐标已有棋子,请重新选择!\n");
}
}
else{
printf("输入坐标错误,请重新输入!\n");
}
}
}
}
void computermove(char chess[ROW][COL],int row,int col)
{
int x=0;
int y=0;
if(iswin(chess,row,col)=='S')
{
printf("电脑走:>\n");
while(1)
{
x=rand()%row+1;
y=rand()%col+1;
if(chess[x][y]==' ')
{
chess[x][y]='O';
printfchess(chess,ROW,COL);
break;
}
}
}
}
char iswin(char chess[ROW][COL],int row,int col)
{
int i=0;
int j=0;
int count=row*col;
for(i=0;i<=row-3;i++)
{
for(j=0;j<=col-3;j++)
{
if(chess[i][j]==chess[i+1][j+1]&&chess[i+1][j+1]==chess[i+2][j+2]&&chess[i+1][j+1]!=' ')
{
return chess[i+1][j+1];
}
}
}
for(i=0;i<=col-3;i++)
{
for(j=0;j<=row-3;j++)
{
if(chess[i][j+3]==chess[i+1][j+2]&&chess[i+1][j+2]==chess[i+2][j+1]&&chess[i+1][j+2]!=' ')
{
return chess[i+1][j+2];//1,3 2,2 3,1 出问题,判断失败???????????????
}
}
}
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
if(chess[i][j]==chess[i+1][j]&&chess[i+1][j]==chess[i+2][j]&&chess[i+1][j]!=' ')
return chess[i+1][j];
if(chess[i][j]==chess[i][j+1]&&chess[i][j+1]==chess[i][j+2]&&chess[i][j+1]!=' ')
return chess[i][j+1];
}
}
for(i=0;i<row;i++)//平局
{
for(j=0;j<col;j++)
{
if(chess[i][j]!=' ')
count--;
}
}
if(count==0)
return 'P';
return 'S';
}
void playgame()
{
char chess[ROW][COL]={0};
showchess( chess,ROW,COL);
printfchess(chess,ROW,COL);
while(iswin(chess,ROW,COL)=='S')
{
playermove(chess,ROW,COL);
computermove(chess,ROW,COL);
}
if(iswin(chess,ROW,COL)=='X')
{
printf("玩家赢!\n");
printfchess(chess,ROW,COL);
}
if(iswin(chess,ROW,COL)=='O')
{
printf("电脑赢!\n");
printfchess(chess,ROW,COL);
}
if(iswin(chess,ROW,COL)=='P')
{
printf("平局!\n");
printfchess(chess,ROW,COL);
}
}
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("*********************************\n");
printf("*********************************\n");
printf("******** 1 .进入游戏 ********\n");
printf("******** 0 .退出游戏 ********\n");
printf("*********************************\n");
printf("*********************************\n");
printf("*********************************\n");
}
int main()
{
int input;
system("color F9");
srand((unsigned int)time(NULL));
do{
menu();
printf("请选择:");
scanf("%d",&input);
switch(input)
{
case 0:
printf("游戏退出成功!\n");
break;
case 1:
playgame();
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
}while(input);
system("pause");
return 0;
}