学了c语言这么长时间也没有个让我自己满意的成果,此次编写三子棋小游戏也算是人生中第一个项目了,接下来直接进入项目:
首先是任务的要求:
1、三子棋首先得有个棋盘,随后得有棋子。
2、棋子棋盘都有了当然还得让电脑会下棋子和人进行对弈。
3、最后就是判断输赢啦。
直接进入代码的编辑:
先捋一下整个下棋的过程, 首先棋盘需要初始化为空格,以放置棋子,玩游戏之前需要把棋盘打印你一下吧,打印完成那么下来就是电脑下棋这个函数了,电脑下完肯定得先判断输赢平,赢了则结束此轮游戏,没赢就继续,平局就是退出并返回平局信号,继续则是玩家下,下完在判断是否输赢平,如果赢了,则结束此轮游戏,没赢继续电脑下,平局退出并返回平局信号.......
首先编写头文件,为了以后的方便,先将stdio.h和stdlib.h两个头文件放在新建的头文件中。既然是三子棋那就只有三行和三列,所直接定义标识符ROW和COL都为3,接着就是声明所有要用的函数了,首先得个游戏菜单,控制游戏的开始和退出,其次,从上面总结的下棋的整个过程中可以得出,头文件里面的函数需要有初始化棋盘,打印棋盘、棋子,电脑走,玩家走,判断输赢平。
得出头文件如下:
文件名:sanziqi.h
#ifndef __SANZIQI_H__ //防止被多次利用
#define __SANZIQI_H__
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
//初始化棋盘
void init_board(char arr[ROW][COL], int row, int col);
//打印棋盘
void show_board(char arr[ROW][COL], int row, int col);
//电脑走
void computer_move(char arr[ROW][COL], int row, int col);
//玩家走
void player_move(char arr[ROW][COL], int row, int col);
//判断输赢
char is_win(char arr[ROW][COL], int row, int col);
#endif // !__SANZIQI_H__
写完头文件我们就可直接来完成游戏的主函数了:
进入游戏主函数说明已经进入了游戏,那么,进入游戏第一件事肯定是先初始化一下棋盘喽,先初始化为全是空格字符的数组,然后如果棋盘有空位就调用电脑走的函数(此程序默认都是电脑先走),然后判断输赢,然后如果有空位就玩家走,然后判断输赢,然后判断是否有空位,如果有空位就电脑走,一直循环,中途如果有赢的,直接跳出循环打印通知,结束游戏主函数,如果棋盘下满,则打印平局,结束游戏主函数,流程图如下:
代码如下:
文件名:main.c
void game(char arr[ROW][COL], int row, int col)
{
init_board(arr, row, col);
int ct;
do
{
printf("电脑走动:\n");
computer_move(arr, row, col);
show_board(arr, row, col);
ct = is_win(arr, row, col);
if (ct == 'X')
{
printf("电脑赢!\n");
return;
}
else if(ct == 'O')
{
printf("玩家赢!\n");
return;
}
else if (ct == ' ')
{
printf("平局!\n");
return;
}
player_move(arr, row, col);
show_board(arr, row, col);
ct = is_win(arr, row, col);
if (ct == 'X')
{
printf("电脑赢!\n");
return;
}
else if (ct == 'O')
{
printf("玩家赢!\n");
return;
}
else if (ct == ' ')
{
printf("平局!\n");
return;
}
} while (1);
}
整个项目到现在框架基本就完成了,下面我们将进行各个功能的实现,即函数的实现:
文件名:sanziqi.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"sanziqi.h"
//打印菜单
int menu()
{
int m_choose = 0;
printf("*******************************\n");
printf("**********1、开始游戏**********\n");
printf("**********0、退出**************\n");
printf("*******************************\n");
printf("请选择序号:");
scanf("%d", &m_choose);
return m_choose;
}
//初始化棋盘
void init_board(char arr[ROW][COL], int row, int col)
{
int i;
int j;
for (i = 0; i<row; i++)
{
for (j=0; j<col; j++)
{
arr[i][j] = ' ';
}
}
}
//打印棋盘
void show_board(char arr[ROW][COL], int row, int col)
{
int i;
int j;
printf(" -1---2---3-\n");
printf(" -------------\n");
for (i=0; i<row; i++)
{
printf("%d|",i+1);
for (j = 0; j < col; j++)
{
printf("%2c |", arr[i][j]);
}
printf("\n -------------\n");
}
}
//电脑走动
void computer_move(char arr[ROW][COL], int row, int col)
{
int i;
int j;
do
{
i = rand() % 3;
j = rand() % 3;
if (arr[i][j] == ' ')
{
arr[i][j] = 'X';
break;
}
} while (1);
}
//玩家走动
void player_move(char arr[ROW][COL], int row, int col)
{
int i;
int j;
do
{
printf("请输入你要下的坐标(x y):");
scanf("%d%d", &i, &j);
i--;
j--;
if (arr[i][j] == ' ')
{
arr[i][j] = 'O';
break;
}
else
{
printf("此位置已有棋子!\n");
}
} while (1);
}
//判断输赢:电脑赢则返回X,玩家赢返回O,平局返回空格。
char is_win(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j;
for (i=0; i<row; i++)
{
//行一样
if ((arr[i][0] == arr[i][1]) && (arr[i][1] == arr[i][2]))
{
if (arr[i][0] == 'O')
{
return 'O';
}
else if (arr[i][0] == 'X')
{
return 'X';
}
}
//列一样
if ((arr[0][i] == arr[1][i]) && (arr[1][i] == arr[2][i]) )
{
if (arr[0][i] == 'O')
{
return 'O';
}
else if (arr[0][i] == 'X')
{
return 'X';
}
}
//左上到右下
if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2]))
{
if (arr[0][0] == 'X')
{
return 'X';
}
if (arr[0][0] == 'O')
{
return 'O';
}
}
//右上到左下
if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0]))
{
if (arr[0][2] == 'O')
{
return 'O';
}
if (arr[0][2] == 'X')
{
return 'X';
}
}
}
for (i=0; i<row; i++)
{
for (j=0; j<col; j++)
{
if (arr[i][j] == ' ')
return 'C';
}
}
return ' ';
}
对以上代码进行一些必要的解释:
1、电脑下棋的方式因为技术的限制,我暂时只能让它随机下,即生成随机数,因为电脑下的函数频繁调用,所以我将其随机数的种子在了main函数里,只需种一次即可。
2、判断输赢时,先判断有没有赢的,如果赢了直接跳出并退出,如果没赢然后再判断棋盘是否满,如果没满就继续下,满了就退出并返回平局信号。
3、在下棋的时候必须判断不能下在已有棋子的位子上面。
最后完成函数的最主要部分:主函数
文件名:main.c
#include"sanziqi.h"
#include<time.h>
int main()
{
char arr[ROW][COL];
int choose = 0;
srand((unsigned int)time(NULL));
do
{
choose=menu();
switch (choose)
{
case 1:
{
game(arr, ROW, COL);
break;
}
case 0:
{
printf("游戏已退出!!\n");
break;
}
default:
{
printf("你输错了!\n");
break;
}
}
} while (choose);
return 0;
}
main()函数控制整个游戏的开始与结束
注意:
game()函数是在main.c文件里面的为了分开讲,我将其和main()函数分开写。