学习的时候总会感到无聊,困乏,需要再适当的时间放松一下,但是玩自己做的游戏会更有成就感!这次就自己做一个井字棋来看一看吧。

目录

大致流程

搭建棋盘

二维数组的初始

主函数的运行

玩家下棋

电脑下棋

胜利条件

代码整和:


井字棋,最重要的就是棋盘和电脑自动下棋吧。棋盘是最开始的条件,而电脑自动下棋就是井字棋的精华所在!

大致流程:

void Initgame(char m[row][queue], int Row, int Queue);
void Printgame(char m[row][queue], int Row, int Queue);
void Playergame(char m[row][queue], int Row, int Queue);
void Computergame(char m[row][queue], int Row, int Queue);
int Victory(char m[row][queue], int Row, int Queue);
void game()
{char n;char m[row][queue] = { 0 };Initgame(m, row, queue);Printgame(m, row, queue);while (1){Playergame(m, row, queue);Printgame(m, row, queue);n = Victory(m, row, queue);Computergame(m, row, queue);Printgame(m, row, queue);n = Victory(m, row, queue);if (n != 'N'){break;}}if (n == '*'){printf("玩家获胜\n");}else if (n == '#'){printf("电脑获胜\n");}else{printf("平局\n");}
}

首先我们先来想办法制作,并且打印一个棋盘:
井字棋井字棋,必然是四根直线相互堆叠形成的,电脑没有很大的直线我们就用——、|代替,同时也要保证每个空格内能储存一个字符m。而打印到电脑上的m是一个平面,

所以推荐二维数组来搭建棋盘:代码如下:

//定义棋盘大小
#define row 3
#define queue 3//打印棋盘
void Printgame(char m[row][queue], int Row, int Queue)
{int i;for (i = 0; i < Row; i++){int j = 0;for (j = 0; j < Queue; j++){printf(" %c ", m[i][j]);if (j < Queue - 1)printf("|");}printf("\n");j = 0;for (j = 0; j < Queue; j++){if (i < Row - 1)printf("——");}printf("\n");}
}

棋盘打印完了,就需要给二维数组初始化,并且保证美观,我们就用‘ ’来作为二维数组的初始内容,又因为是二维数组,用两个for循环即可完成!

二维数组的初始

