文章目录
- 游戏说明
- 游戏效果展示
- 游戏代码
- 游戏代码解析
-
- 游戏框架解析
- 棋盘绘制
- 棋盘初始化
- 玩家落子
- 电脑落子
- 输赢判断
- 主函数
游戏说明
游戏界面:可以选择开始游戏 或者退出
游戏操作:通过命令行输入坐标即可
游戏效果展示
游戏代码
博友们可以将以下代码复制到自己的编译器当中运行:
#ifndef game_h
#define game_h
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
/*
//初始化棋盘
void init_board(char board[ROW][COL],int row,int col);
//打印棋盘
void display_board(char board[ROW][COL],int row,int col);
*/
void display_board(char board[ROW][COL],int row,int col);
void init_board(char board[ROW][COL],int row,int col);
//玩家下棋
void player(char board[ROW][COL],int row,int col);
//电脑下棋
void computer(char board[ROW][COL],int row,int col);
//判断输赢
int is_win(char board[ROW][COL],int row,int col);
#endif /* game_h */
#include "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 display_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++)
{
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(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
while (1)
{
printf("请玩家落子\n");
scanf("%d %d",&i,&j);
if (i>=0 && i<=row && j>=0 && j<=col)
{
if (board[i-1][j-1] !=' ')
{
printf("目标已占用 请换一个\n");
}
else
{
board[i-1][j-1] = '*';
break;
}
}
else
{
printf("输入错误,重新输入\n");
}
}
}
void computer(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
printf("电脑下棋\n");
while(1)
{
// printf("电脑下棋\n");
i = rand()%row;
j = rand()%col;
if (board[i-1][j-1] ==' ')
{
board[i-1][j-1] = '#';
break;
}
}
}
/*
| |
---|---|---
| |
---|---|---
| |
*/
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] == ' ')
{
// printf("还有空 游戏继续\n");
return 0;
}
}
}
printf("棋盘已满\n");
return 1;
}
int is_win(char board[ROW][COL],int row,int col)
{
int i = 0;
// char j = 0;
for (i = 0; i <row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];//行
}
}
for (i = 0; i <col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];//列
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[2][0];
}
if (is_full(board,row,col) == 1)
{
return 'Q';
}
/*
| |
---|---|---
| |
---|---|---
| |
*/
return 'C';
}
#include <stdio.h>
#include "game.h"
void game(void)
{
/*
char board[ROW][COL] = {0};
init_board(board, ROW, COL);
display_board(board, ROW, COL);
*/
int ret = 0;
char board[ROW][COL] = {0};
init_board(board,ROW,COL);
display_board(board,ROW,COL);
while (1)
{
player(board,ROW,COL);
//判断输赢 玩家赢'*' 电脑赢'#' 平局'Q' 继续'C'
ret = is_win(board,ROW,COL);
if (ret != 'C')
{
break;
}
display_board(board,ROW,COL);
computer(board,ROW,COL);
ret = is_win(board,ROW,COL);
if (ret != 'C')
{
break;
}
display_board(board,ROW,COL);
}
if (ret == '*')
{
printf("玩家赢啦\n");
display_board(board,ROW,COL);
}
if (ret == '#')
{
printf("电脑赢啦\n");
display_board(board,ROW,COL);
}
if (ret == 'Q')
{
printf("平局咯!!!\n");
display_board(board,ROW,COL);
}
}
void menu(void)
{
printf("*************************\n");
printf("*********1.play**********\n");
printf("*********0.exit**********\n");
printf("********三字棋游戏*********\n");
printf("*************************\n");
}
int main(int argc, const char * argv[])
{
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);
return 0;
}
游戏代码详解
游戏框架构建
棋盘绘制
首先定义棋盘的大小,定义棋盘行数和列数。
#define ROW 3
#define COL 3
这是我们想要打印出的棋盘样子
/*
| |
---|---|---
| |
---|---|---
| |
*/
通过循环语句打印出棋盘的样子
void display_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++)
{
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 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 player(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
while (1)
{
printf("请玩家落子\n");
scanf("%d %d",&i,&j);
if (i>=0 && i<=row && j>=0 && j<=col)
{
if (board[i-1][j-1] !=' ')
{
printf("目标已占用 请换一个\n");
}
else
{
board[i-1][j-1] = '*';
break;
}
}
else
{
printf("输入错误,重新输入\n");
}
}
}
其实实现很简单 就是将原本初始化中的‘ ’空格 改变为我们的棋子‘*’
值得注意的是 在落子之前得判断合法性 想要落子的地方是否已经有了棋子
如何实现电脑随机落子
void computer(char board[ROW][COL],int row,int col)
{
int i = 0;
int j = 0;
printf("电脑下棋\n");
while(1)
{
// printf("电脑下棋\n");
i = rand()%row;
j = rand()%col;
if (board[i-1][j-1] ==' ')
{
board[i-1][j-1] = '#';
break;
}
}
}
电脑随机落子 我们使用的是rand函数 记得判断合法性哦
判断输赢机制
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] == ' ')
{
// printf("还有空 游戏继续\n");
return 0;
}
}
}
printf("棋盘已满\n");
return 1;
}
int is_win(char board[ROW][COL],int row,int col)
{
int i = 0;
// char j = 0;
for (i = 0; i <row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];//行
}
}
for (i = 0; i <col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];//列
}
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[2][0] != ' ')
{
return board[2][0];
}
if (is_full(board,row,col) == 1)
{
return 'Q';
}
/*
| |
---|---|---
| |
---|---|---
| |
*/
return 'C';
}
输赢的判断机制我们是有三个部分
1.玩家赢
2.电脑赢
3.平局 棋盘满了
主函数
有了以上函数的支持 我们的主函数可以简单写出
#include <stdio.h>
#include "game.h"
void game(void)
{
/*
char board[ROW][COL] = {0};
init_board(board, ROW, COL);
display_board(board, ROW, COL);
*/
int ret = 0;
char board[ROW][COL] = {0};
init_board(board,ROW,COL);
display_board(board,ROW,COL);
while (1)
{
player(board,ROW,COL);
//判断输赢 玩家赢'*' 电脑赢'#' 平局'Q' 继续'C'
ret = is_win(board,ROW,COL);
if (ret != 'C')
{
break;
}
display_board(board,ROW,COL);
computer(board,ROW,COL);
ret = is_win(board,ROW,COL);
if (ret != 'C')
{
break;
}
display_board(board,ROW,COL);
}
if (ret == '*')
{
printf("玩家赢啦\n");
display_board(board,ROW,COL);
}
if (ret == '#')
{
printf("电脑赢啦\n");
display_board(board,ROW,COL);
}
if (ret == 'Q')
{
printf("平局咯!!!\n");
display_board(board,ROW,COL);
}
}
void menu(void)
{
printf("*************************\n");
printf("*********1.play**********\n");
printf("*********0.exit**********\n");
printf("********三字棋游戏*********\n");
printf("*************************\n");
}
int main(int argc, const char * argv[])
{
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);
return 0;
}