日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

简单井字棋设计

發(fā)布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单井字棋设计 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

?前言:

? ? ? 大家好,歡迎閱讀簡單井字棋設(shè)計(jì),本片適合初學(xué)者閱讀與學(xué)習(xí),所以程序并沒有那麼復(fù)雜。

? ? ? 首先介紹一下井字棋規(guī)則:在3*3的9宮格內(nèi)自己的三個棋子連成一條直線為勝利。


前期準(zhǔn)備:

? ? ? 首先我們需要創(chuàng)建兩個源文件和一個頭文件,如下圖所示

首先我們規(guī)定test.c :

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用于游戲開始時菜單的打印;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?開始游戲和退出游戲的操作,以及循環(huán)游玩游戲的操作;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?游戲主體如何調(diào)用函數(shù);

game.c主要負(fù)責(zé):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 游戲開始菜單的實(shí)現(xiàn);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 數(shù)組的初始化;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 棋盤的打印;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 玩家下棋;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 電腦下棋;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 輸贏的判斷;

game.h主要負(fù)責(zé):

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 行號、列好;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 函數(shù)的聲明;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 庫函數(shù)的包含;


程序的實(shí)現(xiàn):

gitee鏈接:井字棋(csdn版) · 風(fēng)夏/c語言初級學(xué)習(xí) - 碼云 - 開源中國 (gitee.com)

test.c(并不完整)

開始時我們只需要書寫能想到的步驟即可,不需要開始時文件寫的就特別完整,后續(xù)需要時我們在往里面添加。

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void game() {//創(chuàng)建數(shù)組,存放變量char board[ROW][COL] = { 0 };//用于判斷勝利char ret = '0';//初始化數(shù)組內(nèi)容,和打印棋盤init_board(board, ROW, COL);printf_board(board, ROW, COL);//玩家下棋和電腦下棋player_move(board, ROW, COL);ret=is_win(board, ROW, COL);computer_move(board, ROW, COL);ret=is_win(board, ROW, COL); }int main() {//用input來接收變量,判斷是否開始游戲int input = 0;//此處設(shè)置隨機(jī)值,讓電腦隨機(jī)下棋srand((unsigned int)time(NULL));do{printf("請選擇:\n");//打印開始菜單menu();scanf("%d ", &input);switch (input){case 0:printf("已退出游戲!\n");break;case 1:printf("開始游戲\n");game();break;default:printf("輸入錯誤,請重新輸入:\n");break;}}while (input);return 0;}

game.c文件(完整版)

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"//打印菜單的實(shí)現(xiàn) void menu() {printf("******************************************\n");printf("************ 1 . 開始游戲 ************\n");printf("************ 0 . 退出游戲 ************\n");printf("******************************************\n"); }//初始化函數(shù)的實(shí)現(xiàn) void init_board(char board[ROW][COL], int row, int col) {for (int i = 0; i < row; i++){for (int j = 0; j < col; j++)board[i][j] = ' ';} }void printf_board(char board[ROW][COL], int row, int col) {int i = 0;int 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("|");}}//到了最后一行為了保持對稱和美觀只打印了‘|’else{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) {int x = 0;int y = 0;do {do{printf("請輸入坐標(biāo):\n");scanf("%d %d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col)break;elseprintf("輸入坐標(biāo)錯誤,請重新輸入:\n");} while (1);if (board[x - 1][y - 1] == ' '){board[x - 1][y - 1] = '*';break;}else{printf("輸入坐標(biāo)已被占用,請重新輸入:\n");}} while (1);printf_board(board, row, col); }//電腦隨機(jī)下棋 void computer_move(char board[ROW][COL], int row, int col) {int x = 0;int y = 0;do {x = rand() % row;y = rand() % col;if (board[x][y] == ' '){board[x][y] = '#';break;}} while (1);printf_board(board, row, col); }//判斷勝負(fù) //*代表玩家勝 //#代表電腦勝 //Q平局C繼續(xù) 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] != ' ') || (board[0][2] == board[1][1] && board[1][1] == board[2][0]) && board[1][1] != ' ')return board[1][1];//判斷平局或繼續(xù)for (i = 0; i < row; i++){for (int j = 0; j < col; j++)if (board[i][j] == ' ')return 'C';}return 'Q'; }

注釋:is_win的返回值

//*代表玩家勝
//#代表電腦勝
//Q平局C繼續(xù)


這時候可以返回來,完成我們text.c文件(完整版)

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void game() {//創(chuàng)建數(shù)組,存放變量char board[ROW][COL] = { 0 };//用于判斷勝利char ret = '0';//初始化數(shù)組內(nèi)容,和打印棋盤init_board(board, ROW, COL);printf_board(board, ROW, COL);//玩家下棋和電腦下棋do{player_move(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;computer_move(board, ROW, COL);ret = is_win(board, ROW, COL);if (ret != 'C')break;} while (1);//輸出結(jié)果if (ret == '*'){printf("玩家勝\n");}else if(ret=='#'){printf("電腦勝\n");}else{printf("平局\n");} }int main() {//用input來接收變量,判斷是否開始游戲int input = 0;//此處設(shè)置隨機(jī)值,讓電腦隨機(jī)下棋srand((unsigned int)time(NULL));do{//打印開始菜單menu();printf("請選擇:\n");scanf("%d", &input);switch (input){case 0:printf("已退出游戲!\n");break;case 1:printf("開始游戲\n");game();break;default:printf("輸入錯誤,請重新輸入:\n");break;}}while (input);return 0;}

最后我們可以完整一下game.h文件(完整版)

#pragma once//庫函數(shù)的包含 //引用了輸入輸出函數(shù) #include<stdio.h> //引用隨機(jī)變量 #include<stdlib.h> //引用時間戳 #include<time.h>#define ROW 3 #define COL 3//函數(shù)的聲明,要用分號 void init_board(char board[ROW][COL], int row, int col); void printf_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);

總結(jié):

? ? ? 三子棋的邏輯并沒有特別復(fù)雜,非常適合初學(xué)者。初學(xué)者要保持良好的心態(tài),自己動手嘗試寫出來。

? ? ? 首先我們要明白、了解三子棋的最基本思路

? ? ? 然后逐步完成每個文件,并不需要一次性寫的非常完整,到程序需要的時候在往上面補(bǔ)充,也是個不錯的選擇。

? ? ? 最后每完成一個步驟,我們能對他進(jìn)行調(diào)試,以保證正確性,除非是計(jì)算機(jī)大神就當(dāng)我沒說過。



? 完結(jié):

? ? ? ? 希望大家越學(xué)越好哦!!!

? ? ? ? 下一次,我將在此次的基礎(chǔ)上添加智能攔截,智能獲勝功能,敬請期待。。。。。。

? ? ? ??

總結(jié)

以上是生活随笔為你收集整理的简单井字棋设计的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。