输出一个小游戏——三子棋
先来看一下怎么玩?
就这样一步一步实现。今天就来分享一下。
总共分三个模块:test_game.c ,game.c ,game.h。
首先分享一下源码
test_game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"void menu()
{printf("**************************\n");printf("****** 1.paly ******\n");printf("****** 0.exit ******\n");printf("**************************\n");
}void game()
{ char board[ROW][COL];char ret;//初始化棋盘init_board(board, ROW, COL);//打印棋盘print_board(board, ROW, COL);while (1){//玩家下棋printf("玩家下棋\n");player_move(board, ROW, COL);print_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}//判断printf("电脑下棋\n");//电脑下棋computer_move(board, ROW, COL);print_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}//再次判断}if (ret == 'Q'){printf("平局\n");}if (ret == '*'){printf("玩家赢了\n");}if (ret == '#'){printf("电脑赢了");}
}void test()
{ srand((unsigned int)time(NULL));int input = 0;do{menu();printf("请输入:>(1/0)\n");scanf("%d", &input);switch (input){case 1:printf("开始游戏\n");game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误,重新输入\n");break;}} while (input);
}int main()
{test();return 0;
}//判断输赢,用ret的返回值来判断。
//ret = '*',玩家赢了
//ret = '#',电脑赢了
//ret = 'C',游戏继续
//ret = 'Q',平局
game.h
#pragma once#define ROW 3
#define COL 3#include<stdio.h>
#include<stdlib.h>
#include<time.h>//声明函数//初始化棋盘
void init_board(char board[ROW][COL], int row, int col);
//打印棋盘
void print_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);
game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"void init_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 print_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++){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("请输入坐标:");while (1){int x = 0;int y = 0;scanf("%d %d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}}else{printf("输入错误,再次输入\n");}}}void computer_move(char board[ROW][COL], int row, int col)
{int x = rand() % 3;int y = rand() % 3;while (1){if (board[x][y] == ' '){board[x][y] = '#';break;}}
}//判断是否满棋
int is_full(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++){if (board[i][j] != ' '){return 0;}}}return 1;
}char is_win(char board[ROW][COL], int row, int col)
{int i = 0;//判断行for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' '){return board[i][0];}}//判断列for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' '){return board[0][i];}}//判断对角线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][0] && board[1][1] != ' '){return board[1][1];}if (is_full(board, ROW, COL) == 1){return 'Q';}return 'C';
}
下面来仔细分析一下,研究一下这个代码怎么解决。
测试模块通过调用游戏模块最终实现游戏的完成。
其中test()为实现游戏的主体;在test_game.c中引用头文件#include"game.h"。
这就是test()函数的主体;用我们学过的do-while循环;可以看到,其中还有menu()菜单,以及整个游戏game()函数的实现。
这是menu菜单的实现。此时可以运行一下,看看效果。
然而game()函数的实现比较复杂,主要从以下几个方面来来实现的。
1.初始化棋盘
2.打印棋盘
3.玩家下棋
4.电脑下棋
5.判断输赢
首先来分析第一个方面.初始化棋盘。把棋盘都初始化为空格。首先在game.h头文件中定义一下行ROW和列COL,这里我们都定义为3,如图,
这是为了以后方便代码的修改。之后再在game.c文件中包含#include"game.h"头文件,这样行ROW和列COL都可以在game.c中使用了。
这就是初始化棋盘的实现。
那么再来介绍第二大方面:打印棋盘,这一步在后面的许多步骤中都有体现。
这就是我们想要的效果。那么怎样实现这个效果呢?一样的道理,把函数放在game.c中,再在game.h中声明一下函数即可。
void print_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++){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");}}
}
这便就是这一个代码块的实现,从行到列的实现棋盘。
打印棋盘的实现已经完成,此时game()函数中已经有两大方面了
下面来实现第三个方面,玩家下棋,在这之前,我们都要思考一个问题,我们都知道,二维数组的行和列都是从下标为0开始的,但是玩家们的思维都是从行和列都为1开始的,所以这个问题我们要考虑一下,应该怎么实现呢?其实也不难,无非就是让输入的坐标减1就是我们二维数组的下标了吗。
void player_move(char board[ROW][COL], int row, int col)
{printf("请输入坐标:");while (1){int x = 0;int y = 0;scanf("%d %d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col){if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}}else{printf("输入错误,再次输入\n");}}}
这里我们用while循环来实现,当条件满足时用break跳出循环即可,不过上述的代码段也有一次判断,当字符不为空格时,才可以在此处下棋。这个模块实现后,我们也需要打印棋盘,这就得用第二个小模块:打印棋盘。
来到这里,我们来实现一下
结果就是这样的。
下面来介绍第四个模块,电脑下棋,这里要用到随机数的生成,rand()函数实现它,这次就不用考虑下标的问题了,因为是电脑。模块代码段如下:
void computer_move(char board[ROW][COL], int row, int col)
{int x = rand() % 3;int y = rand() % 3;while (1){if (board[x][y] == ' '){board[x][y] = '#';break;}}
}
与玩家下棋那一块的实现一样,都需要再次打印棋盘,
不过函数rand()的实现需要调用一次srand()函数,因此我们经常用时间戳来实现,调用一次即可,因此我们放在test()函数中;
这样就可以了。
先来测试一下
电脑也可以自动下棋了。
最后,来实现最后一个模块,判断输赢的实现,用ret的返回值来判断。
ret = '*',玩家赢了
ret = '#',电脑赢了
ret = 'C',游戏继续
ret = 'Q',平局
游戏规则是“三连”即胜出,横着三连,竖着三连,还有两个对角线。代码段如下
//判断是否满棋
int is_full(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++){if (board[i][j] != ' '){return 0;}}}return 1;
}char is_win(char board[ROW][COL], int row, int col)
{int i = 0;//判断行for (i = 0; i < row; i++){if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0] != ' '){return board[i][0];}}//判断列for (i = 0; i < col; i++){if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' '){return board[0][i];}}//判断对角线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][0] && board[1][1] != ' '){return board[1][1];}if (is_full(board, ROW, COL) == 1){return 'Q';}return 'C';
}
到这里,五大方面就基本完成了。
这时,再来补充一下game()函数,
void game()
{ char board[ROW][COL];char ret;//初始化棋盘init_board(board, ROW, COL);//打印棋盘print_board(board, ROW, COL);while (1){//玩家下棋printf("玩家下棋\n");player_move(board, ROW, COL);print_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}//判断printf("电脑下棋\n");//电脑下棋computer_move(board, ROW, COL);print_board(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C'){break;}//再次判断}if (ret == 'Q'){printf("平局\n");}if (ret == '*'){printf("玩家赢了\n");}if (ret == '#'){printf("电脑赢了");}
}
到这里,基本就完成了,值得注意的是,game.h文件中也要声明一下这五大函数。
到这里基本就完成了,我们来玩一次游戏,
好了,游戏到此也就结束了。有错误请提出来。
输出一个小游戏——三子棋相关推荐
- 童年小游戏三子棋(C语言数组实现)
目录 认识游戏 游戏框架 游戏实现 基本构思 棋子 棋盘 下棋 判断输赢 效果展示 全部代码 游戏效果 认识游戏 三子棋是黑白棋的一种.三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉.一条龙.井字棋等 ...
- C语言小游戏——三子棋(井字棋)
文章目录 前言 一.前期准备 二.游戏整体结构及思路 1.程序主体结构: 2.代码解读 3.完整源代码 总结 前言 相信大家小时候都玩过井字棋小游戏,拿石子在地上画或是用笔在纸上画······今天我们 ...
- C语言趣味小游戏——三子棋
全篇无任何废话,本文的解释大多数都在代码段中,所以一定要看代码,边看边学边理解. 这只是初学者入门的一个小游戏,不难懂,没有什么复杂的内容 可以先学习一下比三子棋还简单的猜数字小游戏 C语言趣味小游戏 ...
- 小游戏--三子棋——N子棋(实现)
三子棋大家应该都不陌生吧 三子棋是一种民间传统游戏,又叫九宫棋.圈圈叉叉棋.一条龙.井字棋等. 我们今天来一个c语言三子棋的进阶,n子棋的实现过程 1.我们首先可以创建一个三子棋.c源文件,从main ...
- 简单小游戏------三子棋
目录 前言 一.整体的逻辑 创建菜单 创建棋盘 打印棋盘 玩家下棋 电脑下棋 判断输赢 整合代码 game.c test.c game.h 总结 前言 经典数组游戏三子棋 一.整体的逻辑 1.创建菜单 ...
- 用c语言实现小游戏三子棋
小游戏之三子棋 小游戏之三子棋 三子棋的基本玩法 游戏制作思路 制作步骤 1.菜单 2.初始化棋盘 3.打印棋盘 4.玩家下棋 5.电脑下棋 6.判断胜利 完整代码 小结 三子棋的基本玩 ...
- C语言简易小游戏--三子棋
小时候,在学校和小伙伴除了互相追逐着玩闹玩游戏以外,相信很多小伙伴们也有和朋友在课堂上拿一张纸玩井字棋的美好回忆.(如下图酱紫啦~) 那今天呢,我们就用C语言制作一款简易的井字棋来练习一下对代码的感觉 ...
- 趣味益智小游戏 三子棋+五子棋 优化版(可任意选择棋盘大小)
前言 今天牛牛给大家分享的是c语言实现三子棋和五子棋游戏,初学者可能有些不理解的地方,记得私信提问哦,牛牛会一 一回答的. 目录 前言 一.游戏介绍 二.游戏设计思路 2.1 主函数测试区(test. ...
- c语言小游戏 三子棋,C语言实现简单的三子棋小游戏
学习完数组就能用C语言写出的简单小游戏: 编译器使用的为VS2013 代码分为三个部分 1.头文件 game.h 2.源文件 game.c 用来存放游戏中所有的函数 3.源文件 test.c 用来存放 ...
最新文章
- ZooKeeper集群安装
- 强大的SPGridView
- 【ok】李宏毅机器学习12: 对称矩阵
- 注意System.currentTimeMillis()潜在的性能问题
- 15行代码AC——1019 数字黑洞 (20分) 甲级1069. The Black Hole of Numbers (20)(解题报告)
- Kubernetes NodePort vs Loadbalancer vs Ingress 在生成中如何选择?
- socket编程 -- epoll模型服务端/客户端通信的实现
- WinForm中的ListBox和ComboBox的使用
- Linux命令之sed使用入门概述
- CHIP-seq流程学习笔记(11)-使用GSEA软件进行GSEA分析
- GD32实战14__RTC
- Facebook更名Meta,扎克伯格押注元宇宙
- 企业上云“行稳致远”,新钛云服“服务+产品”模式升级上云、用云新思维 | 爱分析洞见...
- DeepFace: Closing the Gap to Human-Level Performance in Face Verification
- Python读取MEIC文件(.nc格式及.asc格式)
- MaxScript入门指引系列(五)数组和Visual MaxScript editor
- Regionals 2015 Asia - Daejeon acmliveoj7233 - Polynomial
- 地铁中计算机网络专业,计算机网络技术在地铁AFC系统中的应用原稿(全文完整版)...
- ddr5和ddr6的显卡插口区别 ddr5和ddr6差距有多大
- accept()使用