700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > C语言入门游戏---三子棋

C语言入门游戏---三子棋

时间:2022-08-06 17:54:34

相关推荐

C语言入门游戏---三子棋

游戏程序的整体布局

1,test.c---游戏运行的主体

2,game.c---游戏函数实现的主体

3,game.h---游戏函数即一些头文件的声明

游戏游玩主体的逻辑

#include"game.h"int main(){int input = 0;do{//菜单打印menu();printf("请输入");scanf("%d", &input);//逻辑选择switch(input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("非法输入\n");break;}} while (input);return 0;}

这里没有引用<stdio.h>的头文件,该文件被封装到了game.h的文件中,其中的menu()菜单函数与游戏函数game()被封装到game.c文件中

游戏主体的实现

要想实现游戏,首先要有游戏菜单,棋盘,棋子,及玩家与电脑下棋的逻辑,和判断输赢的逻辑

游戏菜单

//菜单函数void menu(){printf("*******************************\n");printf("********** 1.play ***********\n");printf("********** 0.exit ***********\n");printf("*******************************\n");}

初始化棋盘

char board[ROW][COL] = { 0 };//创建棋子int_board(board,ROW,COL);//初始化棋子

我们创建一个数组来表达棋子,在创建一个函数来初始化棋子

//初始化棋盘内的棋子void int_board(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++){board[i][j] = ' ';}}}

我们将二维数组中的每个元素初始化为“空格”,这样在棋盘打印的时候每个位置上显示的就是空

打印棋盘

//棋盘打印逻辑void display_board(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++){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");}}}

当前程序的展示的结果

tips:为了提高代码的健壮性,我们使用了全局变量 ROW 和 COL来进行操作,通过改变这两个全局变量的值就可以操作棋盘的格局,方便了日后的进一步优化改进,提高游戏可操作性。

玩家下棋

实现该程序的实现本质是将二维数组的某坐标改为棋子图案

判断:

1,该坐标是否为合法坐标(在限定的区域内)

2,该坐标是否已经有棋子

//玩家下棋void player_move(char board[ROW][COL], int row, int col){printf("玩家下棋\n");int i = 0, j = 0;while (1){printf("输入棋子行坐标");scanf("%d", &i);printf("输入棋子列坐标");scanf("%d", &j);if (i > 0 && i <= row && j > 0 && j <= col){if (board[i - 1][j - 1] == ' '){board[i - 1][j - 1] = '*';break;}elseprintf("该坐标已有棋子,重新输入\n");}elseprintf("非法坐标,重新输入\n");}}

该程序的运行结果

电脑自动下棋

在实现电脑自动下棋这一功能时,我们需要创建随机数,这就需要调用以下头文件:

<stdlib.h>

<time.h>

和上面一样,我们也将该头文件封装到game.h的头文件中

同时,我们还需要使用:

srand((unsigned int)time(NULL)); 来进行初始化,创建i,j来表达坐标的行和列

i = rand() % row;

j = rand() % col; 来进行创建坐标的随机数

//电脑下棋void computer_move(char board[ROW][COL], int row, int col){int i = 0, j = 0;while (1){i = rand() % row;j = rand() % col;if (board[i][j] == ' '){board[i][j] = 'o';break;}}}

输赢的判断

在我们下棋的过程中,由于规则的特殊性,我们需要在玩家和电脑下的每一步后都对比赛的结果进行判断,确保程序的逻辑正确性。

在这里,我们使用is_win()函数来实现这一功能。

在这一函数中,我们需要实现以下几个逻辑:

要返回四种不同的状态

1,玩家赢 --> 返回'*'

2,电脑赢 --> 返回'o'

3,平局--> 返回'q'

4,游戏继续 --> 返回'c'

首先我们要确立判断函数再整个游戏主体中的位置和作用,逻辑如下:

//游戏主函数void game(){printf("开始游戏\n");char board[ROW][COL] = { 0 };//创建棋子int_board(board,ROW,COL);//初始化棋子char result = 'c';//输赢结果判断srand((unsigned int)time(NULL));//随机数,时间戳while (1){display_board(board, ROW, COL);//打印棋盘player_move(board, ROW, COL);//玩家下棋result = is_win(board, ROW, COL);//判断if (result != 'c'){break;}display_board(board, ROW, COL);//打印下棋后的棋盘printf("\n");computer_move(board, ROW, COL);//电脑下棋result = is_win(board, ROW, COL);//判断if (result != 'c'){break;}}if (result == '*') //返回的是*则玩家赢{printf("玩家赢\n");}else if (result == 'o')//返回的是o电脑赢{printf("电脑赢\n");}else if(result=='q') //返回的是q则平局{printf("平局\n");}display_board(board, ROW, COL); // 游戏结束后最后输出一次棋盘 查看结果 }

