作为一位初学C语言的小白,在对C语言有了初步认识后,现在来尝试一下三子棋的编程来作为一次挑战!!
首先把需要的头文件声明:
#ifndef __GAME_H__
#define __GAME_H__
#include<stdio.h>
#include<time.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 print_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);
#endif//__GAME_H__
接下来开始正式的代码:如下
#include"game.h"
#include<time.h> 写之前引用自己定义的“game.h”头文件与电脑自己下棋所需要的<time,h>头文件
void game()//程序主体大致就是-->初始化棋盘数组-玩家走-判断输赢-打印棋盘-电脑走-判断输赢-打印棋盘
{
int board[ROW][COL] = {0};
int ret = 0;
init_board(board, ROW, COL);
print_board(board, ROW, COL);
srand((unsigned int)time(NULL));
while(1)
{
player_move(board, ROW, COL);
ret = is_win(board, ROW, COL);
if(ret != ' ')
break;
print_board(board, ROW, COL);
computer_move(board, ROW, COL);
ret = is_win(board, ROW, COL);
print_board(board, ROW, COL);
if(ret != ' ')
break;
}
{
if (ret == 'q')
{
printf("平局\n");
}
if (ret == '*')
{
printf("恭喜你,你赢了%c\n", 1);
}
if (ret == '0')
{
printf("你输了,不要灰心哦%c\n", 1);
}
}
}
void menu()//实现菜单界面
{
printf("-------------------------\n");
printf("# 1.start #\n");
printf("# 0.exit #\n");
printf("-------------------------\n");
}
int main()
{
int input = 0;
do
{
menu();
printf("请选择:");
scanf("%d",&input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("输入有误,请重新输入\n");
break;
}
}while(input);
return 0;
}
下面就是自己编写的game.h头文件里所用的函数编写
void init_board(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 print_board(char board[ROW][COL], int row, int col)//打印棋盘
{
int i = 0;
int j = 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");
}
}
void player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请选择坐标>:");
scanf("%d.%d", &x,&y);
x--;
y--;
if ((x >= 0) && (x <= 2) && (y >= 0) && (y <= 2))//玩家输入坐标需在棋盘坐标范围内
{
if (board[x][y] == ' ')//坐标位置并没有棋子
{
board[x][y] = '*';
break;
}
else if (board[x][y] == '0' || board[x][y] == '*')
{
printf("此位置已有棋子,请从新输入坐标%c",1);
}
}
else
{
printf("输入坐标有误,请重新输入坐标%c",1);
}
}
}
void computer_move(char board[ROW][COL], int row, int col)
{
printf("电脑下\n");
while (1)
{
int x = 0;
int y = 0;
x = rand() % 3;
y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '0';
break;
}
}
}
static int is_full(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;
}
char is_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] != ' '))
{
return board[i][0];
}
}
for (i = 0; i < row; 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[0][0] != ' '))
{
return board[1][1];
}
if ((board[0][2] == board[1][1]) && (board[1][1] == board[2][0]) && (board[0][0] != ' '))
{
return board[1][1];
}
if (is_full(board, row, col))
{
return 'q';
}
return ' ';
}