完成一个三子棋游戏需要以下几个步骤
打印菜单
菜单部分代码如下:
void menu()
{
printf(" 欢迎进入三子棋小游戏! \n");
printf("*******************************\n");
printf("*******************************\n");
printf("********* 1.play ************\n");
printf("********* 0.exit ************\n");
printf("*******************************\n");
}
打印棋盘
我们需要在屏幕上打印出一个3*3的棋盘,棋子的位置用一个二维数组表示,在最开始将每一个棋子的位置都初始化成空格。
棋盘函数代码如下:
//打印棋盘,设计棋盘格式
void PrintBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
printf(" | | | \n");
for(i = 0; i < row; i++)
{
printf("---%c---%c---%c---\n", board[i][0], board[i][1], board[i][2]);
printf(" | | | \n");
}
}
用memset函数初始化棋盘:
//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
memset(board, ' ', row*col*sizeof(board[0][0]));
}
玩家落子
即给这个二维数组赋值,当输入的坐标所表示的位置超出棋盘范围或已被占用时,程序会提醒输入错误,可以重新输入
//玩家走
//用二维数组存放落子位置
//玩家输入的坐标比数组的坐标大一
//例如,玩家输入坐标1,1 在二维数组中实际表示arr[0][0]的位置
void PlayerMove(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
printf("请玩家输入坐标:>\n");
do
{
scanf("%d%d", &i, &j);
if (board[i-1][j-1] == 'O')
{
printf("该坐标已被占用,请重新输入:>\n");
}
else if (((i - 1) > row || ((j - 1) > col) || ((i - 1) < 0) || ((j - 1) < 0)))
{
printf("输入坐标错误,请重新输入:>\n");
}
else
{
board[i-1][j-1] = 'X';
break;
}
} while (1);
}
电脑落子
无论是玩家还是电脑,第一步都应抢占棋盘最中间的位置。
电脑根据玩家的落子位置来决定自己的落子位置,当某一行或是某一列或是某一条对角线有两个相同的棋子时,选择放进该条线上最后的空位置。如果这两个相同的棋子属于对方,可以阻止对方获胜。
//电脑走,使电脑根据玩家落子的位置来决定自己的落子位置
void ComputerMove(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
if(board[1][1] == ' ')
{
board[1][1] = 'O';
return;
}
for(i = 0; i<row ;i++)
{
if((board[i][0]==board[i][1])&&board[i][2]==' '&&board[i][0]=='X')
{
board[i][2]='O';
return;
}
else if ((board[i][0]==board[i][1])&&board[i][2]==' '&&board[i][0]=='O')
{
board[i][2]='O';
return;
}
else if (((board[i][0]==board[i][2])&&board[i][1]==' '&&board[i][0]=='X'))
{
board[i][1]='O';
return;
}
else if ((board[i][0]==board[i][2])&&board[i][1]==' '&&board[i][0]=='O')
{
board[i][1]='O';
return;
}
else if ((board[i][1]==board[i][2])&&board[i][0]==' '&&board[i][1]=='X')
{
board[i][0]='O';
return;
}
else if ((board[i][1]==board[i][2])&&board[i][0]==' '&&board[i][1]=='O')
{
board[i][0]='O';
return;
}
}
for(j = 0; j<col; j++)
{
if((board[0][j]==board[1][j])&&board[2][j]==' '&&board[0][j]=='X')
{
board[2][j]='O';
return;
}
else if ((board[0][j]==board[1][j])&&board[2][j]==' '&&board[0][j]=='O')
{
board[2][j]='O';
return;
}
else if ((board[0][j]==board[2][j])&&board[1][j]==' '&&board[0][j]=='X')
{
board[1][j]='O';
return;
}
else if ((board[0][j]==board[2][j])&&board[1][j]==' '&&board[0][j]=='O')
{
board[1][j]='O';
return;
}
else if ((board[1][j]==board[2][j])&&board[0][j]==' '&&board[1][j]=='X')
{
board[0][j]='O';
return;
}
else if ((board[1][j]==board[2][j])&&board[0][j]==' '&&board[1][j]=='O')
{
board[0][j]='O';
return;
}
if((board[1][1]==board[0][0])&&board[2][2]==' '&&board[1][1]=='X')
{
board[2][2]='O';
return;
}
else if((board[1][1]==board[0][0])&&board[2][2]==' '&&board[1][1]=='O')
{
board[2][2]='O';
return;
}
else if((board[1][1]==board[2][2])&&board[0][0]==' '&&board[1][1]=='X')
{
board[0][0]='O';
return;
}
else if((board[1][1]==board[2][2])&&board[0][0]==' '&&board[1][1]=='O')
{
board[0][0]='O';
return;
}
else if((board[1][1]==board[0][2])&&board[2][0]==' '&&board[1][1]=='X')
{
board[2][0]='O';
return;
}
else if((board[1][1]==board[0][2])&&board[2][0]==' '&&board[1][1]=='O')
{
board[2][0]='O';
return;
}
else if((board[1][1]==board[2][0])&&board[0][2]==' '&&board[1][1]=='X')
{
board[0][2]='O';
return;
}
else if((board[1][1]==board[2][0])&&board[0][2]==' '&&board[1][1]=='O')
{
board[0][2]='O';
return;
}
}
while (1)
{
int i = rand() % 3;
int j = rand() % 3;
if ((board[i][j] != 'X') && (board[i][j] != 'O'))
{
board[i][j] = 'O';
return;
}
}
}
判断输赢
首先应该判断棋盘是否放满,如果不判断但棋子一直放不进去,会造成死循环
判断棋盘是否放满的函数:
//判断棋盘是否放满,放满返回1,没满返回0
int is_full(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
int count = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] != ' ')
count++;
}
}
if (count == row*col)
return 1;
else
return 0;
}
判断输赢的函数代码如下:
//判断输赢
//玩家赢----'X'
//电脑赢----'O'
//平局------'P'
//游戏继续--' '
char DisplayBoard(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]!= ' '))//判断行相等
return board[i][0];
}
for (i = 0; i < col; i++)
{
if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]) && (board[0][i] != ' '))//判断列相等
return board[0][i];
}
//判断对角线相等
if ((board[0][0] == board[1][1]) && (board[1][1] == board[2][2])
&& (board[1][1] != ' '))
return board[1][1];
&& (board[1][1] != ' '))
return board[1][1];
else if (is_full(board, ROW, COL))
return 'p';
else
return ' ';
}
最后通过主函数对这些函数的合理调用来完成我们的三子棋。
这是我们所定义的头文件以及所使用的库函数的头文件
game.h
#ifndef __GAME_H__
#define __GAME_H__
#define ROW 3
#define COL 3
#include<stdio.h>
#include<string.h>
#include<time.h>
#include<stdlib.h>
void InitBoard(char board[ROW][COL], int row, int col);
void PrintBoard(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 DisplayBoard(char board[ROW][COL], int row, int col);
int is_full(char board[ROW][COL], int row, int col);
#endif //__GAME_H__
大体框架
test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void menu()
{
printf(" 欢迎进入三子棋小游戏! \n");
printf("*******************************\n");
printf("*******************************\n");
printf("********* 1.play ************\n");
printf("********* 0.exit ************\n");
printf("*******************************\n");
}
void game()
{
char ret;
char board[ROW][COL] = { 0 };
InitBoard(board, ROW, COL);//初始化棋盘
PrintBoard(board, ROW, COL);//打印棋盘
while (1)
{
printf("玩家走\n");
PlayerMove(board, ROW, COL);
PrintBoard(board, ROW, COL);
is_full(board, ROW, COL);
ret = DisplayBoard(board, ROW, COL);
if (ret == 'X')
{
printf("玩家赢!\n");
break;
}
else if (ret == 'O')
{
printf("电脑赢!\n");
break;
}
else if (ret == 'p')
{
printf("平局!\n");
break;
}
printf("电脑走\n");
ComputerMove(board, ROW, COL);
PrintBoard(board, ROW, COL);
//判断
if (ret == 'X')
{
printf("玩家赢!\n");
break;
}
else if (ret == 'O')
{
printf("电脑赢!\n");
break;
}
else if (ret == 'p')
{
printf("平局!\n");
break;
}
}
}
void test()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>\n");
scanf("%d", &input);
switch (input)
{
case 1:
//玩游戏
game();
break;
case 0:
printf("退出游戏。\n");
break;
default:
printf("选择错误,请重新选择。\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
最后是我们的运行结果