//初始化
void Initgame(char m[row][queue], int Row, int Queue)
{int i = 0;for(i=0;i<Row;i++){int j = 0;for (j = 0; j < Queue; j ++ ){m[i][j] =  ' ' ;    //全部赋值为‘ ’} }
}

最基本的工作完成后,剩下的就是菜单、玩家下棋、电脑下棋、判断胜负的条件了;

现在我们大概拟定一下主函数的运行

//菜单
void mune()
{printf("###############################\n");printf("1,玩一局三子棋       2,退出游戏\n");printf("###############################\n");
}int main()
{int i;do{mune();                                             //输入菜单scanf("%d", &i);           switch (i){case 1: game(); break;                              //进入游戏内容case 2: printf("欢迎下次光临~"); i = 0; break;       //退出游戏default: printf("输入错误\n~");                      //如果输入其他数字就返回菜单}} while (i);return 0;
}

接下来玩家决定不放水,决定自己先出,但是怎么下棋呢?

突破口就在二维数组m[][]上,通过一部分提示和判断所在地址有没有棋来进行的下棋

玩家下棋

//玩家下棋
void Playergame(char m[row][queue], int Row, int Queue)
{int x, y, i = 1;printf("请玩家下棋:\n");while (i){printf("请输入坐标:\n");scanf("%d%d", &x, &y);if (x >= 1 && x <= Row && y >= 1 && y <= Queue){if (m[x - 1][y - 1] == ' ')                    //判断是否为‘ ’{m[x - 1][y - 1] = '*';i = 0;}else{printf("此点您已下过,请重新选择");          //如果不为‘ ’就返回重下}}else{printf("请输入 1<x<%d , 1<y<%d \n", Row, Queue);//下的范围超过棋盘大小}}
}

而电脑下棋就是另一个新的问题,如何让电脑全自动的下棋呢?

这时我们就会用一个时间头文件和rand函数。

电脑下棋

//头文件
#include<time.h>
//根据时间随机点
srand((unsigned int)time(NULL));
//电脑下棋
void Computergame(char m[row][queue], int Row, int Queue)
{int x, y, i = 1;printf("请电脑下棋\n");while (i){x = rand() % Row;y = rand() % Queue;      //保证不会超过棋盘if (m[x][y] == ' '){m[x][y] = '#';i = 0;}}
}

最后就是判断胜利了!

根据井字棋的玩法,相同三个同行同列算胜利,相同三个斜线也算胜利:

我们要做到的就是胜利条件整合起来,具体如下:

//判断胜负
int Victory(char m[row][queue], int Row, int Queue)
{int i, j;for (i = 0; i < Row; i++){if (m[i][0] == m[i][1] && m[i][1] == m[i][2] && m[i][0] != ' ')//横线{return m[i][1];}}for (j = 0; j < Queue; j++){if (m[0][j] == m[1][j] && m[1][j] == m[2][j] && m[0][j] != ' ')//竖线{return m[0][j];}}if (m[2][2] == m[1][1] && m[1][1] == m[0][0] && m[0][0] != ' ')//斜线return m[1][1];if (m[0][2] == m[1][1] && m[1][1] == m[2][0] && m[0][2] != ' ')return m[1][1];return 'N';                                                    //如果都不满足就返回n
}

再次进行整合优化,吧上述的所有代码段整合起来,就是我们的井字棋游戏了!

代码整和:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<time.h>
#include<stdlib.h>
#define row 3
#define queue 3int Flairs(char m[row][queue], int Row, int Queue);
void Initgame(char m[row][queue], int Row, int Queue);
void Printgame(char m[row][queue], int Row, int Queue);
void Playergame(char m[row][queue], int Row, int Queue);
void Computergame(char m[row][queue], int Row, int Queue);
int Victory(char m[row][queue], int Row, int Queue);//判断是否为满
int Flairs(char m[row][queue], int Row, int Queue)
{int i, j;for (i = 0; i < Row; i++){for (j = 0; j < Queue; j++){if (m[i][j] == ' ')return 0;}}return 1;
}//初始化
void Initgame(char m[row][queue], int Row, int Queue)
{int i = 0;for (i = 0; i < Row; i++){int j = 0;for (j = 0; j < Queue; j++){m[i][j] = ' ';}}
}//打印棋盘
void Printgame(char m[row][queue], int Row, int Queue)
{int i;for (i = 0; i < Row; i++){int j = 0;for (j = 0; j < Queue; j++){printf(" %c ", m[i][j]);if (j < Queue - 1)printf("|");}printf("\n");j = 0;for (j = 0; j < Queue; j++){if (i < Row - 1)printf("——");}printf("\n");}
}//玩家下棋
void Playergame(char m[row][queue], int Row, int Queue)
{int x, y, i = 1;printf("请玩家下棋:\n");while (i){printf("请输入坐标:\n");scanf("%d%d", &x, &y);if (x >= 1 && x <= Row && y >= 1 && y <= Queue){if (m[x - 1][y - 1] == ' '){m[x - 1][y - 1] = '*';i = 0;}else{printf("此点您已下过,请重新选择");}}else{printf("请输入 1<x<%d , 1<y<%d \n", Row, Queue);}}
}//电脑下棋
void Computergame(char m[row][queue], int Row, int Queue)
{int x, y, i = 1;printf("请电脑下棋\n");while (i){x = rand() % Row;y = rand() % Queue;if (m[x][y] == ' '){m[x][y] = '#';i = 0;}}
}//判断胜负
int Victory(char m[row][queue], int Row, int Queue)
{int i, j;for (i = 0; i < Row; i++){if (m[i][0] == m[i][1] && m[i][1] == m[i][2] && m[i][0] != ' '){return m[i][1];}}for (j = 0; j < Queue; j++){if (m[0][j] == m[1][j] && m[1][j] == m[2][j] && m[0][j] != ' '){return m[0][j];}}if (m[2][2] == m[1][1] && m[1][1] == m[0][0] && m[0][0] != ' ')return m[1][1];if (m[0][2] == m[1][1] && m[1][1] == m[2][0] && m[0][2] != ' ')return m[1][1];return 'N';
}//菜单
void mune()
{printf("###############################\n");printf("1,玩一局三子棋       2,退出游戏\n");printf("###############################\n");
}//游戏执行
void game()
{char n;char m[row][queue] = { 0 };Initgame(m, row, queue);Printgame(m, row, queue);while (1){Playergame(m, row, queue);Printgame(m, row, queue);n = Victory(m, row, queue);Computergame(m, row, queue);Printgame(m, row, queue);n = Victory(m, row, queue);if (n != 'N'){break;}}if (n == '*'){printf("玩家获胜\n");}else if (n == '#'){printf("电脑获胜\n");}else{printf("平局\n");}
}//测试
void quizz()
{int i;do{mune();scanf("%d", &i);switch (i){case 1: game(); break;case 2: printf("欢迎下次光临~"); i = 0; break;default: printf("输入错误\n~");}} while (i);
}int main()
{srand((unsigned int)time(NULL));quizz();return 0;
}

感谢!

井字棋,一个不错的选择相关推荐

  1. 用c语言编写的打字母游戏,用C语言编写小游戏——“井字棋”

    原标题:用C语言编写小游戏--"井字棋" 作者:Milo Yip 来源:知乎 原文链接:https://zhuanlan.zhihu.com/p/39581573 在 Milo Y ...

  2. python井字棋_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  3. python井字棋游戏人机对战_用Python做一个井字棋小游戏

    井字棋是一个经典的小游戏,在九宫格上玩家轮流画OXO,当每列或每行或是两个对角成一线时便是获胜. 今天就用Python编写一个井字棋小游戏,与电脑对战. 程序执行画面如下图所示: 程序提供了两种人工智 ...

  4. javafx写一个小游戏-井字棋

    学了几天的javafx,感觉非常好用,自己写了一个小游戏,如有不足,希望大佬加以指正,谢谢. 1.先写UI界面 新建一个ui.fxml文件,用于显示ui界面 界面效果如下: 代码如下: <?xm ...

  5. 还在动手画棋盘 ?20分钟带你用Java写一个井字棋!

    还在动手画棋盘 ?20分钟带你用Java写一个井字棋! 文章目录 还在动手画棋盘 ?20分钟带你用Java写一个井字棋! 前言 设计过程 1.创建窗体类MyGameWindow 2.创建窗体的构造器 ...

  6. java 井字棋 人机_一个井字棋tictactoe游戏的java实现 | Soo Smart!

    这是一个井字棋游戏的java实现.摘录于stackoverflow. 游戏规则很简单,只要一方棋子在水平线,垂直线或者对角线任意一条线上排列成功即为获胜. 作者原先的代码存在着一些问题: 代码如下: ...

  7. python井字棋游戏大作业实验报告_Part 1.2 - 实现一个井字棋游戏的gym环境

    上文已经描述了怎么创建和注册一个自定义的gym环境.但是环境类中的4个函数都是空的,本文将描述怎么实现那4个函数,实现一个完整的井字棋游戏的环境. 游戏规则:两个玩家在3x3的棋盘上,一方执X,一方执 ...

  8. 【python教程】使用python做一个井字棋

    大家好,我是帅哥(学习python使我快乐) 今天用python做一个简易の井字棋 需要使用的第三方库: from tkinter import * import tkinter.messagebox ...

  9. 一个n维井字棋的游戏

    前几天在任务中国上接了一个任务,主要完成一个n维井字棋的设计.n维井字棋的概念是从二维井字棋开始的,二维井字棋为3×3的棋盘,而三维的就为3×3×3,四维,五维以此类推,不过四维,五维有点难以想象,呵 ...

最新文章

  1. 赛灵思PLL重配置一PLL配置介绍___S6器件族
  2. P2055 [ZJOI2009]假期的宿舍(二分图匹配)
  3. ghostblog主题_读Ghost博客源码与自定义Ghost博客主题
  4. 快速简易的分解歌词文件
  5. mysql5.6找不到int_为什么在mysql 5.6中,在int字段上自动递增跳过“2147483646”?
  6. Hobo 4: Total War
  7. excel怎么设置自动计算_Excel怎么计算所占百分比?
  8. UE4动画蒙太奇位移
  9. 毕业设计 STM32单片机的空气质量检测系统
  10. 【软件测试】你最常用的web测试-浏览器兼容性测试
  11. ceph (luminous 版) primary affinity 管理
  12. java 包含文件_java 文件夹拷贝(文件夹里包含文件和文件夹) 代码
  13. ffmpeg音乐+图片合成视频
  14. 国科大.高级人工智能.2022期末考试真题回忆版
  15. 2019年最新版嵌入式开发教程大纲免费分享
  16. 1.《小狗钱钱》读书笔记
  17. -反编译 APKTool 逆向助手
  18. (带手机版数据同步)未解之谜新闻网类网站源码 奇闻异事网站织梦模板
  19. 红旗linux如何联wifi,8089B开启Wifi的方法(默认的红旗linux系统)
  20. jmeter_extra_tool v1.1

热门文章

  1. MDaemon数据库配置+排障的艰苦旅程
  2. 采集腾讯QQ国内+国际版的国家及地区库
  3. MAME4droid imame4all 项目编译
  4. 程序员,会选择奋斗在一线城市还是回归故乡发展?
  5. 数据结构-数组与压缩矩阵
  6. 对数组进行排序How to sort an NSMutableArray with custo...
  7. 房地产与建筑行业 -- Ultimus BPM 应用解决方案
  8. Struts2框架基本学习(二)
  9. 【脚本】扇贝单词自动播放
  10. php图片写入带问号,PHP方法参数类型提示带问号(?type)