博客
关于我
C语言学习
阅读量:323 次
发布时间:2019-03-03

本文共 4999 字,大约阅读时间需要 16 分钟。

学习C语言,开发三子棋小游戏

开发三子棋小游戏是学习C语言的绝佳入门项目。这款小游戏不仅能锻炼编程基础,还能激发逻辑思维能力。以下是从头到尾的开发过程和心得体会。

1.1 创建头文件

首先,建立一个头文件game.h,用以声明游戏所需的函数接口。文件内容如下:

#define ROW 3
#define COL 3
#include
#include
#include
void InitBoard(char board[ROW][COL], int row, int col);
void DisplayBoard(char board[ROW][COL], int row, int col);
void PlayerMove(char board[ROW][COL], int row, int col);
void ComputerMove(char board[ROW][COL], int row, int col);
// 定义游戏状态
// 玩家赢 '*',电脑赢 '#’,平局 'Q',游戏继续 'C’
char IsWin(char board[ROW][COL], int row, int col);

1.2 创建C源文件

接下来,编写C源文件game.c,实现上述接口的功能。文件内容如下:

#include "game.h"
#include
#include
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) {
for (j = 0; j < col; j++) {
printf("---");
if (j < col - 1) {
printf("|");
}
}
printf("\n");
}
}
}
void PlayerMove(char board[ROW][COL], int row, int col) {
int x = 0, y = 0;
printf("Player play chess\n");
while (1) {
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;
} else {
printf("The coordinate is occupied!\n");
}
} else {
printf("Coordinate do not match, please re-enter!\n");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col) {
int x = 0, y = 0;
printf("Computer play chess\n");
while (1) {
x = rand() % row;
y = rand() % col;
if (board[x - 1][y - 1] == ' ') {
board[x - 1][y - 1] = '#';
break;
}
}
}
int IsFull(char board[ROW][COL], int row, int col) {
int i = 0, j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (board[i][j] == ' ') {
return 0;
}
}
}
return 1;
}
char IsWin(char board[ROW][COL], int row, int col) {
// 判断横三行
for (int i = 0; i < row; i++) {
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] &&
board[i][0] == board[i][2] && board[i][1] != ' ') {
return board[i][1];
}
}
// 判断竖三列
for (int i = 0; i < col; i++) {
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] &&
board[0][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] == board[2][2] && board[1][1] != ' ') {
return board[1][1];
}
// 判断平局
if (IsFull(board, row, col)) {
return 'Q';
}
return 'C';
}

1.3 测试文件

编写测试文件test.c,用于运行游戏的主程序。文件内容如下:

#include "game.h"
#include
#include
#include
void menu() {
printf("-------------TIC-TAC-TOC GAME--------------\n");
printf("-------1.Play Game------------0.Sign out-------\n");
printf("-------------------------------------------\n");
}
void game() {
char ret = 'C';
char board[ROW][COL] = {0};
InitBoard(board, ROW, COL);
DisplayBoard(board, ROW, COL);
while (1) {
PlayerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C') {
break;
}
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C') {
break;
}
}
if (ret == '*') {
printf("The player won!\n");
} else if (ret == '#') {
printf("Computer won!\n");
} else {
printf("It ends in a draw!\n");
}
}
void test() {
int start = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("Please choose whether to start the game\n");
scanf("%d", &start);
switch (start) {
case 1:
game();
break;
case 0:
printf("----------Sign out game-----------\n");
break;
default:
printf("----------Choose Again-----------\n");
break;
}
} while (start);
}
int main() {
test();
getchar();
getchar();
}

1.4 游戏运行

将以上文件合并编译,运行游戏可直接从终端输入1开始游戏。游戏规则如下:

  • 玩家先输入坐标进行下棋
  • 系统提示是否继续游戏,输入0退出
  • 游戏结束后,系统会提示胜负结果
  • 通过这个项目,我学会了如何从零开始开发一款简单的游戏,同时也加深了对C语言编程的理解。编写代码的过程中,我不断学习了如何管理内存、处理输入输出,以及如何实现简单的逻辑判断。虽然游戏功能简单,但它为后续的学习打下了坚实的基础。

    编程的过程中,我也深刻体会到:一个小小的细节可能导致程序运行异常,代码的结构清晰性至关重要。同时,合理的项目管理和代码复用设计能够极大地提升开发效率。

    加油!继续向着成为一名专业的程序员迈进!

    转载地址:http://opqm.baihongyu.com/

    你可能感兴趣的文章
    MSSQL数据库迁移到Oracle(二)
    查看>>
    MSSQL日期格式转换函数(使用CONVERT)
    查看>>
    MSTP多生成树协议(第二课)
    查看>>
    MSTP是什么?有哪些专有名词?
    查看>>
    Mstsc 远程桌面链接 And 网络映射
    查看>>
    Myeclipse常用快捷键
    查看>>
    MyEclipse更改项目名web发布名字不改问题
    查看>>
    MyEclipse用(JDBC)连接SQL出现的问题~
    查看>>
    mt-datetime-picker type="date" 时间格式 bug
    查看>>
    myeclipse的新建severlet不见解决方法
    查看>>
    MyEclipse设置当前行背景颜色、选中单词前景色、背景色
    查看>>
    Mtab书签导航程序 LinkStore/getIcon SQL注入漏洞复现
    查看>>
    myeclipse配置springmvc教程
    查看>>
    MyEclipse配置SVN
    查看>>
    MTCNN 人脸检测
    查看>>
    MyEcplise中SpringBoot怎样定制启动banner?
    查看>>
    MyPython
    查看>>
    MTD技术介绍
    查看>>
    MySQL
    查看>>
    MySQL
    查看>>