is_win函数的实现

判断行判断列判断对角线判断棋盘是否已经放满 -- > 确认游戏是否继续

char is_win(char board[ROW][COL], int row, int col) //判断输赢平局 {int i = 0, j = 0;for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' ') //判断每行的是不为' '返回对应的字符 {return board[i][0];}}for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ') //判断每列 是否不为' ' 是则返回对应字符{return board[0][j];}}if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ')//行列判断完了 判断 交叉 是否为' '{return board[0][0];}else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' '){return board[2][0];}for (i = 0; i < row; i++) //行列交叉 不是相等的 则遍历一边判断是否有' '有则返回c表示游戏继续 没有返回q{for (j = 0; j < col; j++){if (board[i][j] == ' '){return 'c';}}}return 'q';}

游戏源码

test.c

#include"game.h"int main(){int input = 0;do{//菜单打印menu();printf("请输入");scanf("%d", &input);//逻辑选择switch(input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("非法输入\n");break;}} while (input);return 0;}

game.c

#include"game.h"//菜单函数void menu(){printf("*******************************\n");printf("********** 1.play ***********\n");printf("********** 0.exit ***********\n");printf("*******************************\n");}//游戏主函数void game(){printf("开始游戏\n");char board[ROW][COL] = { 0 };//创建棋子int_board(board,ROW,COL);//初始化棋子char result = 'c';//输赢结果判断srand((unsigned int)time(NULL));//随机数,时间戳while (1){display_board(board, ROW, COL);//打印棋盘player_move(board, ROW, COL);//玩家下棋result = is_win(board, ROW, COL);//判断if (result != 'c'){break;}display_board(board, ROW, COL);//打印下棋后的棋盘printf("\n");computer_move(board, ROW, COL);//电脑下棋result = is_win(board, ROW, COL);//判断if (result != 'c'){break;}}if (result == '*') //返回的是*则玩家赢{printf("玩家赢\n");}else if (result == 'o')//返回的是o电脑赢{printf("电脑赢\n");}else if(result=='q') //返回的是q则平局{printf("平局\n");}display_board(board, ROW, COL); // 游戏结束后最后输出一次棋盘 查看结果 }//初始化棋盘内的棋子void int_board(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++){board[i][j] = ' ';}}}//棋盘打印逻辑void display_board(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++){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_move(char board[ROW][COL], int row, int col){printf("玩家下棋\n");int i = 0, j = 0;while (1){printf("输入棋子行坐标");scanf("%d", &i);printf("输入棋子列坐标");scanf("%d", &j);if (i > 0 && i <= row && j > 0 && j <= col){if (board[i - 1][j - 1] == ' '){board[i - 1][j - 1] = '*';break;}elseprintf("该坐标已有棋子,重新输入\n");}elseprintf("非法坐标,重新输入\n");}}//电脑下棋void computer_move(char board[ROW][COL], int row, int col){int i = 0, j = 0;while (1){i = rand() % row;j = rand() % col;if (board[i][j] == ' '){board[i][j] = 'o';break;}}}char is_win(char board[ROW][COL], int row, int col) //判断输赢平局 {int i = 0, j = 0;for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][2] != ' ') //判断每行的是不为' '返回对应的字符 {return board[i][0];}}for (j = 0; j < col; j++){if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ') //判断每列 是否不为' ' 是则返回对应字符{return board[0][j];}}if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[2][2] != ' ')//行列判断完了 判断 交叉 是否为' '{return board[0][0];}else if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[0][2] != ' '){return board[2][0];}for (i = 0; i < row; i++) //行列交叉 不是相等的 则遍历一边判断是否有' '有则返回c表示游戏继续 没有返回q{for (j = 0; j < col; j++){if (board[i][j] == ' '){return 'c';}}}return 'q';}

game.h

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<time.h>#include<stdlib.h>#define ROW 3#define COL 3void menu();void game();void int_board(char board[ROW][COL], int row, int col);//棋盘内棋子的初始化void display_board(char board[ROW][COL], int row, int col);//棋盘的打印逻辑void player_move(char board[ROW][COL], int row, int col);//玩家下棋void computer_move(char board[ROW][COL], int row, int col);//电脑下棋char is_win(char board[ROW][COL], int row, int col);//判断赢家

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。