三子棋实现
写在最前:新手一枚,主要是想上传代码记录自己的学习历程。
也祝看到这篇文章的小伙伴可以学业有成!事业顺利!
创建三个文件,两个C++源文件,test.c、 game.c,
前者用来存放测试代码,后者用来存放主要的游戏实现代码
再创建一个头文件代码 game.h,用来存放各种声明和定义
1.game.h代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 3//在头文件里定义行列,这样方便改动,如果要改四子棋,在这里改动就可以
#define COL 3
void InitBoard(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);//电脑下棋
char Is_Win(char board[ROW][COL],int row,int col);//判断输赢
test.c代码
#include<stdio.h>
#include<stdlib.h>
#include"game.h"
//菜单函数,用于选择是否进入游戏
void menu()
{
printf("********************************\n");
printf("***1.play ************ 0.exit**\n");
printf("********************************\n");
}
void game()
{
//定义一个棋盘
char board[ROW][COL] = {0};
char ret ;
//初始化棋盘
InitBoard(board,ROW,COL);
//打印这个棋盘
DisPlay_Board(board,ROW,COL);
//正式开始游戏
while(1)//采用循环
{
//玩家先下
Player_Move(board,ROW,COL);
//下一步打印一次
DisPlay_Board(board,ROW,COL);
//打印一次,然后判断是继续,还是平局,还是玩家赢,还是电脑赢
ret = Is_Win(board,ROW,COL);
if(ret != 'J')//只要不是继续,退出循环,反之就继续循环 直到棋盘满
{
break;
}
//电脑下,和玩家一样的过程
Computer_Move(board,ROW,COL);
DisPlay_Board(board,ROW,COL);
ret = Is_Win(board,ROW,COL);
if(ret != 'J')
{
break;
}
}
//通过ret 判断哪个赢还有平局
if(ret == '*')
{
printf("玩家赢!\n");
}
if(ret == '#')
{
printf("电脑赢!\n");
}
if(ret == 'P')
{
printf("平局\n");
}
}
void test()
{
int input = 0;
srand((unsigned int )time(NULL));//随机数,只需要执行一次,所以就放在循环外面
do
{
menu();
scanf("%d",&input);
switch(input)//开始菜单输入判断
{
case 1:
printf("开始游戏!\n");
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
while(input);
}
//调用主函数
int main()
{
test();
return 0;
}
game.h 代码
#include<stdio.h>
#include<stdlib.h>
#include"game.h"
//初始化棋盘中的棋子,先用空格代替数组元素
void InitBoard(char board[ROW][COL],int row,int col)
{
int i,j;
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,j;
for(i = 0;i<row;i++)
{
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");
}
}
}
//玩家下棋-输入坐标,将坐标减1之后对应到棋盘上
void Player_Move(char board[ROW][COL],int row,int col)
{
printf("玩家下!\n");
while(1)
{
int i,j;
printf("请输入一个坐标:\n");
scanf("%d%d",&i,&j);
if(i>=1 && i<=row && j>=1 && j<=col)
{
if(board[i-1][j-1] == ' ')
{
board[i-1][j-1] = '*';//玩家棋子用*代替
break;
}
else
{
printf("您输入的字符已经被占用,请重新输入!\n");
}
}
else
{
printf("您输入的数字不合法,请重新输入!\n");
}
}
}
//电脑下棋——电脑产生0-row-1的随机数坐标
void Computer_Move(char board[ROW][COL],int row,int col)
{
int x,y;
while(1)
{
x = rand()%row;
y = rand()%col;
if(board[x][y] == ' ')
{
printf("电脑下\n");
board[x][y] = '#';
break;
}
}
}
//判断棋盘上棋子有没有满,满则返回1,没满返回0
int Is_Full(char board[ROW][COL],int row,int col)
{
int i,j;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
if(board[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断谁赢,玩家赢返回*,电脑赢返回#,平局返回P,继续返回J
char Is_Win(char board[ROW][COL],int row,int col)//返回char 型为后面判断做准备
{
int i,j;
int count3 = 0;
int count4 = 0;
//判断横行
for(i=0;i<row;i++)
{
int count1 = 0;
for(j=0;j<col-1;j++)
{
if(board[i][j] == board[i][j+1] && board[i][j] != ' ')
{
count1++;
}
}
if(count1 == (col-1))
{
printf("横行成立\n");
return board[i][col-1];
}
}
//判断竖行
for(j=0;j<col;j++)
{
int count2 = 0;
for(i=0;i<row-1;i++)
{
if(board[i][j] == board[i+1][j] && board[i][j] != ' ')
count2++;
}
if(count2 == (row-1))
{
printf("竖行成立\n");
return board[i][j];
}
}
//判断正斜线
for (i = 0;i<row-1;i++)
{
if(board[i][i] == board[i+1][i+1] && board[i][i] != ' ')
{
count3++;
}
if(count3 == (row-1) )
{
printf("正斜线成立\n");
return board[row-1][col-1];
}
}
//判断反斜线
for(i=0;i<row;i++)
{
if(board[i][row-i-1] == board[0][row-1] && board[0][row-1] != ' ')
count4++;
}
if(count4 == row)
{
return board[0][row-1];
printf("反斜线成立\n");
}
//判断是平局还是没下完。
if(Is_Full(board,row,col))
{
return 'P';
}
else
return 'J';
}
结果:
总结:
总的来说,三子棋整体不难,主要适合像我一样的代码小白拿来练手。
最大的收获莫过于知道了一个项目实现需要模块化,需要实现定义一系列的函数,然后进行模块化的编写而不是一篇代码从上写到下。