游戏规则:在3*3方格中连成三个棋子即为胜利,若是方格满,即为平局。
实现语言:c语言(编译器:vs2013)
一.整体程序展示
代码分别放在4个文件中,.h文件用来声明库函数,c文件用来书写主函数和各个分布的函数。这样分类可以提升代码的可读性,并且更加美观。
目录
1.代码表示
(1).ultil.h
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
(2).main head,h
#include"ultil.h"
#define row 3
#define col 3
void initboard(char board[row][col]);
void beau(char board[row][col]);
int start_game(char board[row][col]);
void player_input(char board[row][col]);
char check_board(char board[row][col]);
void computer_input(char board[row][col]);
(3).init.c
#include"mainhead.h"
char board[row][col];
int main(void)
{
int sta;
while (1)
{
printf("*********************************\n");
printf("*********************************\n");
printf("*[1] play [2] exit*\n");
printf("*********************************\n");
printf(" 三子棋小游戏 \n");
scanf("%d", &sta);
if (sta == 1)
sta = start_game(board);
if (sta == 2)
{
system("pause");
break;
}
else printf("Please type again\n");
}
}
(4).game.c
#include"mainhead.h"
#define PLAYER_CHOOSE 'x'
#define COMPUTER_CHOOSE '0'
void initboard(char board[row][col])
{
for (int i = 0; i < row;++i)
for (int j = 0; j < col; ++j)
{
board[i][j] = ' ';
}
}
void beau(char board[row][col])
{
for (int i = 0; i < row; ++i)
{
printf("| %c | %c | %c |\n",board[i][0],board[i][1],board[i][2]);
if (i<row-1)
printf(" ___ ___ ___\n");
}
}
void player_input(char board[row][col])
{
int i,j;
while (1)
{
scanf("%d %d", &i, &j);
if (i >= 0 && i<row && j>=0 && j < col&&board[i][j]==' ')
{
board[i][j] = PLAYER_CHOOSE;
break;
}
else printf("You type wrong please type again\n");
continue;
}
}
void computer_input(char board[row][col])
{
int x, y;
srand(time(0));
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
int a = x, b = y;
if (board[1][1] == ' ')
{
board[1][1] = COMPUTER_CHOOSE;
break;
}
for (a = 0; a < row; ++a)
{
if (board[a][0] == ' '&&board[a][1] == board[a][2] && board[a][1] == 'x')
{
board[a][0] = COMPUTER_CHOOSE;
break;
}
if (board[a][1] == ' '&&board[a][0] == 'x'&&board[a][0] == board[a][2])
{
board[a][1] = COMPUTER_CHOOSE;
break;
}
if (board[a][2] == ' '&&board[a][0] == board[a][1] && board[a][0] == 'x')
{
board[a][2] = COMPUTER_CHOOSE;
break;
}
}
for (b = 0; b < col; ++b)
{
if (board[0][b] == ' '&&board[1][b] == board[2][b] && board[1][b] == 'x')
{
board[0][b] = COMPUTER_CHOOSE;
break;
}
if (board[1][b] == ' '&&board[0][b] == board[2][b] && board[0][b] == 'x')
{
board[1][b] = COMPUTER_CHOOSE;
break;
}
if (board[2][b] == ' '&&board[1][b] == board[0][b] && board[1][b] == 'x')
{
board[2][b] = COMPUTER_CHOOSE;
break;
}
}
if (board[1][1] == ' '&&board[0][0] == board[2][2] && board[0][0] == 'x')
{
board[1][1] = COMPUTER_CHOOSE;
break;
}
if (board[2][2] == ' '&&board[1][1] == 'x'&&board[0][0] == board[1][1])
{
board[2][2] = COMPUTER_CHOOSE;
break;
}
if (board[0][0] == ' '&&board[1][1] == board[2][2] && board[1][1] == 'x')
{
board[0][0] = COMPUTER_CHOOSE;
break;
}
if (board[1][1] == ' '&&board[0][2] == board[2][0] && board[0][2] == 'x')
{
board[1][1] = COMPUTER_CHOOSE;
break;
}
if (board[0][2] == ' '&&board[1][1] == board[2][0] && board[1][1] == 'x')
{
board[0][2] = COMPUTER_CHOOSE;
break;
}
if (board[2][0] == ' '&&board[0][2] == board[1][1] && board[0][2] == 'x')
{
board[2][0] = COMPUTER_CHOOSE;
break;
}
board[x][y] = COMPUTER_CHOOSE;
break;
}
}
}
char check_board(char board[row][col])
{
int i, j;
for (i = 0; i < row; ++i)
{
if (board[i][0] != ' '&&board[i][0] == board[i][1] && board[i][1] == board[i][2])
return board[i][0];
}
for (j = 0; j < col; ++j)
{
if (board[0][j] != ' '&&board[0][j] == board[1][j] && board[1][j] == board[2][j])
return board[0][j];
}
if (board[1][1] != ' '&&board[1][1] == board[0][0] && board[1][1] == board[2][2])
return board[1][1];
if (board[1][1] != ' '&&board[1][1] == board[0][2] && board[1][1] == board[2][0])
return board[1][1];
for (i = 0; i < row; ++i)
for (j = 0; j < col; ++j)
{
if (board[i][j] == ' ') return 'c';
}
return 'h';
}
int start_game(char board[row][col])
{
char stca;
initboard(board);
beau(board);
stca = check_board(board);
while (stca=='c' )
{
player_input(board);
check_board(board);
stca = check_board(board);
computer_input(board);
beau(board);
check_board(board);
stca = check_board(board);
}
if (stca == 'x')
{
printf("You win\n");
}
else if (stca == '0')
{
printf("Computer win\n");
}
else if (stca == 'h')
{
printf("You are judge\n");
}
else
printf("This is wrong\n");
stca = 0;
return stca;
}
2.效果展示
二.程序分析
先初始化界面,初始化界面后开始游戏。游戏应在玩家输入和电脑输入后反别检查结果,若有一方满足条件,则判断其赢,或者和棋,最后返回结果并退出界面。
三.分布解析
1.声明
#include<stdio.h> 1
#include<time.h>//实现电脑随机落子做准备
#include<stdlib.h>//实现最会推出前的暂停
#include"ultil.h" //调用此源文件函数 1
#define row 3//宏常量方便修改 row为行col为列
#define col 3
void initboard(char board[row][col]); 1
void beau(char board[row][col]);
int start_game(char board[row][col]); 1
void player_input(char board[row][col]);
char check_board(char board[row][col]);
void computer_input(char board[row][col]);
后面标一的可提前写,未标的在使用前声明即可。
2.初始化棋盘
#include"mainhead.h"
char board[row][col];
int main(void)
{
int sta;
while (1) //判断永为真值,为在玩家多次输错的情况下可多次循环
{
printf("*********************************\n");
printf("*********************************\n");
printf("*[1] play [2] exit*\n");
printf("*********************************\n");
printf(" 三子棋小游戏 \n");//界面美化
scanf("%d", &sta);
if (sta == 1)
sta = start_game(board);
if (sta == 2)
{
system("pause");//为实现暂停后仍展示结果,同时在进行完一次游戏后可退出
break;
}
else printf("Please type again\n");
}
}
3.游戏开始函数书写
此步书写应先进行分析,大致分为打印棋盘,用户电脑输入,检查结果,判断并打印结果。
结果分为四种电脑赢,你赢,和棋,程序出错
int start_game(char board[row][col])
{
char stca;
initboard(board);
beau(board);
stca = check_board(board);
while (stca=='c' )判断stca是否为c,如果为c,则继续下棋,如果不是则打印结果
{
player_input(board);
check_board(board);
stca = check_board(board);
computer_input(board);
beau(board);
check_board(board);
stca = check_board(board);
}
//' x ' 你赢' o '电脑赢 ' h '平局 ' c '继续游戏
if (stca == 'x')//判断并打印结果
{
printf("You win\n");
}
else if (stca == '0')
{
printf("Computer win\n");
}
else if (stca == 'h')
{
printf("You are judge\n");
}
else
printf("This is wrong\n");
stca = 2;
return stca;
}
(1).初始化函数
void initboard(char board[row][col])
{
for (int i = 0; i < row;++i)
for (int j = 0; j < col; ++j)
{
board[i][j] = ' ';
}
}
(2).美化函数
void beau(char board[row][col])
{
for (int i = 0; i < row; ++i)
{
printf("| %c | %c | %c |\n",board[i][0],board[i][1],board[i][2]);
if (i<row-1)
printf(" ___ ___ ___\n");
}
}
(3).自己输入
void player_input(char board[row][col])
{
int i,j;
while (1)
{
scanf("%d %d", &i, &j);//输入用空格隔开
if (i >= 0 && i<row && j>=0 && j < col&&board[i][j]==' ')//输入在棋盘范围内
{
board[i][j] = PLAYER_CHOOSE;//把' x '字符给对应要下的数组框
break;
}
else printf("You type wrong please type again\n");
continue;
}
}
(4).电脑输入
void computer_input(char board[row][col])
{
int x, y;
srand(time(0));//读取随机数随时间计算
while (1)
{
x = rand() % row;//使随机数在方框内
y = rand() % col;
if (board[x][y] == ' ')//判断是否有空位
{
int a = x, b = y;
if (board[1][1] == ' ')//如果玩家未输入在1,1为则电脑占1, 1 位,占1, 1位容易赢。
{
board[1][1] = COMPUTER_CHOOSE;
break;
}
for (a = 0; a < row; ++a)//判断某行玩家是否快要赢,当出现两个玩家的棋时堵住这一行的空位,因位空位位置不定所以有三个,此段代码未进行优化,所以略显冗长。
{
if (board[a][0] == ' '&&board[a][1] == board[a][2] && board[a][1] == 'x')
{
board[a][0] = COMPUTER_CHOOSE;
break;
}
if (board[a][1] == ' '&&board[a][0] == 'x'&&board[a][0] == board[a][2])
{
board[a][1] = COMPUTER_CHOOSE;
break;
}
if (board[a][2] == ' '&&board[a][0] == board[a][1] && board[a][0] == 'x')
{
board[a][2] = COMPUTER_CHOOSE;
break;
}
}
for (b = 0; b < col; ++b)//判断列
{
if (board[0][b] == ' '&&board[1][b] == board[2][b] && board[1][b] == 'x')
{
board[0][b] = COMPUTER_CHOOSE;
break;
}
if (board[1][b] == ' '&&board[0][b] == board[2][b] && board[0][b] == 'x')
{
board[1][b] = COMPUTER_CHOOSE;
break;
}
if (board[2][b] == ' '&&board[1][b] == board[0][b] && board[1][b] == 'x')
{
board[2][b] = COMPUTER_CHOOSE;
break;
}
}
//判断对角线
if (board[1][1] == ' '&&board[0][0] == board[2][2] && board[0][0] == 'x')
{
board[1][1] = COMPUTER_CHOOSE;
break;
}
if (board[2][2] == ' '&&board[1][1] == 'x'&&board[0][0] == board[1][1])
{
board[2][2] = COMPUTER_CHOOSE;
break;
}
if (board[0][0] == ' '&&board[1][1] == board[2][2] && board[1][1] == 'x')
{
board[0][0] = COMPUTER_CHOOSE;
break;
}
if (board[1][1] == ' '&&board[0][2] == board[2][0] && board[0][2] == 'x')
{
board[1][1] = COMPUTER_CHOOSE;
break;
}
if (board[0][2] == ' '&&board[1][1] == board[2][0] && board[1][1] == 'x')
{
board[0][2] = COMPUTER_CHOOSE;
break;
}
if (board[2][0] == ' '&&board[0][2] == board[1][1] && board[0][2] == 'x')
{
board[2][0] = COMPUTER_CHOOSE;
break;
}
//当玩家都没快赢时则不赌,就随机输入
board[x][y] = COMPUTER_CHOOSE;
break;
}
}
}
(5).检查结果函数
char check_board(char board[row][col])
{
int i, j;
//如果出现三个字符相同且不是都是' '字符则返回这三个字符之一,作为判断结果的工具。
for (i = 0; i < row; ++i)//检查行
{
if (board[i][0] != ' '&&board[i][0] == board[i][1] && board[i][1] == board[i][2])
return board[i][0];
}
for (j = 0; j < col; ++j)//检查列
{
if (board[0][j] != ' '&&board[0][j] == board[1][j] && board[1][j] == board[2][j])
return board[0][j];
}
if (board[1][1] != ' '&&board[1][1] == board[0][0] && board[1][1] == board[2][2])
return board[1][1];
if (board[1][1] != ' '&&board[1][1] == board[0][2] && board[1][1] == board[2][0])
return board[1][1];
for (i = 0; i < row; ++i)//检查是否继续
for (j = 0; j < col; ++j)
{
if (board[i][j] == ' ') return 'c';
}
return 'h';//如果没空位,则和棋
}