【C语言极简自学笔记】井字棋开发
一、项目概述
井字棋是一款经典的双人游戏,玩家轮流在 3x3 的棋盘上放置棋子,先在水平、垂直或对角线方向形成三个相同棋子的一方获胜。若棋盘被填满且无人获胜,则游戏平局。我们的目标是实现一个控制台版本的井字棋游戏,支持玩家与电脑对战,电脑将采用简单的随机策略选择落子位置。
二、代码实现
1.初始界面
首先利用do ....while函数最少执行依次的特点,在屏幕上打印一个游戏的开始界面,代码和结果如下:
#include <stdio.h>
void menu()
{printf("*****************************\n");printf("******1.开始游戏 0.exit******\n");printf("*****************************\n");
}
int main()
{int input = 0;do{menu();} while(input);return 0;
}
2.用户选择
界面打印之后,用户可以通过键盘来输入数据,以选择是否开始游戏,利用switch语句来判断输入是否合理,结果如下:
printf("请选择:>\n");
scanf("%d",&input);
switch (input)
{
case 1:printf("开始游戏\n");game();break;
case 0:printf("退出游戏\n");break;
default:printf("选择错误,请重新选择\n");break;
}
3.初始化棋盘并打印
在进入游戏之后,首先需要初始化棋盘并打印,因此需要声明函数来实现棋盘的初始化和打印
初始化棋盘
通过for循环遍历二维数组的每一个元素,让其初始化为空格
void InitBoard(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] = ' ';}}
}
棋盘打印
棋盘的打印主要利用循环来实现,棋盘中的每一行的元素:首先另二维数组中的第1行第一列元素为“ 字符 ”,若列数小于列数减一,则打印“|”,完成后换行。然后判断数据是否小于行数减一,若符合,则打印“---”,若列数据小于所设定的列,则打印“|”,结果如下:
void DisplayBoard(char board[ROW][COL], int row, int col)
{int i = 0;for (i = 0; i < row; i++){int j = 0;for (j = 0; j < col; j++){printf(" %c ",board[i][j]);if (j < col - 1){printf("|");}}printf("\n");if (i < row - 1){int j = 0;for (j = 0; j < col; j++){printf("---");if (j < col - 1){printf("|");}}printf("\n");}}
}
4.开始游戏
棋手下棋
棋手下棋主要通过初始化棋子的坐标,然后由棋手手动输入坐标来实现,若坐标对应位置为空格,则另该坐标位*,若已经被占用,则输出“坐标被占用,请重新输入”,若坐标不满足二维数组的条件,则输出“坐标非法请重新输入”。
void PlayerMove(char board[ROW][COL], int row, int col)
{int x = 0;int y = 0;while (1){printf("玩家请输入坐标:>");scanf("%d %d",&x,&y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}elseprintf("坐标被占用,请重新输入\n");}else{printf("坐标非法,,请重新输入\n");}}}
电脑下棋
电脑下棋的坐标通过rand函数来生成随机数,然后将随机数取模行和列之后分别赋值给局部变量,另数组对应位置位“#”即可实现。
void ComputerMove(char board[ROW][COL], int row, int col)
{printf("电脑下棋\n");int x = 0;int y = 0;while (1){x = rand() % row;y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}}
}
5.判断输赢
当玩家或着电脑输入坐标之后,需要判断是否赢得游戏,若没有,则继续游戏,若已经有横列、纵列以及对角线中的中的其中一个实现三子相连,则获得胜利。因此需要写一个函数来实现判断输赢,该函数主要通过判断行,或者列或者对角线三个元素是否相等且不等于空格来实现,代码如下:
判断行:
int i = 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];}
}
判断列
int j = 0;
for (j = 0; j < col; j++)
{if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' '){return board[1][j];}
}
判断对角线
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][1] && board[1][1] != ' ')
{return board[1][1];
}
若都不满足,则需要判断是否平局,因此需要一个函数来判断棋盘中是否有空,若有返回0,若无返回1,然后利用返回值,通过条件语句来给主函数返回Q,代表平局。
//判断是否有空,有空返回0,没有返回1
int Isfull(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;
}
if (Isfull(board, row, col))
{return 'Q';
}
若以上条件都不满足,则返回C表示继续游戏,整体结果如下。
6.效果展示
选择1后开始游戏,打印初始化棋盘,并提醒玩家输入坐标
当玩家输入坐标后,先判断输赢还是继续游戏,若继续游戏,则电脑开始下棋,若已经有结果,则输出结果。
三、总结
开发这个井字棋游戏,综合运用了 C 语言的数组、循环、条件判断、函数定义等基础知识。在实现过程中,需要注意代码的逻辑顺序和边界条件的处理,例如输入合法性检查、棋盘状态的判断等。虽然这个版本的电脑 AI 只是简单的随机落子,不够智能,但作为初学者的入门项目,已经能够帮助我们加深对 C 语言的理解和应用。希望大家可以在此基础上进行改进和扩展,比如实现更智能的 AI 算法、支持双人对战等,进一步提升自己的编程能力。