文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何使用C语言实现三子棋游戏

2023-06-20 18:27

关注

这篇文章主要介绍“如何使用C语言实现三子棋游戏”,在日常操作中,相信很多人在如何使用C语言实现三子棋游戏问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用C语言实现三子棋游戏”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下

先简单介绍一下我的三子棋小游戏是怎么玩的,就是自己跟电脑pk,只不过电脑没这么智能。自己输入想要下的坐标,电脑随机生成一个坐标,直到赢家产生。在这个过程中我觉得比较难的就是赢家的判定部分。在c语言中随机数的产生也就是调用srand()函数利用时间戳来获取随机值。算了游戏太简单,我想你们也都是冲着代码来的,直接上代码。

代码和实现

为了代码逻辑性更高,没那么繁杂,主要将代码分为三个部分,头文件game.h,和两个c文件,game.c放主程序,body.c放各种函数。

1.game.c

讲解:游戏开始要打印一个界面,然后选择要玩游戏还是退出,如果玩游戏就直接调用Game函数再调用各种花里胡哨的函数来实现游戏。game.c没什么可讲的,都是基本操作,有手就行。

#include "game.h" void menu() { printf("********************\n"); printf("****** 1.play  *****\n"); printf("****** 0.exit  *****\n"); printf("********************\n");}void Game() { char ch; char board[ROW][COL] = { 0 }; InitBoard(board, ROW, COL); ShowBoard(board, ROW, COL); while (1) {  PlayerMove(board, ROW, COL);  ShowBoard(board, ROW, COL);  ch=WhoWin(board, ROW, COL);  if (ch == '*') {   printf("玩家赢!\n");   break;  }  else if (ch == '#') {   printf("电脑赢!\n");   break;  }  else if(ch=='a') {   printf("平局!\n");   break;  }   WindowPlay(board, ROW, COL);  ShowBoard(board, ROW, COL);  ch = WhoWin(board, ROW, COL);  if (ch == '*') {   printf("玩家赢!\n");   break;  }  else if (ch == '#') {   printf("电脑赢!\n");   break;  }  else if(ch=='a') {   printf("平局!\n");   break;  } } }int main() { menu(); srand((unsigned int)time(NULL)); int input = 0; do {  printf("请输入:");  scanf("%d", &input);  switch (input) {  case 1:   Game();   continue;  case 0:   break;  default:   printf("输入不合法,请从新输入\n");   continue;  } } while (input); return 0;}

2.body.c

讲解:body.c里就是各种花里胡哨的函数,一个功能一个函数,不要一个函数搞太多功能,看起来比较繁杂,条理不清晰。这里的棋盘借用二维数组来实现,因为二维数组和一个棋盘的构造类似,用二维数组再合适不过,如果你够牛逼,你来个三维数组的。包含的功能有棋盘初始化,打印棋盘,玩家下,电脑下,最后就是判断输赢。判断输赢也是比较难的一个部分。这里我用了最粗暴的方法,就是分四种情况,行,列,对角线,还有棋盘满了。比较繁琐但是比较实用,也没什么可说的都是比较常用的语句。唯一可说的就是srand()函数获取随机值,srand()功能就是生成随机值,还需要一个种子seed为无符号整型数。可以用time(NULL)时间戳来作为这个种子,用rand()%n来获取你想要的数字。

#include "game.h" //初始化棋盘void InitBoard(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 ShowBoard(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) {   printf("---|---|---\n");  } }} //玩家下void PlayerMove(char board[ROW][COL], int row, int col) { do {  int i;  int j;  printf("请玩家输入:");  scanf("%d%d", &i, &j);  if (i > row && j > col && i <= 0 && j<= 0) {   printf("坐标不合法,请从新输入\n");   continue;  }  else if (board[i-1][j-1] == ' ') {   board[i-1][j-1] = '*';   break;  }  else {   printf("该处已被占请从新输入\n");   continue;  } } while (1);} //电脑下void WindowPlay(char board[ROW][COL], int row, int col) { printf("等待电脑下!\n"); do {  int i = rand() % 3;  int j = rand() % 3;  if (board[i][j] == ' ') {   board[i][j] = '#';   break;  }  else {   continue;  } } while (1);}  //判断输赢char WhoWin(char board[ROW][COL], int row, int col) { //判断行 for (int i = 0; i < row; i++) {  int j = 0;  if (board[i][j] == board[i][j + 1] && board[i][j + 1] == board[i][j + 2] && board[i][j]!=' ') {   if (board[i][j] == '*') {    return board[i][j];   }   else {    return board[i][j];   }  } } //判断列 for (int j = 0; j < col; j++) {  int i = 0;  if (board[i][j] == board[i+1][j] && board[i+1][j] == board[i+2][j] && board[i][j] != ' ') {   if (board[i][j] == '*') {    return board[i][j];   }   else {    return board[i][j];   }  } } //判断对角线 int i = 0; int j = 0; if (board[i][j] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j + 2] && board[i][j] != ' ') {  if (board[i][i] == '*') {   return board[i][j];  }  else{   return board[i][j];  } } if (board[i][j+2] == board[i + 1][j + 1] && board[i + 1][j + 1] == board[i + 2][j] && board[i][j+2] != ' ') {  if (board[i][i] == '*') {   return board[i][j+2];  }  else{   return board[i][j+2];  } } //判断棋盘是否满 int count = 0; //char a=0; for (i = 0; i < row; i++) {  int j = 0;  for (j = 0; j < col; j++) {   if (board[i][j] == ' ') {    count++;   }  } } if (count == 0) {  return 'a'; }}

3.game.h

讲解:这里主要给大家说一下头文件,头文件可以把各个c语言文件联系起来,可以定义一些全局变量,宏,函数声明,引用一些内部库等。一次定义多处使用,其他c文件只要引用这个头文件就赋予了它调用某些函数的权限,调用某些变量,宏的权限。头文件只是声明不占用内存空间,可以不用,但是强烈建议用,因为当一个工程的代码量很大时,没有头文件就相当于没有了头。所以是很重要的。

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <time.h>#include <stdlib.h> #define ROW 3#define COL 3  //初始化棋盘void InitBoard(char board[ROW][COL],int row,int col);//打印棋盘void ShowBoard(char board[ROW][COL],int row,int col);//玩家下void PlayerMove(char board[ROW][COL], int row,int col);//电脑下void WindowPlay(char board[ROW][COL], int row,int col); //判断输赢char WhoWin(char board[ROW][COL],int row,int col);

到此,关于“如何使用C语言实现三子棋游戏”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