前言:呕心沥血(4小时)之作,人类与“AI”(随机数)之间的较量,简洁明了(劣质)的操作画面,简易三子棋你值得拥有(来自一个学习C++18天的新手)这是一款模仿之作.作为萌新的我呢,按照借鉴-分析-自行再编译的流程完成了这款简易三子棋游戏。
设计思路如下:首先我将程序分为三个文件,一个头文件game.h与两个源文件game.c与test.c。其中头文件用于声明自定义的大部分函数,源文件game.c用于定义大部分函数,源文件test.c用于编译游戏主体。
代码如下
源文件test.c 主体
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include "game.h"
menu() {//菜单
printf("****************\n");
printf("*****1.play*****\n");
printf("*****0.退出*****\n");
printf("****************\n");
}
void game(int n) {//游戏的主体
if (n == 1) {
printf("游戏开始\n");
char arr[ROW][COL] = {1};//创建一个3*3的二维数组存储数据
Initialize_board( arr,ROW,COL);//初始化棋盘
printf_board(arr,ROW,COL);//打印棋盘
while (1) {
player_move(arr, ROW, COL);//玩家落子
is_win1(arr, ROW, COL);//每次玩家落子后判断并返回一个符号,决定程序接下来走向(此处自定义即可,例如*代表玩家胜利,a代表继续,b代表平局)
//is_win2同理
if (is_win1(arr, ROW, COL) == '*') {
printf("玩家胜利!!!");
break;
}
else if (is_win1(arr, ROW, COL) == 'b') {
printf("平局。");
break;
}
computer_move(arr, ROW, COL);//电脑落子
is_win2(arr, ROW, COL);
if (is_win2(arr, ROW, COL) == '#') {
printf("电脑胜利!!!");
break;
}
else if (is_win2(arr, ROW, COL) == 'b') {
printf("平局。");
break;
}
}
}
else if (n == 0) {
printf("游戏结束\n");
}
else printf("非法选择,请重新选择:\n");
}
int main() {
int n = 0;
do {
menu();//打印菜单
srand((unsigned int)time(NULL));
scanf("%d", &n);//输入n的作用在于在菜单中选择进入游戏或者退出游戏
game(n);//游戏主体函数
} while (n);
return 0; }
头文件game.h
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3
#include<time.h>
#include<stdlib.h>
void Initialize_board(char arr[][COL],int row,int col );//初始化棋盘
void printf_board(char arr[][COL],int row, int col);//打印棋盘
void player_move(char arr[][COL],int row,int col );//玩家落子
void computer_move(char arr[][COL],int row,int col);//电脑落子
char is_win1(char arr[][COL], int row, int col);//判断玩家胜负
char is_win2(char arr[][COL], int row, int col);//判断电脑胜负
源文件 game.c 大部分自定义函数的定义
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Initialize_board(char arr[][COL], int row, int col) {//初始化棋盘函数,利用for循环将二维数组每一个位置都赋值为空格
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
arr[i][j] = ' ';
}
}
}
void printf_board(char arr[][COL],int row,int col) {//打印棋盘,这里利用for循环不断打印即可
//注意,先正确打印出来再想办法美化
int i = 0;
int j = 0;
for (i = 0; i < ROW ; i++) {
for (j = 0; j < COL ; j++) {
printf(" %c ", arr[i][j]);
if(j<COL-1)
printf("|");
}
printf("\n");
for (j = 0; j < COL ; j++) {
if(i<ROW-1)
printf("---");
if(j<COL-1&&i<ROW-1)
printf("|");
}
printf("\n");
}
}
void player_move(char arr[][COL],int row,int col) {//玩家落子函数
int i = 0;
int j = 0;
int flag = 1;//利用变量flag控制循环的进行,落子再跳出,未落子则直到落子为止
do {
printf("请玩家选择落子点:形如 x y\n");
scanf("%d %d", &i, &j);
if ((0 < i && i < 4) && (0 < j && j < 4)) {//先判断,因为落子点不可超出二维数组范围
if (arr[i-1][j-1]==' ') {//这里利用有空位就打印,避免了判断,算是比较巧妙吧
arr[i - 1][j - 1] = '*';
flag = 0;
printf_board(arr, ROW, COL);
}
else {
printf("此区域已经落子,请重新选择:\n");
}
}
else {
printf("非法输入,请重新选择落子点:\n");
flag = 1;;
}
} while (flag);
}
void computer_move(char arr[][COL], int row, int col) {//电脑落子函数
int flag = 1;
do {
int i = rand()%ROW;//生成随机数,对应的srand在主函数中,每次游戏(并非每次打开程序)仅生成一个
int j = rand()%COL;//生成随机数
if (arr[i][j] == ' ') {
arr[i][j] = '#';
printf_board(arr, ROW, COL);
flag = 0;
}
} while (flag);
}
char is_win1(char arr[][COL], int row, int col) {//判断胜负,游戏主体根据该函数的不同返回值控制游戏的不同走向(玩家胜利/电脑胜利/平局/游戏继续),is_win2同理
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++) {
if (arr[i][0] == arr[i][1] && arr[i][2] == arr[i][1] && arr[i][1]!= ' ')//判断行
{
return '*';
}
if (arr[0][i] == '*' && arr[1][i] == '*' && arr[2][i] == '*')//判断列
{
return '*';
}
}if (arr[0][0] == '*' && arr[1][1] == '*' && arr[2][2] == '*')//判断对角线
{
return '*';
}if (arr[0][2] == '*' && arr[1][1] == '*' && arr[2][0] == '*')//判断对角线
{
return '*';
}
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (arr[i][j] == ' ') {
return 'a';//游戏继续
}
};
}
return 'b';
}
char is_win2(char arr[][COL], int row, int col) {//判断胜负
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++) {
if (arr[i][0] == '#' && arr[i][1] == '#' && arr[i][2] == '#')//判断行
{
return '#';
}
if (arr[0][i] == '#' && arr[1][i] == '#' && arr[2][i] == '#')//判断列
{
return '#';
}
}
if (arr[0][0] == '#' && arr[1][1] == '#' && arr[2][2] == '#')//判断对角线
{
return '#';
}if (arr[0][2] == '#' && arr[1][1] == '#' && arr[2][0] == '#')//判断对角线
{
return '#';
}
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
if (arr[i][j] == ' ') {
return 'a';//游戏继续
}
}
}
return 'b';//平局
}