三子棋代码内容:
1、利用二维数组,存储棋子 2、游戏开始页面
3、打印棋局 4、玩家下棋 5、电脑下棋 6、判断输赢
游戏代码思路:
好了,内容和思路都已经大概介绍完毕了;现在开始我们的C语言小游戏----三子棋。
1.game.h----游戏函数的声明
2.text.c------测试游戏
3.game.c------游戏函数的实现
我们先想想,玩游戏时,是不是应该需要一个菜单,让我们选择 退出游戏 或者 开始游戏 而且我们不一定只玩一把游戏,所以需要一个循环,当我们游戏结束之后可以开始第二把。
所以我们先在text.c创建一个菜单函数 menu();
#include
void menu()
{ printf("***********************");
printf("********三子棋*********");
printf("***********************");
printf("开始游戏>1 退出游戏>0");
}
int main()
{
int input=0;
while (1)
{
menu();
printf("请选择:"):
scanf("%d",&input);
if(input==1)
{
//游戏开始
}
else if(input==0)
{
break; //退出游戏
}
else
{ printf("输入有误,重新输入"); }
三子棋、三子棋,很明显我们需要打印一个键盘,这样才能开始游戏;三子棋有9个空格,所以我们可以利用二维数组 board[3][3] 打印棋盘,先让二维数组存放的是' '(空格);之后下棋的时候,会用棋子代替;
初始化棋盘,我们可以创建init_board() 函数,也就是给二维数组赋值:
void init_board(char board[ROW][COL],int row,int col)
{
for(int c = 0;c < row;c++)
{
for(int d = 0;d < col;d++)
{
board[c][d] = ' '; //给二维数组赋' ';
}
}
用二维数组的值打印棋盘,我们可以创建print_board () 函数:
void print_board(char board[ROW][COL],int row,int col)
{
for(int c = 0;c < row;c++)
{
int d;
for(d = 0;d < col;d++)
{
printf(" %c ",board[c][d]);
if(d < col-1)
{
printf("|");
}
}
printf("\n");
if(c < row-1)
{
for(int q=0;q< col;q++)
{
printf("---");
if(q < col-1)
{
printf("|");
}
}
printf("\n");
}
}
}
//注:以上部分则是打印棋局,|和---是棋局的布置;
玩家需要下棋,电脑也要下棋,并且在一方下完棋之后需要判断是否胜利,又或者是否棋盘满了平局。
玩家下棋,可以创建 player_board() :
void player_board(char board[ROW][COL],int row,int col)
{
printf("玩家下棋,选择坐标:");
while(1)
{
int rows; //行
int cols; //列
scanf("%d %d",&rows,&col);
if( (rows < row) && (cols < col) &&
board[rows][cols]==' ')
{
board[rows][cols] = '*';break; //当坐标是' ';用'*'代替
}
else printf("坐标有误,重新输入\n:");
}
}
电脑下棋,可以创建computer_board() :
void computer_board(char board[ROW][COL], int row, int col)
{
int a, b;
printf("机器人下棋\n");
while (1)
{
a = rand() % (ROW+1);//行
b = rand() % (COL+1);//列
if (a <= row && b <= col &&
board[a][b] == ' ')
{
board[a][b] = 'T';//当坐标为' ' ;则用'T'代替
break;
}
}
}
当棋手下棋之后需要判断,棋局是否满了,创建 full() 函数:
char full(char board[ROW][COL]) {
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
if (board[i][j] == ' ')return 'p';//棋盘未满,返回p值
}
}
return 'x'; //棋局已满,返回x值
}
有判断是否棋盘满,也应该判断是否胜利,创建使用 win() 函数:
char 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 < 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];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
return full(board);
}
现在可以进行对局了,但是因为是棋局,所以是你来我往的,需要使用循环,直到一方胜利。
现在定义一个game() 函数;
void game()
{
char ret;
char board[ROW][COL];
init_board(board, ROW, COL);
printfboard(board, ROW, COL);
while (1) {
player_board(board, ROW, COL);
printfboard(board, ROW, COL);
//判断输赢
ret = win(board, ROW, COL);
if (ret == '*') //返回值是*,则赢
{
printf("我赢了\n"); break;
}
else if (ret == 'x') //返回值是x,则是平局
{
printf("平局\n"); break;
}
computer_board(board, ROW, COL);
printfboard(board, ROW, COL);
//判断输赢
ret = win(board, ROW, COL);
if (ret == 'T') //返回值是T,电脑赢了;
{
printf("电脑赢了\n"); break;
}
else if (ret == 'x') //返回值是x,则是平局
{
printf("平局\n"); break;
}
}
}
第一小步
先在game.h头文件里申明函数名,为了更方便,还可以放入#include
,代码里因为使用了随机数,所以需要放置头文件#include 、#include ; 还需要申明ROW的值和COL的值。
#include
#include #include #define ROW 3 #define COL 3 //初始化棋盘 void init_board(char board[ROW][COL], int row, int col); //打印键盘 void printfboard(char board[ROW][COL], int row, int col); //玩家下棋 void player_board(char board[ROW][COL], int row, int col); //电脑玩家 void computer_board(char board[ROW][COL], int row, int col); //获胜条件 char win(char board[ROW][COL], int row, int col);
第二小步
先在text.c源文件里添加头文件#include"game.h",然后就可以调用头文件#include"game.h",
由于头文件里申明了函数,所以可以通过头文件访问game.c源文件,从而使用函数。
#include"game.h" void menu() { printf("*********************************\n"); printf("****************三子棋***********\n"); printf("*********************************\n"); printf("进入游戏:1 退出游戏:0\n"); } void game() { char ret; char board[ROW][COL]; init_board(board, ROW, COL); printfboard(board, ROW, COL); while (1) { player_board(board, ROW, COL); printfboard(board, ROW, COL); //判断输赢 ret = win(board, ROW, COL); if (ret == '*') { printf("我赢了\n"); break; } else if (ret == 'x') { printf("平局\n"); break; } computer_board(board, ROW, COL); printfboard(board, ROW, COL); //判断输赢 ret = win(board, ROW, COL); if (ret == 'T') { printf("电脑赢了\n"); break; } else if (ret == 'x') { printf("平局\n"); break; } } } void text() { int a=0; srand((unsigned)time(NULL)); //随机值 while (1) { menu(); scanf("%d", &a); if (a == 1) { printf("游戏开始\n"); game(); } else if (a == 0) { printf("退出游戏\n"); break; } else { printf("错误,重新输入\n"); } } } int main() { text(); return 0; }
第三小步
在game.c文件里先置放头文件#include"game.h", 因为头文件里申明了函数;所以可以创建 init_board() 、print_board ()、player_board() 、computer_board() 、full() 、win() 函数
#include"game.h" void init_board(char board[ROW][COL], int row, int col) { for (int i = 0; i < row; i++) { for (int j=0; j < col; j++) { board[i][j] = ' '; } } } void printfboard(char board[ROW][COL], int row, int col) { int i = 0; for (i; i < row; i++) { int j = 0; for (j; 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"); } } } void player_board(char board[ROW][COL], int row, int col) { int a, b; while (1) { printf("请输入你的坐标:"); scanf("%d %d", &a, &b); if (a <= row && b <= col && board[a-1][b-1] == ' ') { board[a-1][b-1] = '*'; break; } else printf("坐标有误"); } } void computer_board(char board[ROW][COL], int row, int col) { int a, b; printf("机器人下棋\n"); while (1) { a = rand() % 4; b = rand() % 4; if (a <= row && b <= col && board[a][b] == ' ') { board[a][b] = 'T'; break; } } } char full(char board[ROW][COL]) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (board[i][j] == ' ')return 'p'; } } return 'x'; } char 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 < 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]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[1][1]; } return full(board); }
代码如上哦;
接下来,我们来编译程序吧;
很明显,代码运行成功了,这就是三子棋的简易代码,当然如果有兴趣,可以根据这个去写一些更多完善,美观的三子棋程序;可借用 easyx图形库 来。